我最近在eclipse中使用EclEmma插件在我的应用程序中找到了JUnits的代码覆盖率并且效果很好。
在下一步中,我希望能够找到端到端测试/功能测试的代码覆盖率,这些测试/功能测试是从外部调用我们的应用程序(它们驻留在单独的服务器上)。
基本上,我们将应用程序打包为jar(我们使用maven)并将其部署在服务器上。我们可以在这个位置触发功能测试。
在这种情况下,有没有办法找到代码覆盖率?
我理解代码覆盖率工具的工作方式(原始语言)是它加载类并根据已被命中的代码部分生成报告。因此,根据这种理解,我不需要访问测试代码。我只需要以某种方式将代码覆盖率工具插入到我的应用程序jar中,并且只要调用此jar中的任何代码,就会更新报告。 我的理解是否正确?
注意: 如果可以使用其他工具,我可以使用其他代码覆盖工具。
答案 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.html
,target/site/jacoco/jacoco.csv
mvn org.jacoco:jacoco-maven-plugin:report
或
java -jar jacococli.jar report jacoco.exec [options]
或者,您可以参考pom.xml
答案 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。