Jacoco:查找外部测试的代码覆盖率

时间:2018-05-02 11:17:06

标签: java maven jenkins code-coverage jacoco

我最近在eclipse中使用EclEmma插件在我的应用程序中找到了JUnits的代码覆盖率并且效果很好。

在下一步中,我希望能够找到端到端测试/功能测试的代码覆盖率,这些测试/功能测试是从外部调用我们的应用程序(它们驻留在单独的服务器上)。

基本上,我们将应用程序打包为jar(我们使用maven)并将其部署在服务器上。我们可以在这个位置触发功能测试。

在这种情况下,有没有办法找到代码覆盖率?

理解代码覆盖率工具的工作方式(原始语言)是它加载类并根据已被命中的代码部分生成报告。因此,根据这种理解,我不需要访问测试代码。我只需要以某种方式代码覆盖率工具插入到我的应用程序jar中,并且只要调用此jar中的任何代码,就会更新报告。 我的理解是否正确?

注意: 如果可以使用其他工具,我可以使用其他代码覆盖工具。

3 个答案:

答案 0 :(得分:11)

您可以在服务器上运行代码,由JaCoCo代理在运行时进行检测,方法是将代理添加到Java命令行。例如,如果您的流程目前已启用:

java -jar myApp.jar

您可以将其更改为

java -jar myApp.jar -javaagent:/some/path/jacocoagent.jar

默认情况下,当VM终止时,它会将覆盖数据写入文件jacoco.exec,但您可以使用选项覆盖此选项,从而使您能够通过TCP / IP获取覆盖数据。请参阅JaCoCo Agent docs

您可以使用以下方法将其格式化为报告(例如HTML)

java -jar jacococli.jar report jacoco.exec [options]

有关选项,请参阅JaCoCo CLI docs

...或者您可以使用EclEmma来分析输出。

如果有正当理由不能使用代理,作为最后的手段,您可以使用instrument中的jacocococli命令将类文件静态转换为已检测的类文件。有关此信息,请参阅JaCoCo 'Offline Instrumentation' documentation

直接调用代理并使用jacococli.jar是使用JaCoCo的最基本方法。由于您使用的是Maven,因此您可以使用JaCoCo Maven插件获得许多相同的效果。

答案 1 :(得分:1)

这就是我在jenkins管道中使用maven的方式

mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent test -Dmaven.test.failure.ignore=true 

这将创建一个具有代码覆盖率数据的target/jacoco.exec

显然我们无法解释输出,但像SonarQube这样的工具和插件可以做到这一点。(在我的情况下,我使用了sonarqube)

但是,您可以使用以下内容生成html / csv格式,该格式位于target/site/jacoco/index.htmltarget/site/jacoco/jacoco.csv

mvn org.jacoco:jacoco-maven-plugin:report

java -jar jacococli.jar report jacoco.exec [options]

或者,您可以参考pom.xml

中执行此操作的tutorial

答案 2 :(得分:1)

我遇到了同样的问题。这就是我在本地修复它的方式。通过在 vm args 中添加 jacoco 代理。此外,在 jacoco 6.1 版之后,exec 文件在开始时创建(空白),然后在服务器正常关闭后填充,这显然 eclipse 没有这样做。所以我们得到一个空的 .exec 文件。关键是加上output=tcpserver,然后导入代码覆盖率。

-javaagent:C:\Users\JohnDoe\Downloads\jacoco-0.8.5\lib\jacocoagent.jar=output=tcpserver.

将结果导入 Eclipse。这是通过文件 -> 导入 -> 覆盖会话 -> 选择代理地址单选按钮但保留默认值 -> 输入一些名称并选择测试代码来完成的。 默认应为 127.0.0.1,端口为 6300。