介紹
JaCoCo(Java Code Coverage)是一種分析單元測試覆蓋率的工具,使用它執行單元測試後,可以給出程式碼中哪些部分被單元測試測到,哪些部分沒有沒測到,並且給出整個專案的單元測試覆蓋情況百分比,看上去一目瞭然。
JaCoCo會生成以下指標的度量:
Instructions (C0 Coverage)
- 主要是計算位元組碼檔案的覆蓋率。
Branches (C1 Coverage)
- JaCoCo也計算分支覆蓋所有if和 switch語句。主要是計算分支的。
- 沒有覆蓋:在該行沒有分支機構已執行(紅鑽)
- 部分覆蓋:只有在該行分支機構的一部分已經被執行(黃鑽)
- 全覆蓋:在該行各分支機構已執行(綠鑽)
Cyclomatic Complexity
- 圈複雜度(Cyclomatic Complexity)是一種程式碼複雜度的衡量標準。它可以用來衡量一個模組判定結構的複雜程度,數量上表現為獨立現行路徑條數,也可理解為覆蓋所有的可能情況最少使用的測試用例數。圈複雜度大說明程式程式碼的判斷邏輯複雜,可能質量低且難於測試和維護。程式的可能錯誤和高的圈複雜度有著很大關係。請注意,JaCoCo不考慮異常處理的分支機構try-catch塊也不會增加複雜性。總體和分支正相關。實際上,過去幾年的各種研究已經確定:一個方法的圈複雜度(或 CC)大於 10 的方法存在很大的出錯風險。
關於圈複雜度的理解,可以看以下連結。
Lines
- 主要計算基於覆蓋的實際原始碼行類和原始檔行覆蓋。通常會標識三種狀態。
- 沒有覆蓋:在該行任何指令執行(紅色背景)
- 部分覆蓋:只有在該行的指示的一部分已經被執行(黃色背景)
- 全覆蓋:在該行的所有指令已執行(綠色背景)
Methods
- 每個非抽象方法包含至少一個指令。建構函式和靜態初始化都算作方法。
單元測試
Eclipse 外掛 EclEmma
EclEmma的安裝
1.啟動eclipse,點選Help選單,Install New Software,在彈出的對話方塊中,點選Add
2. 輸入Name,例如EclEmma。輸入Location:update.eclemma.org/
3. 在Work With處選擇剛剛輸入的Location地址
4. 安裝後重新啟動eclipse,如果成功安裝,工具欄上會出現一個新的按鈕
EclEmma的使用
1.編寫單元測試用例。現在支援以下測試:
- Local Java application
- Eclipse/RCP application
- Equinox OSGi framework
- JUnit test
- TestNG test
- JUnit plug-in test
- JUnit RAP test
- SWTBot test
- Scala application
2.以JUnit為例,在測試用例檔案上右鍵,選擇 Coverage As -> JUnit Test
3. 會在測試的檔案中顯示出執行結果:
- 綠色:完整執行
- 紅色:沒執行
- 黃色:部分執行
4.通過點選調出Coverage視窗,它是用來統計程式的覆蓋測試率
5. 點選紅色矩形框的按鈕能將多次測試的覆蓋資料綜合起來進行檢視
6. 在Coverage檢視主區域中點選右鍵,出現的快捷選單中選擇”Export Report…”
7.出現Export介面,選項如下:
- Available sessions:要匯出的session
- Format:選擇報告的型別(HTML/XML/Text/EMMA session)
- Destination:匯出的session 存放的位置
IDEA外掛
IDEA自帶Jacoco單元測試分析工具,操作步驟如下。
1.選擇編輯配置 “Edit Configurations”。
2.新增單元測試型別,選擇被測檔案,此處以TestNG為例,測試所有程式碼(不包含lib)。
3.選擇工具jacoco。
4.以覆蓋率模式執行測試用例。
5.執行完成後自動生成測試報告。
MAVEN
在pom.xml檔案中新增以下外掛後,執行 mvn test 即可在target/site/jacoco資料夾下生成報告。
如果想要跳過失敗的測試用例,請使用 mvn test -Dmaven.test.failure.ignore=true
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.2-SNAPSHOT</version> <executions> <execution> <id>default-prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> <execution> <id>default-report</id> <phase>test</phase> <goals> <goal>report</goal> </goals> </execution> <execution> <id>default-check</id> <goals> <goal>check</goal> </goals> </execution> </executions></plugin>複製程式碼
執行時測試
jacoco支援程式執行中監控執行情況。下面介紹直接執行和tomcat伺服器執行兩種監控方式。
準備
在jacoco官方下載jacoco包,下載連線:www.jacoco.org/jacoco/
下載的包中包括三個jar,此處使用 jacocoagent.jar 和 jacococli.jar
直接執行
1.假如直接執行的是test.jar, 執行以下命令:
java -javaagent:jacoco\jacocoagent.jar=includes=* -jar test.jar
其中下劃線處指明準備中的jar包,後面為引數。
相關引數請參考:www.jacoco.org/jacoco/trun…
2.待程式執行結束後,會在test.jar同級目錄生成jacoco.exec檔案,此檔案為jacoco獲取的執行情況檔案。
3.獲取需要分析的class檔案,假設test.jar中的原始碼生成的檔案位於com資料夾中,將此資料夾放入和jacoco.exec同一資料夾下。
4.執行命令即可生成報告:
java -jar jacoco\jacococli.jar report jacoco.exec --classfiles com --html report
下劃線處為準備中的jar包,report表明生成報告, jacoco.exec為執行監控檔案,–classfiles為生成報告正對的class檔案,–html為報告格式,report為報告資料夾。(此處的class檔案應當和執行中相同)
詳細引數請參考:www.jacoco.org/jacoco/trun…
tomcat執行
tomcat執行與直至執行的方式基本相同,唯一不同的是指明jacocoagent.jar的方式。
在Windows下,在$TOMCAT_HOME/bin/catalina.bat,Linux下,在$TOMCAT_HOME/bin/catalina.sh的前面,增加如下設定:
set "JAVA_OPTS=-javaagent:=jacoco\jacocoagent.jar=includes=*"
如果在引數中未未指明exec檔案的生成路徑,那麼會在$TOMCAT_HOME/bin資料夾下生成,其餘操作與上述相同。