JaCoCo(Java Code Coverage)是一个Java代码覆盖率工具,用于分析单元测试或集成测试对代码的覆盖情况。它通过java agent 技术统计测试过程中执行的代码行、分支、方法等,帮助开发者评估测试的有效性并发现未被覆盖的代码区域。它一般被用来做检查单元测试的代码覆盖率,除此之外,在实践中我还总结出了两种高阶用法。
已覆盖的行数 / 总行数
if
、switch
)的分支是否都被覆盖。已覆盖的分支数 / 总分支数
if (a && b)
会产生 4 种分支组合(TT, TF, FT, FF),若只覆盖了 TT 和 TF,则分支覆盖率为 50%。已覆盖的方法数 / 总方法数
已覆盖的类数 / 总类数
已覆盖的指令数 / 总指令数
有两种调用jacoco的方式:
二进制包下载地址:https://www.eclemma.org/jacoco/index.html
它里采用最新版本的, 0.8.12。
解压二进制包,找到 lib/jacocoagent.jar。
通过反编译jacocoagent.jar中的类文件,我们发现它是使用jdk5编译的,这个保证它可以支持 jdk5及以上
。
经过测试,jacoco 0.8.12在 jdk8和jdk17这两个LTS版本下可以正常运行。
注意事项:jacoco为了保证兼容性,使用的是jdk5编译,这导致它在解析中文路径时会出错,要知道jdk直到jdk8才解决了中文路径问题。因此,不要在中文路径下使用jacoco,jacoco参数中也不要出现中文路径。
org.jacoco
jacoco-maven-plugin
0.8.12
default-prepare-agent
prepare-agent
default-report
test
report
上面的配置有两个关键点,
执行: mvn clean test
, 可以在target下看到生成了jacoco.exec,以及 /site/jacoco目录。如下图所示:
用浏览器打开 /site/jacoco/index.html,可以看到详细的测试报告,如下图所示:
测试团队使用的是黑盒测试,测试完成之后,不知道哪些代码有被覆盖到(执行到),哪些没有被覆盖到(执行到),可能会出现遗漏的情况。
通过在java程序启动时,加入jacoco-agent,可以采集测试期间被【测试人员】执行到的代码。通过分析【代码覆盖数据文件】 jacoco.exec,可以查看到哪些代码有被执行,哪些代码没有被执行。
java -javaagent:jacocoagent.jar -jar app.jar
构建一个最简的springboot web应用,暴露两个接口;
http://localhost:8080/test1
http://localhost:8080/test2
编译程序,然后使用 -javaagent:jacocoagent.jar 参数来启动程序。
在程序运行起来之后,访问以下url:
http://localhost:8080/test2
关闭java应用,可以看到目录下生成了一个名为jacoco.exec的文件。
在IDEA
中加载这个文件。 点击:菜单 Run > Show Coverage Data
。
点击 + 号,选择之前复制过来的 .exec文件,然后点击 Show selected。
可以看到 TestController下共有3个方法,但只有两个被覆盖到。绿色表示有被执行,红色表示没有被执行。
部门有许多5年+的项目,这些项目在经历组织架构变更、功能变更之后,很多代码都没有用了。 在项目中大家都知道有很多代码没用,但不确定是哪些,不敢删,结果无用的代码越聚越多,严重影响开发效率。新人加入项目,要在一堆无用的代码中找到有用的代码。
java -javaagent:jacocoagent.jar -jar app.jar
参与评论
手机查看
返回顶部