測試覆蓋率一般被用來衡量測試的充分性和完整性,從廣義的角度來說,測試覆蓋率主要分爲兩大類,一類是面向項目的需求覆蓋率,另外一類是更偏向技術的代碼覆蓋率。
html
需求覆蓋率是指測試對需求的覆蓋程度,一般的作法是將每一條分解後的軟件需求和對應的測試創建一對多的映射關係,最終目標是保證測試能夠覆蓋每一個需求,以保證軟件產品的質量。咱們一般採用 ALM,Doors 和 TestLink 等需求管理工具來創建需求和測試的對應關係,並以此計算測試覆蓋率java
代碼覆蓋率是指,至少被執行了一次的條目數佔整個條目數的百分比app
三種代碼覆蓋率指標maven
行覆蓋率又稱爲語句覆蓋率,指已經被執行到的語句佔總可執行語句(不包含相似 C++ 的頭文件聲明、代碼註釋、空行等等)的百分比。這是最經常使用也是要求最低的覆蓋率指標。實際項目中一般會結合斷定覆蓋率或者條件覆蓋率一塊兒使用。ide
斷定覆蓋又稱分支覆蓋,用以度量程序中每個斷定的分支是否都被測試到了,即代碼中每一個判斷的取真分支和取假分支是否各被覆蓋至少各一次。好比,對於 if(a>0 && b>0),就要求覆蓋「a>0 && b>0」爲 TURE 和 FALSE 各一次工具
條件覆蓋是指,斷定中的每一個條件的可能取值至少知足一次,度量斷定中的每一個條件的結果 TRUE 和 FALSE 是否都被測試到了。好比,對於 if(a>0 && b>0),就要求「a>0」取 TRUE 和 FALSE 各一次,同時要求「b>0」取 TRUE 和 FALSE 各一次測試
統計代碼覆蓋率的根本目的是找出潛在的遺漏測試用例,並有針對性的進行補充,同時還能夠識別出代碼中那些因爲需求變動等緣由形成的不可達的廢棄代碼。this
JaCoCo 是一款 Java 代碼的主流開源覆蓋率工具,能夠很方便地嵌入到 Ant、Maven 中,而且和不少主流的持續集成工具以及代碼靜態檢查工具,好比 Jekins 和 Sonar 等,都有很好的集成。spa
JaCoCo 的總體代碼覆蓋率統計報告(target/site/jacoco/index.html )給出了每一個 Java 代碼文件的行覆蓋率以及分支覆蓋率統計,並給出了每一個 Java 代碼文件的行數、方法數和類數等具體信息插件
每一個 Java 文件內部詳細的代碼覆蓋率狀況,綠色的行表示已經被覆蓋,紅色的行表示還沒有被覆蓋,黃色的行表示部分覆蓋;左側綠色菱形塊表示該分支已經被徹底覆蓋、黃色菱形塊表示該分支僅被部分覆蓋。(GCC Coverage、JSCoverage 和 Istanbul 等?)
#引入maven pom文件中#In order to get up and running with JaCoCo, we need to declare this maven plugin in our pom.xml file:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.7.7.201606060606</version> <executions> <execution> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>report</id> <phase>prepare-package</phase> <goals> <goal>report</goal> </goals> </execution> </executions></plugin>#The link provided here-before will always lead you to the latest version of the plugin in the maven central repository.
public boolean isPalindrome(String inputString) { if (inputString.length() == 0) { return true; } else { char firstChar = inputString.charAt(0); char lastChar = inputString.charAt(inputString.length() - 1); String mid = inputString.substring(1, inputString.length() - 1); return (firstChar == lastChar) && isPalindrome(mid); }}
@Testpublic void whenEmptyString_thenAccept() { Palindrome palindromeTester = new Palindrome(); assertTrue(palindromeTester.isPalindrome(""));}
使用JUnit運行測試將自動啓動JaCoCo代理,所以,它將在目標目錄target / jacoco.exec中以二進制格式建立覆蓋報告。
顯然,咱們沒法單手解釋輸出,可是其餘工具和插件能夠–例如Sonar Qube。
好消息是,咱們可使用jacoco:report目標來生成多種格式的可讀代碼覆蓋率報告,例如HTML,CSV和XML。
如今,咱們能夠在target / site / jacoco / index.html頁面上查看示例,以查看生成的報告是什麼樣的:
經過報告中提供的連接– Palindrome.java,咱們能夠深刻了解每一個Java類的詳細視圖
JaCoCo在報告中顯示的38條指令是與普通Java代碼指令相反的字節碼指令。
JaCoCo報告可經過使用菱形,分支顏色和背景色做爲行來幫助您直觀地分析代碼覆蓋率:
紅色菱形表示在測試階段未行使任何分支。
黃色菱形表示該代碼已被部分掩蓋–某些分支還沒有行使。
綠色菱形表示在測試過程當中全部分支均已行使。
相同的顏色代碼適用於背景色,但適用於線條覆蓋率。
JaCoCo主要提供三個重要指標:
行覆蓋率反映了根據測試調用的Java字節代碼指令的數量執行的代碼量。
分支覆蓋率顯示了代碼中已執行分支的百分比-一般與if / else和switch語句相關。
循環複雜度經過線性組合給出覆蓋代碼中全部可能路徑所需的路徑數,從而反映了代碼的複雜度。
舉一個簡單的例子,若是代碼中沒有if或switch語句,則循環複雜度將爲1,由於咱們只須要一條執行路徑便可覆蓋整個代碼。
一般,圈複雜度反映了咱們爲了覆蓋整個代碼而須要實現的測試用例的數量。
參考連接https://www.baeldung.com/jacoco
##PS:今天寶寶作三維照相,第一次看到寶寶,so happy,感受什麼都是值得的。