1. 前言
前面有一篇 文章 使用 Python + Coverage 來(lái)統(tǒng)計(jì)測(cè)試用例的代碼覆蓋率
Jacoco 針對(duì) Java 語(yǔ)言的一款開(kāi)源的覆蓋率工具,可以嵌入到 Maven、Gradle 中,提供多種尺度的覆蓋率計(jì)數(shù)器,比如:類(lèi)覆蓋、行覆蓋、分支覆蓋等
本篇將聊聊服務(wù)端代碼的覆蓋率統(tǒng)計(jì),以 Spring Boot 項(xiàng)目為例,使用 Jacoco + junit 來(lái)統(tǒng)計(jì)服務(wù)端的代碼覆蓋率
2. 準(zhǔn)備
首先使用 IDEA 創(chuàng)建一個(gè) Spring Boot 項(xiàng)目( Maven ),以之前 構(gòu)建 RESTFul API 的項(xiàng)目 代碼為基礎(chǔ)
然后,配置 pom.xml 文件,為當(dāng)前項(xiàng)目新增 jacoco 依賴(lài) JAR 包
<!--pom.xml-->
<!--jacoco依賴(lài)-->
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
</dependency>
jacoco 版本可以參考:
https://www.eclemma.org/jacoco/index.html
接著,配置 Jacoco 插件及相關(guān)的 goal,使用 includes 和 excludes 兩個(gè)關(guān)鍵字設(shè)定包含或排除的類(lèi)路徑
比如:這里只統(tǒng)計(jì) com.xingag.api.service 下面的類(lèi)
<!--pom.xml-->
<!--配置Jacoco插件信息-->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.5</version>
<configuration>
<includes>
<!--只包含com/xingag/api/service/下面的類(lèi)-->
com/xingag/api/service/*
</includes>
</configuration>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>check</id>
<goals>
<goal>check</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
最后,點(diǎn)擊右上角的 Maven 同步,下載依賴(lài)并配置項(xiàng)目
3. 實(shí)戰(zhàn)一下
首先,編寫(xiě)一段簡(jiǎn)單的被測(cè)代碼,根據(jù)考試成績(jī)返回不同的結(jié)果
//ScoreServiceImpl.java
package com.xingag.api.service;
//被測(cè)代碼
public class ScoreServiceImpl {
public String getScoreLevel(int score) {
String result;
if (score > 90) {
result = "優(yōu)秀";
} else if (score < 90 && score >= 75) {
result = "良好";
} else if (score >= 60) {
result = "合格";
} else if (score > 40) {
result = "不合格";
} else if (score >= 0) {
result = "差";
} else {
result = "成績(jī)格式不正確";
}
return result;
}
}
然后,在 test 測(cè)試文件夾內(nèi),編寫(xiě)測(cè)試類(lèi)和單元測(cè)試方法@RunWith(SpringRunner.class) 、@SpringBootTest 用于注解測(cè)試類(lèi),表明當(dāng)前類(lèi)作為一個(gè)測(cè)試類(lèi)處理
//ScoreTests
//測(cè)試類(lèi)
@RunWith(SpringRunner.class)
@SpringBootTest
public class ScoreTests {
...
}
接著,在測(cè)試類(lèi)中以 Junit 的 @Test 注解定義 3 個(gè)單元測(cè)試方法
//ScoreTests.java
//定義測(cè)試方法
//成績(jī)優(yōu)秀
@Test
public void testLevelA() {
Assert.assertEquals(RESULT_LEVEL[0], scoreService.getScoreLevel(95));
}
//成績(jī)良好
@Test
public void testLevelB() {
Assert.assertEquals(RESULT_LEVEL[1], scoreService.getScoreLevel(80));
}
//成績(jī)及格
@Test
public void testLevelC() {
Assert.assertEquals(RESULT_LEVEL[2], scoreService.getScoreLevel(70));
}
最后,在 Terminal 指向項(xiàng)目根目錄,輸入 mvn test jacoco:report 命令生成代碼覆蓋率報(bào)告代碼覆蓋率報(bào)告目錄在:./target/site/jacoco
用瀏覽器打開(kāi)統(tǒng)計(jì)報(bào)告文件夾中的 index.html 文件,可以很直觀的查看單元測(cè)試覆蓋率及對(duì)應(yīng)測(cè)試類(lèi)的具體覆蓋范圍
4. 最后
上面只是通過(guò)一個(gè)簡(jiǎn)單的例子展示了 Jacoco 統(tǒng)計(jì)單元測(cè)試代碼覆蓋率的過(guò)程
實(shí)際項(xiàng)目中,代碼覆蓋率只能為單元測(cè)試提供一個(gè)參考,考慮到開(kāi)發(fā)效率,不能一味地追求高覆蓋率;事實(shí)上,高覆蓋率不一定能保證沒(méi)有缺陷
我已經(jīng)將文中全部源碼上傳到公眾號(hào)后臺(tái),關(guān)注公眾號(hào)「 AirPython 」后回復(fù)「 jacoco 」即可獲得全部源碼
如果你覺(jué)得文章還不錯(cuò),請(qǐng)大家 點(diǎn)贊、分享、留言下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
推薦閱讀
聊聊 Python 代碼覆蓋率工具 - Coverage