如果你已經(jīng)了解了精準(zhǔn)測(cè)試在行業(yè)的主流做法,你可以跳過相關(guān)內(nèi)容衣赶。
行業(yè)里對(duì)于精準(zhǔn)測(cè)試的定義
在網(wǎng)上流傳著一些精準(zhǔn)測(cè)試的定義(如果你對(duì)這些定義不感冒愕秫,可直接跳到我個(gè)人的定義):
自網(wǎng)易陳逸青(2020)的定義:
借助一定的技術(shù)手段宣决、通過輔助算法對(duì)傳統(tǒng)軟件測(cè)試過程進(jìn)行可視化、分析及優(yōu)化的過程月弛,使得測(cè)試過程更加可視化、智能科盛、可信和精準(zhǔn)帽衙。 原文:https://www.infoq.cn/article/xuu91crqa4hcjz8uomjs
來自HSBC的測(cè)試咨詢專家齊磊(2021年):
通俗點(diǎn)講:核心基于源代碼變更分析,結(jié)合分析算法贞绵,確定影響范圍厉萝,提升測(cè)試效率。 原文:https://www.infoq.cn/article/2feiv8a5kogaqlbzwosh
來自星云測(cè)試(2022年):
精準(zhǔn)測(cè)試一句話概括就是:測(cè)試用例和代碼之間的追溯榨崩,這是它最本質(zhì)的東西谴垫。精準(zhǔn)測(cè)試的本質(zhì)決定了它抓住了測(cè)試的一個(gè)核心要點(diǎn)。 原文: https://testerhome.com/topics/34557
來自得物技術(shù)(2023年):
精準(zhǔn)測(cè)試是基于源代碼變更分析母蛛,結(jié)合一些分析算法翩剪,從而確定改動(dòng)代碼影響的范圍,設(shè)計(jì)測(cè)試用例進(jìn)行針對(duì)性測(cè)試溯祸,一方面可以提升測(cè)試效率肢专,另一方面精準(zhǔn)測(cè)試還可以將測(cè)試用例與程序代碼之間的邏輯映射關(guān)系建立起來, 而這個(gè)過程則是通過工具去采集測(cè)試過程執(zhí)行的代碼邏輯及測(cè)試數(shù)據(jù)焦辅。這兩個(gè)點(diǎn)也正是精準(zhǔn)測(cè)試的核心:正向追溯和逆向追溯博杖。原文: https://tech.dewu.com/article?id=43
以下是來自網(wǎng)易嚴(yán)選的架構(gòu)圖:
我個(gè)人的定義
在筆者看來,精準(zhǔn)測(cè)試的定義應(yīng)該是這樣的:它是一種能力筷登,能只針對(duì)變更進(jìn)行測(cè)試剃根,而不是每次變更都進(jìn)行全量測(cè)試。注意前方,我指的是“變更”狈醉,而不只是“代碼變更”,也就是說所有類型的變更惠险,包括手動(dòng)變更苗傅。
精準(zhǔn)測(cè)試的思路并不復(fù)雜,分成三個(gè)步驟:
- 找到變更班巩;
- 根據(jù)變更找到相關(guān)聯(lián)的測(cè)試用例渣慕;
- 只執(zhí)行相關(guān)聯(lián)的測(cè)試用例。
其實(shí),把這種方法叫增量測(cè)試(Incremental Testing) 更準(zhǔn)確逊桦,更合適眨猎。畢竟你是針對(duì)增量的代碼變更進(jìn)行測(cè)試。
如果不是針對(duì)增量變更進(jìn)行測(cè)試强经,你也能只執(zhí)行一個(gè)你想測(cè)試的測(cè)試睡陪。難道這樣不算精準(zhǔn)測(cè)試嗎?
國內(nèi)行業(yè)主流的實(shí)現(xiàn)精準(zhǔn)測(cè)試的方法
步驟一:找到代碼變更
有以下幾種方式:
- commit之間進(jìn)行差異對(duì)比匿情;
- 運(yùn)行時(shí)找到兰迫,即進(jìn)行流量回放后,對(duì)比業(yè)務(wù)代碼運(yùn)行與
步驟二:根據(jù)代碼變更找到相關(guān)聯(lián)的測(cè)試用例
要做到“根據(jù)代碼變更找到相關(guān)聯(lián)的測(cè)試用例”码秉,我們就必須知道代碼與測(cè)試用例之間的關(guān)系逮矛。
獲取這個(gè)關(guān)系的做法是在執(zhí)行測(cè)試的同時(shí),做以下事情:
- 將流量記錄下來转砖;
- 將因流量而執(zhí)行地代碼的調(diào)用鏈記錄下來须鼎;
- 將測(cè)試用例的元數(shù)據(jù)與代碼調(diào)用鏈的關(guān)系記錄下來;
這個(gè)過程就完成了對(duì)被調(diào)用代碼與測(cè)試用例之間的映射關(guān)系的建立府蔗。
另晋控,現(xiàn)實(shí)往往存在很多未被測(cè)試用例覆蓋到的代碼,這時(shí)姓赤,通過靜態(tài)代碼分析和測(cè)試覆蓋率計(jì)算技術(shù)結(jié)合赡译,生成未被測(cè)試到的代碼的報(bào)告。
可以看出不铆,通過以上方式“找出代碼與測(cè)試用例之間的關(guān)系”的成本是極高的蝌焚。所以,在這個(gè)領(lǐng)域會(huì)有:引流平臺(tái)誓斥、測(cè)試用例管理平臺(tái)只洒、精準(zhǔn)測(cè)試平臺(tái)等等平臺(tái)。這也給大家一個(gè)感覺劳坑,我們要先有一個(gè)平臺(tái)才能做到精準(zhǔn)測(cè)試毕谴。
目前在網(wǎng)上看到大多還只是針對(duì)Java語言或者C++來實(shí)現(xiàn)精準(zhǔn)測(cè)試,其它的語言目前沒有見到距芬。
步驟三:只執(zhí)行相關(guān)聯(lián)的測(cè)試用例
當(dāng)有了代碼與測(cè)試用例之間的關(guān)系涝开,只執(zhí)行相關(guān)聯(lián)的測(cè)試用例就簡(jiǎn)單很多了。
主流方法的坑
以下是齊磊總結(jié)的精準(zhǔn)測(cè)試存在的問題:
- 基于手工測(cè)試的精準(zhǔn)測(cè)試建立映射關(guān)系繁雜框仔,如果需求改變頻繁舀武,用例維護(hù)以及之間的關(guān)系維護(hù)需要耗費(fèi)大量時(shí)間精力。
- 精準(zhǔn)測(cè)試需要一定的自動(dòng)化測(cè)試的覆蓋离斩,這樣做起來更有意義银舱,例如 api 自動(dòng)化測(cè)試衷旅,如果本身用例過少,與代碼之間關(guān)聯(lián)關(guān)系不多時(shí)纵朋,變更代碼后可能不會(huì)得出什么結(jié)果。
- 最好有對(duì)應(yīng)的用例管理系統(tǒng)茄袖,能夠方便的幫助我們建立與代碼之間的關(guān)系操软。
- 需要投入開發(fā)能力強(qiáng)的 QA 或者測(cè)試開發(fā)建立整套系統(tǒng)環(huán)境,但長(zhǎng)遠(yuǎn)考慮宪祥,將精準(zhǔn)測(cè)試嵌入整個(gè)公司的質(zhì)量平臺(tái)中聂薪,不管對(duì)于新項(xiàng)目還說維護(hù)項(xiàng)目來說都是一種提升。
- 項(xiàng)目生命周期需要較長(zhǎng)蝗羊,短期項(xiàng)目花費(fèi)巨大精力開發(fā)和維護(hù)整套精準(zhǔn)測(cè)試系統(tǒng)得不償失藏澳。短期項(xiàng)目可以利用精準(zhǔn)測(cè)試以 api 測(cè)試覆蓋率作為衡量標(biāo)準(zhǔn)。不去建立繁雜的關(guān)系耀找,只監(jiān)控 UI API 測(cè)試覆蓋率迭代時(shí)的變更來達(dá)到目的翔悠。
但是,個(gè)人認(rèn)為齊磊總結(jié)的內(nèi)容沒有問題野芒,的確都是坑蓄愁。但是那些不是精準(zhǔn)測(cè)試的坑,而是國內(nèi)行業(yè)主流的實(shí)現(xiàn)方式的坑狞悲。直白地說就是喝水時(shí)撮抓,喝水的角度錯(cuò)了。
為什么主流實(shí)現(xiàn)方法從方向上就是錯(cuò)的
為什么我認(rèn)為以上地坑是由實(shí)現(xiàn)方法導(dǎo)致的摇锋?以下是我的論點(diǎn)丹拯,歡迎討論指正:
該方法只局限于單一語言
準(zhǔn)確來說,精準(zhǔn)測(cè)試不應(yīng)該只針對(duì)代碼的變更荸恕,而是所有的變更乖酬。更不應(yīng)該只針對(duì)單一語言的變更,而是可以針對(duì)所有的語言戚炫。
因?yàn)榫珳?zhǔn)測(cè)試的定義本身不局限于某個(gè)語言的代碼變更剑刑,而是對(duì)一個(gè)軟件工程中所有的變更而言。一次SQL的變更双肤,你是否需要精準(zhǔn)的知道要執(zhí)行哪些測(cè)試施掏?一個(gè)前端的CSS代碼的變更,你是否需要精準(zhǔn)的知道要執(zhí)行哪些測(cè)試茅糜?
目前行業(yè)里主流的方法七芭,只是針對(duì)單一語言下的場(chǎng)景而設(shè)計(jì)的。按同樣的思路是無法做到多語言的蔑赘。我說的多語言指提同一工程下的多語言狸驳,不是指相互獨(dú)立的單語言工程预明。
只能在平臺(tái)上做精準(zhǔn)測(cè)試
即,我們首先需要一個(gè)平臺(tái)耙箍,才能做到精準(zhǔn)測(cè)試撰糠。
但我們希望在開發(fā)者本地開發(fā)環(huán)境就可以做到精準(zhǔn)測(cè)試。
最后
文章標(biāo)題并不是說“精準(zhǔn)測(cè)試”本身是一個(gè)錯(cuò)誤辩昆,是想說上述的實(shí)現(xiàn)方法是一個(gè)錯(cuò)誤方法阅酪。
那,什么樣的方向是正確的呢汁针?