Spring Boot 接口测试获取代码测试覆盖率-(适用于PostMan/Swagger等接口测试的代码覆盖率)
工具:Spring Boot+maven+Jacoco+Ant
项目为现在主流的前后端分离架构,后端代码开发完后需要进行本地自测,尤其是在业务比较复杂的系统中,覆盖率要求比较高。所以为了提高测试代码覆盖率,使用一种工具来获取代码的执行情况,此次采用Jacoco进行采集,方便开发人员发现未执行过的代码,提高测试效率。
环境搭建主要在Windows下进行
配置步骤
- JaCoco安装 https://www.jacoco.org/jacoco/
- Ant 安装 https://ant.apache.org/bindownload.cgi
- Spring Boot JVM启动参数配置
- build.xml文件配置
- 生成报表
1、JaCoco安装
选择一个版本下载 并解压缩到本地目录即安装成功
2、Ant安装
https://ant.apache.org/bindownload.cgi
- 下载后解压缩
- 配置环境变量
ANT_HOME=D:\soft\apache-ant-1.9.15
PATH 添加 %ANT_HOME%/bin
cmd输入 ant -version 展示版本号即安装成功
3、Spring Boot JVM启动参数配置
1 项目结构
2 编写测试service
@Service
public class UserService {
public User findName(String id) {
if ("1".equals(id)) {
return new User("zholiu", "man", "21");
}
if ("2".equals(id)) {
return new User("zhangsan", "woman", "22");
}
if ("3".equals(id)) {
return new User("lsi", "man", "23");
}
if ("4".equals(id)) {
return new User("wangw", "man", "24");
}
return null;
}
}
3 controller
@RestController
@RequestMapping("/test")
public class testController {
@Autowired
private UserService userService;
@GetMapping("/getName/{id}")
public User getName(@PathVariable String id) {
return userService.findName(id);
}
}
4 启用参数
-javaagent:D:\soft\jacoco-0.8.5\lib\jacocoagent.jar=includes=org.example.*,output=tcpserver,port=8125,address=127.0.0.1
build.xml文件配置
新建build.xml 注:这个文件随便放在那里
<?xml version="1.0" encoding="UTF-8"?>
<project name="JaCoCo" default="run" xmlns:jacoco="antlib:org.jacoco.ant">
<!--Jacoco的安装路径-->
<property name="jacocoAntPath" value="D:\soft\jacoco-0.8.5\lib\jacocoant.jar"/>
<!--最终生成.exec文件的路径,Jacoco就是根据这个文件生成最终的报告的-->
<property name="jacocoExecPath" value="D:\work\test\jacocoExec"/>
<!--生成覆盖率报告的路径-->
<property name="jacocoReportPath" value="D:\work\test\report"/>
<!--远程tomcat服务的ip地址 -->
<property name="server_ip" value="localhost"/>
<!--前面配置的远程tomcat服务打开的端口,要跟上面配置的一样-->
<property name="server_port" value="8125"/>
<!--源代码路径-->
<property name="srcPath" value="D:\work\jacocoDemo\serviceB\src\main\java"/>
<!--service.class文件路径-->
<property name="classesPath" value="D:\work\jacocoDemo\serviceB\target\classes"/>
<!--让ant知道去哪儿找Jacoco-->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${jacocoAntPath}"/>
</taskdef>
<target name="run">
<echo message="start..."/>
<echo message="dump..."/>
<antcall target="dump"/>
<echo message="merge..."/>
<antcall target="merge"/>
<echo message="report..."/>
<antcall target="report"/>
<echo message="end..."/>
</target>
<!--dump任务:
根据前面配置的ip地址,和端口号,访问目标tomcat服务,并生成.exec文件。-->
<target name="dump">
<jacoco:dump address="${server_ip}" reset="true" destfile="${jacocoExecPath}/study_jacoco.exec" port="${server_port}" append="false"/>
</target>
<target name="merge">
<jacoco:merge destfile="${jacocoExecPath}/merged.exec">
<fileset dir="${jacocoExecPath}" includes="*.exec"/>
</jacoco:merge>
</target>
<!--jacoco任务:
根据前面配置的源代码路径和.class文件路径,
根据dump后,生成的.exec文件,生成最终的html覆盖率报告。-->
<target name="report">
<jacoco:report>
<executiondata>
<file file="${jacocoExecPath}/merged.exec"/>
</executiondata>
<structure name="JaCoCo Report">
<group name="serviceB">
<sourcefiles encoding="UTF-8">
<fileset dir="${srcPath}"/>
</sourcefiles>
<classfiles>
<fileset dir="${classesPath}/org/example"/>
</classfiles>
</group>
</structure>
<html destdir="${jacocoReportPath}" encoding="utf-8"/>
<csv destfile="${jacocoReportPath}/report.csv"/>
<xml destfile="${jacocoReportPath}/report.xml"/>
</jacoco:report>
</target>
</project>
生成报表
在build.xml所在目录执行 ant -f build.xml 命令
一定要先启动spring boot服务再执行此命令
查看报表结果
打开 D:\work\test\report\index.html,可以看到我调用UserService的情况,红色的为从未执行过的代码,
此时调用 localhost:9001/test/getName/{id} 接口传入参数2再次查看结果发现代码已经标绿
到此结束我们的jacoco就安装完成了