jacoco统计覆盖率

发布时间 2023-05-24 22:46:51作者: 应晚星

前言:

本来想快速搞定覆盖率这个的。随便搜了搜博客,想走捷径。

最终发现想弄懂,还是得看官网,才能把东西弄透。

(唉,读英文文档,总是会有点难度的啊。。。选中文博客,真的和玩狼人杀一样。。搜索完挨个试一试。。。

另外中文博客很少有把官方文档详细翻译,或者把东西说透彻的,也许有但不好搜得到。。。所以一个东西看了博客经常还是能跑就行,各种配置都不甚了解)

对于maven 插件。。。需要知道maven 构建的生命周期, 每个插件的 goal,   每个goal 所默认绑定的maven phase。  这个是深入了解所必须的。

 

跳坑经历(大概回忆一下):

最开始参考的大概是  https://www.jianshu.com/p/16e205b1d0d0

按博客里说的,往pom 里加了  jacoco-maven-plugin  , goals 有两个:prepare-agent  和 report

以为就OK了。。结果,mvn clean test 报错, jacoco没有生成执行文件exec:

Skipping JaCoCo execution due to missing execution data file.

后面找了一圈参考这个博客,解决了。

https://blog.csdn.net/qq_34770694/article/details/123008841

大致意思就是,Surefire 配置破坏 JaCoCo 代理。  (argLine 默认会被surefire 覆盖了,所以jacoco要单独指定参数名)

然后,加入 maven-surefire-plugin   同时 在配置里加上了 <argLine>-Xmx256M ${jacocoArgLine}</argLine>
                    

最后这两个插件的整体配置,大致如下:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <!--    <version>0.8.3</version>  -->
    <version>0.6.5.201403032054</version>
    <configuration>
        <includes>
            <include>com/**/*</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <id>pre-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <propertyName>jacocoArgLine</propertyName>
            </configuration>
        </execution>
        <execution>
            <id>post-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
            <configuration>
                <dataFile>target/jacoco.exec</dataFile>
                <outputDirectory>target/jacoco-ut</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-Xmx256M ${jacocoArgLine}</argLine>
        <skip>false</skip>
        <testFailureIgnore>false</testFailureIgnore>
        <includes></includes>
        <excludes>
            <!-- 由于测试controller类需要启动auth应用进行登录请求,故剔除 -->
            <exclude>**/controller/*ControllerTest.java</exclude>
        </excludes>
    </configuration>
</plugin>

 

主要的要点,就是 jacoco 其实是个生成 javaagent 代理才能统计到代码执行的覆盖率,而jacoco 本身是不管测试的。

surefire 才是跑测试的插件, 默认就包含在maven中,会执行所有 *Test.java 等测试。。。 

所以这两个插件都需要配合使用。。。。

 

用 jacoco 插件生成  适当的 javaagent 参数,存放在 ${jacocoArgLine}  参数中,传递给 surefire 插件。 

然后surefire 跑测试的时候,才能带上jacoco 的插桩参数。。。

 

 

 

相关资料参考:

https://juejin.cn/post/6844903999473188877

https://stackoverflow.com/questions/18107375/getting-skipping-jacoco-execution-due-to-missing-execution-data-file-upon-exec

jacoco 官网,对 prepare-agent 这个goal的文档

https://www.eclemma.org/jacoco/trunk/doc/prepare-agent-mojo.html

 jetty 启动如何使用 javaagent

https://docs.appdynamics.com/appd/23.x/latest/en/application-monitoring/install-app-server-agents/java-agent/install-the-java-agent/agent-installation-by-java-framework/jetty-startup-settings