? ? ? ? 白盒測試又稱結構測試拘鞋、透明盒測試、邏輯驅動測試或基于代碼的測試斩郎。白盒測試是一種測試用例設計方法,盒子指的是被測試的軟件费尽,白盒指的是盒子是可視的,你清楚盒子內部的東西以及里面是如何運作的。"白盒"法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試布朦。"白盒"法是窮舉路徑測試。在使用這一方案時苟弛,測試者必須檢查程序的內部結構喝滞,從檢查程序的邏輯著手,得出測試數(shù)據(jù)膏秫。
一、白盒測試基本概念
1)白盒測試分類
2)白盒測試方法
二做盅、白盒測試常用工具
代碼分析檢查工具:FindBugs缤削、PMD
覆蓋率工具:jacoco、EMMA
白盒測試工具:junit吹榴、testng
質量管理平臺:SonarQube
編譯工具:Ant亭敢、maven
Mock工具:Jmockit
數(shù)據(jù)庫:mysql
持續(xù)集成工具:Jenkins
代碼管理工具:SVN、git
2.1)覆蓋率工具:jacoco簡介
? ? ? ? JaCoCo是一個開源的覆蓋率工具(官網(wǎng)地址:http://www.eclemma.org/JaCoCo/)图筹,它針對的開發(fā)語言是java帅刀,其使用方法很靈活,可以嵌入到Ant远剩、Maven中扣溺;可以作為Eclipse插件,可以使用其JavaAgent技術監(jiān)控Java程序瓜晤。很多第三方的工具提供了對JaCoCo的集成锥余,如sonar、Jenkins等痢掠。
? ? ? ? JaCoCo包含了多種尺度的覆蓋率計數(shù)器,包含指令級覆蓋(Instructions,C0coverage)驱犹,分支(Branches,C1coverage)嘲恍、圈復雜度(CyclomaticComplexity)、行覆蓋(Lines)雄驹、方法覆蓋(non-abstract methods)佃牛、類覆蓋(classes)等。
我們先來看看jacoco覆蓋率結果展示圖:
2.1.1)jacoco基本概念
行覆蓋率:度量被測程序的每行代碼是否被執(zhí)行医舆,判斷標準行中是否至少有一個指令被執(zhí)行俘侠。
類覆蓋率:度量計算class類文件是否被執(zhí)行。
分支覆蓋率:度量if和switch語句的分支覆蓋情況彬向,計算一個方法里面的總分支數(shù)兼贡,確定執(zhí)行和不執(zhí)行的 分支數(shù)量。
方法覆蓋率:度量被測程序的方法執(zhí)行情況娃胆,是否執(zhí)行取決于方法中是否有至少一個指令被執(zhí)行遍希。
圈復雜度:在(線性)組合中,計算在一個方法里面所有可能路徑的最小數(shù)目里烦,缺失的復雜度同樣表示測 試案例沒有完全覆蓋到這個模塊凿蒜。
2.1.2)jacoco注入方式介紹
說明:
1、 JaCoCo在Byte Code時使用的ASM技術修改字節(jié)碼方法胁黑,可以修改Jar文件废封、class字節(jié)碼文件。
2丧蘸、JaCoCo同時支持on-the-fly和offline的兩種插樁模式漂洋。
3、 On-the-fly模式中力喷, JVM中通過-javaagent參數(shù)指定特定的jar文件啟動Instrumentation的代理程序刽漂,代理程序在通過Class Loader裝載一個class前判斷是否轉換修改class文件,將統(tǒng)計代碼插入class弟孟,測試覆蓋率分析可以在JVM執(zhí)行測試代碼的過程中完成贝咙。
4、offline模式中拂募,在測試前先對文件進行插樁庭猩,然后生成插過樁的class或jar包,測試插過樁 的class和jar包后陈症,會生成動態(tài)覆蓋信息到文件蔼水,最后統(tǒng)一對覆蓋信息進行處理,并生成報告爬凑。
On-the-fly和offline比較:
On-the-fly模式更方便簡單進行代碼覆蓋分析徙缴,無需提前進行字節(jié)碼插樁,無需考慮classpath 的設置。
存在如下情況不適合on-the-fly于样,需要采用offline提前對字節(jié)碼插樁:
(1) 運行環(huán)境不支持java agent疏叨。
(2) 部署環(huán)境不允許設置JVM參數(shù)。
(3) 字節(jié)碼需要被轉換成其他的虛擬機如Android Dalvik VM穿剖。
(4) 動態(tài)修改字節(jié)碼過程中和其他agent沖突蚤蔓。
(5) 無法自定義用戶加載類。
5糊余、jacoco最小支持java5秀又。
2.1.3)jacoco注入示例
2.1.4)jacocoAgent簡介
? ? ? ? jacoco提供jacocoagent.jar,采用On-the-fly模式插樁贬芥,然后jacoco dump內存數(shù)據(jù)到本地吐辙,解析dump數(shù)據(jù),得出代碼覆蓋率蘸劈。
PS:具體配置方式請查看之前文章:《代碼覆蓋率解決方案》一文昏苏,在此不在累述。
地址:http://www.reibang.com/writer#/notebooks/10195615/notes/10727392
2.2)mock工具:jmockit簡介
? ? ? ? JMockit是google code上面的一個java單元測試mock項目威沫,是基于Java中的java.lang.instrument包開發(fā)贤惯,內部使用ASM庫來動態(tài)修改java的字節(jié)碼棒掠,可以Mock公共方法、私有方法烟很、接口等。
2.2.1)Jmockit常用注解
@Mocked:被修飾的對象將會被Mock雾袱,對應的類和實例都會受影響(同一個測試用例中)
@Injectable:僅Mock被修飾的對象
@Capturing:可以mock接口以及其所有的實現(xiàn)類
@Mock:MockUp模式中,指定被Fake的方法
2.2.2)Jmockit常用類
Expectations:期望谜酒,指定的方法必須被調用
StrictExpectations:嚴格的期望妻枕,指定方法必須按照順序調用
NonStrictExpectations:非嚴格的期望,是否調用和順序不作要求
Verifications:驗證屡谐,一般配合NonStrictExpectations來使用
Invocation:工具類,可以獲取調用信息
Delegate:自己指定返回值愕掏,適合那種需要參數(shù)決定返回值的場景,只需指定匿名子類就可以。
MockUp:模擬函數(shù)實現(xiàn)
Deencapsulation:反射工具類
2.2.3)Jmockit使用示例
2.3)代碼質量管理平臺:sonar簡介
? ? ? ? Sonar是一個代碼質量管理平臺剑梳,通過插件機制可以支持20多種開發(fā)語言代碼質量管理與檢測唆貌。通過不同的插件對搜集的結果進行再加工處理,通過量化的方式度量代碼質量的變化垢乙,從而可以方便地對不同規(guī)模和種類的工程進行代碼質量管理锨咙。同時 Sonar 還對大量的持續(xù)集成工具提供了接口支持,可以很方便地在持續(xù)集成中使用 Sonar追逮。
Sonar可以從以下七個維度檢測代碼質量:
不遵循代碼標準
潛在的缺陷
復雜度分析
重復率分析
注釋率分析
單元測試覆蓋率分析
耦合度分析
我們先看看sonar分析展示圖:
2.3.1)Sonar與maven集成配置
? ? ? ? sonar與maven集成酪刀,只需修改maven的settings.xml文件,加入以下內容即可:
2.3.2)Sonar與Ant集成配置
? ? ? ? soanr與Ant集成比較麻煩钮孵,需要在build.xml文件中引用相應的包骂倘,如:jacocoant.jar、sonar-ant-task-2.2.jar等巴席。build.xml部分配置如下:
soanr與Ant集成圖(一)
3)白盒測試執(zhí)行
? ? ? ? 白盒測試執(zhí)行比較簡單历涝,可與jenkins集成,在持續(xù)集成過程中執(zhí)行情妖,也可在本地執(zhí)行睬关。
執(zhí)行方式一:Jenkins構建過程中自動執(zhí)行(jenkins+sonar+Ant/maven+jacoco+Findbugs集成)
執(zhí)行方式二:本地Eclipse編譯過程中自動執(zhí)行(jenkins+sonar+ant/maven+jacoco+Findbugs集成)
4)白盒測試報告
? ? ? ? 白盒測試報告可在sonar平臺查看,比較方便毡证,具體不在累述电爹。