軟件測(cè)試 | 白盒測(cè)試方法
簡(jiǎn)介
白盒測(cè)試又稱結(jié)構(gòu)測(cè)試、透明盒測(cè)試、邏輯驅(qū)動(dòng)測(cè)試或基于代碼的測(cè)試。白盒測(cè)試是一種測(cè)試用例設(shè)計(jì)方法,盒子指的是被測(cè)試的軟件,白盒指的是盒子是可視的,即清楚盒子內(nèi)部的東西以及里面是如何運(yùn)作的。"白盒"法全面了解程序內(nèi)部邏輯結(jié)構(gòu)、對(duì)所有邏輯路徑進(jìn)行測(cè)試。"白盒"法是窮舉路徑測(cè)試。在使用這一方案時(shí),測(cè)試者必須檢查程序的內(nèi)部結(jié)構(gòu),從檢查程序的邏輯著手,得出測(cè)試數(shù)據(jù)。
白盒測(cè)試通過(guò)檢查軟件內(nèi)部的邏輯結(jié)構(gòu),對(duì)軟件中的邏輯路徑進(jìn)行覆蓋測(cè)試。在程序不同地方設(shè)立檢查點(diǎn),檢查程序的狀態(tài),以確定實(shí)際運(yùn)行狀態(tài)與預(yù)期狀態(tài)是否一致。
1.白盒測(cè)試的度量
根據(jù)待測(cè)產(chǎn)品的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)來(lái)設(shè)計(jì)測(cè)試用例。白盒測(cè)試的執(zhí)行手段是可以涵蓋單元測(cè)試、集成測(cè)試。一般使用代碼覆蓋率作為白盒測(cè)試的主要度量指標(biāo)。
2.代碼覆蓋率常見(jiàn)概念
語(yǔ)句覆蓋:每行代碼都要覆蓋至少一次(最基礎(chǔ),不能保證完整度)
判定覆蓋:判定表達(dá)式的真假至少覆蓋一次
判定/條件覆蓋:判定覆蓋與條件覆蓋都必須覆蓋
條件組合覆蓋:判定表達(dá)式中的所有條件組合都需要覆蓋
分支覆蓋:控制流中的每條邊都要被覆蓋一次
路徑覆蓋:所有的路徑都要盡量覆蓋
指令覆蓋:一行代碼會(huì)被編譯為多條指令,盡可能的覆蓋所有指令
方法覆蓋:每個(gè)方法至少要被覆蓋一次
類覆蓋:每個(gè)類至少被覆蓋一次
3.覆蓋率統(tǒng)計(jì)的工具
EMMA:一個(gè)面向 Java 代碼的測(cè)試覆蓋率收集工具。在測(cè)試過(guò)程中,使用 EMMA 能使收集和報(bào)告測(cè)試覆蓋率的過(guò)程更加靈活、簡(jiǎn)單。EMMA 是一個(gè)開(kāi)源、面向 Java 程序測(cè)試覆蓋率收集和報(bào)告工具。它通過(guò)對(duì)編譯后的 Java 字節(jié)碼文件進(jìn)行插裝,在測(cè)試執(zhí)行過(guò)程中收集覆蓋率信息,并通過(guò)支持多種報(bào)表格式對(duì)覆蓋率結(jié)果進(jìn)行展示。
Cobertura:是一款優(yōu)秀的開(kāi)源測(cè)試覆蓋率統(tǒng)計(jì)工具,它與單元測(cè)試代碼結(jié)合,標(biāo)記并分析在測(cè)試包運(yùn)行時(shí)執(zhí)行了哪些代碼和沒(méi)有執(zhí)行哪些代碼以及所經(jīng)過(guò)的條件分支,來(lái)測(cè)量測(cè)試覆蓋率。除了找出未測(cè)試到的代碼并發(fā)現(xiàn) bug 外,Cobertura 還可以通過(guò)標(biāo)記無(wú)用的、執(zhí)行不到的代碼來(lái)優(yōu)化代碼,最終生成一份美觀詳盡的 HTML 覆蓋率檢測(cè)報(bào)告。
Jacoco:是一個(gè)開(kāi)源的覆蓋率工具,針對(duì)java語(yǔ)言。是現(xiàn)在最流行的java覆蓋率統(tǒng)計(jì)工具。
4.流程覆蓋
流程覆蓋用路徑覆蓋率表達(dá),是利用代碼執(zhí)行流代表流程。執(zhí)行時(shí)需要對(duì)流程進(jìn)行裁剪獲得一個(gè)適合業(yè)務(wù)的小規(guī)模的業(yè)務(wù)子集。
流程覆蓋率 = 測(cè)試經(jīng)過(guò)的路徑 / 業(yè)務(wù)子集路徑
5.精準(zhǔn)化測(cè)試
精準(zhǔn)化測(cè)試是一套計(jì)算機(jī)測(cè)試輔助分析系統(tǒng)。精準(zhǔn)化測(cè)試的核心組件包含的軟件測(cè)試示波器、用例和代碼的雙向追溯、智能回歸測(cè)試用例選取、覆蓋率分析、缺陷定位、測(cè)試用例聚類分析、測(cè)試用例自動(dòng)生成系統(tǒng),這些功能完整的構(gòu)成了精準(zhǔn)化測(cè)試技術(shù)體系。
精準(zhǔn)化測(cè)試強(qiáng)調(diào)代碼調(diào)用鏈與黑盒測(cè)試用例之間的關(guān)聯(lián)??梢愿鶕?jù)代碼變更自動(dòng)分析影響范圍。比如說(shuō)研發(fā)修改了 1 行代碼,功能用例有 1000條,其實(shí)很多用例和這1行代碼是沒(méi)有關(guān)系的。精準(zhǔn)化測(cè)試可以判斷出有哪些測(cè)試用例和改動(dòng)的這 1 行代碼有關(guān)系。比如說(shuō)這 1000 條用例當(dāng)中,只有 20 條和修改的代碼有關(guān)系。那么測(cè)試的范圍可以大大縮減,測(cè)試效率就會(huì)提高。
精準(zhǔn)化測(cè)試還有一個(gè)很有價(jià)值的作用,就是在黑盒測(cè)試過(guò)程中,借助代碼流程覆蓋率指導(dǎo)測(cè)試活動(dòng)。比如在黑盒測(cè)試結(jié)束之后,觀察代碼的覆蓋情況,發(fā)現(xiàn)有一些路徑?jīng)]有被覆蓋到,這個(gè)時(shí)候就需要繼續(xù)補(bǔ)充用例,一直到代碼流程可以很全面的覆蓋。這是系統(tǒng)測(cè)試與底層白盒測(cè)試相結(jié)合的一個(gè)方法。
還可以用線上數(shù)據(jù)推導(dǎo)有效的測(cè)試用例。比如測(cè)試一個(gè)系統(tǒng),這個(gè)系統(tǒng)是有大量歷史數(shù)據(jù)的。這時(shí)就可以提取其中一段時(shí)間的數(shù)據(jù),使用這些數(shù)據(jù)繼續(xù)測(cè)試這個(gè)系統(tǒng)。測(cè)試完成后統(tǒng)計(jì)這些測(cè)試數(shù)據(jù)中哪些數(shù)據(jù)對(duì)于測(cè)試覆蓋率的增加是有幫助的??梢允褂么髷?shù)據(jù)的方法,自動(dòng)提取出對(duì)于測(cè)試覆蓋率有增益效果的數(shù)據(jù)。這種方法可以看出哪些測(cè)試數(shù)據(jù)覆蓋的代碼是相同的。這些測(cè)試數(shù)據(jù)其實(shí)就屬于同一個(gè)集合,在這種集合中,只取一個(gè)測(cè)試數(shù)據(jù)就可以。利用線上數(shù)據(jù)反推有效測(cè)試用例也是精準(zhǔn)化測(cè)試的重要作用。
由于精準(zhǔn)化測(cè)試需要對(duì)底層白盒測(cè)試相當(dāng)了解,對(duì)于測(cè)試人員要求比較高,所以現(xiàn)在實(shí)現(xiàn)起來(lái)有一定的難度。目前行業(yè)中還沒(méi)有開(kāi)源的精準(zhǔn)化測(cè)試的工具?,F(xiàn)階段只能通過(guò) Jacoco 等覆蓋率統(tǒng)計(jì)的工具,自己去實(shí)現(xiàn)精準(zhǔn)化測(cè)試平臺(tái)。