介紹
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文件夾下生成,其余操作與上述相同。