原本一直以为代码覆盖率只能单测能搞,后来听了 MTSC 大会的一个分享,发现这东西 E2E 测试也是可以搞,而且这东西搞好来想想对精准测试帮助非常大。
于是花了点时间搞了个 demo,并写了这个简单的笔记。
该笔记不涉及太多理论,基本讲如何通过 jacoco 做到 E2E 代码覆盖率统计实操。
# -javaagent: 的后面跟jacoco的安装路径
# includes= 选项,选择你要覆盖率的服务,例如com.baidu.*
# port= 选项,选择你要打开的端口
# address= 选项,tomcat服务所在机器的ip地址(如果想在跟tomcat服务同一台机器上执行ant任务的话,需要改为127.0.0.1)
set JAVA_OPTS="-javaagent:%CATALINA_BASE%\lib\jacocoagent.jar=includes=*,output=tcpserver,port=6300,address=127.0.0.1"
1.打包你的 java 工程项目到 Tomcat 下的 \webapps 目录下,并启动 Tomcat.
我的工程是 github 上人家分享的一个 Spring MVC 项目:
https://github.com/githubofrico/RestSpringMVCDemo
下载后配置好数据库,直接通过 maven 的 package 命令打成 war 包
2.启动服务
3.访问项目提供的 API 进行测试:
如 post 请求的:http://localhost:8080/RestSpringMVCDemo/tokens
get 请求的:http://localhost:8080/RestSpringMVCDemo/users/user/1
<?xml version="1.0" encoding="UTF-8"?>
<project name="plate_id_sample_service" xmlns:jacoco="antlib:org.jacoco.ant">
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="C:\app\jacoco-0.8.1\lib\jacocoant.jar"/>
</taskdef>
<target name="dump">
<!-- address和port和catalina.bat设置保持一致,destfile设置jacoco.exec保存地址 -->
<jacoco:dump address="127.0.0.1" reset="true" port="6300" destfile="C:\CodeCoverage\jacoco\jacoco.exec"/>
</target>
<target name="report">
<jacoco:report>
<executiondata>
<file file="C:\CodeCoverage\jacoco\jacoco.exec"/>
</executiondata>
<structure name="Example Project">
<!-- 可以按软件功能模块设置多个group,方便在report中查看 -->
<group name="SpringMVC">
<classfiles>
<!--.class文件路径,可以放在客户端-->
<fileset dir="C:\workspace\IdeaProjects\RestSpringMVCDemo\target\classes"/>
</classfiles>
<sourcefiles encoding="utf-8">
<!--源代码路径,可以放在客户端-->
<fileset dir="C:\workspace\IdeaProjects\RestSpringMVCDemo\src\main\java" />
</sourcefiles>
</group>
</structure>
<!-- report文件保存地址 -->
<html destdir="C:\CodeCoverage\jacoco\report"/>
</jacoco:report>
</target>
</project>
执行 ant 命令
3.1 ant dump
生成 jacoco.exec 文件
3.2 ant report
生成 report 文件 (如果通过 Jenkins 插件这步骤可免)
查看生成的覆盖率报告
生成报告地址是 build.xml 中配置的。 红色表示未测试未覆盖到的代码,绿色表示测试已经覆盖到代码。
测试覆盖率,一种讲测试覆盖了多少需求点,还一种就是测试覆盖了多少行代码,多少个方法,多少个分支等。
Demo 中可以看到 java 语言完全可以通过 jacoco 实现黑盒的代码覆盖率统计,如果把这再跟 jenkins 集成,那这对精准测试是非常有帮助的。根据当前覆盖情况去针对性设计 case,进行针对性测试。
当然也需要注意一点就算代码覆盖率 100% 也不能保证程序是 OK 的。