Jacoco:查找外部测试的代码覆盖率
Jacoco: Find code coverage for external tests
我最近在 eclipse 中使用了 EclEmma 插件来查找我的应用程序中 JUnit 的代码覆盖率并且效果很好。
在下一步中,我希望能够找到从外部调用我们的应用程序(它们位于单独的服务器上)的端到端测试/功能测试的代码覆盖率。
基本上,我们将应用程序打包为 jar(我们使用 maven)并将其部署到服务器上。我们可以在这个位置触发功能测试。
在这种情况下有没有办法找到代码覆盖率?
我对代码覆盖工具(原始语言)工作原理的理解是它加载 类 并根据具有的代码部分生成报告被击中。因此,根据这种理解,我不需要访问测试代码。我只需要以某种方式 将代码覆盖工具插入 到我的应用程序 jar 中,只要调用此 jar 中的任何代码,报告就会更新。 我的理解正确吗?
注意:
如果可以使用其他工具,我愿意使用其他代码覆盖工具。
您可以 运行 服务器上的代码,由 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
命令将 class 文件静态转换为经过检测的 class 文件在 jacocococli
。有关此信息,请参阅 JaCoCo 'Offline Instrumentation' documentation。
直接调用代理和使用jacococli.jar
是JaCoCo最基本的使用方式。由于您使用的是 Maven,因此您可以使用 JaCoCo Maven 插件获得许多相同的效果。
这就是我在 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]
或者,您可以参考 tutorial,它在 pom.xml
中完成了所有这些工作
我遇到了同样的问题。这就是我在本地修复它的方式。通过在 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。这是通过文件 -> 导入 -> 覆盖会话 -> select 代理地址单选按钮完成的,但保留默认值 -> 输入一些名称和 select 待测代码。
默认值应为 127.0.0.1,端口为 6300。
我最近在 eclipse 中使用了 EclEmma 插件来查找我的应用程序中 JUnit 的代码覆盖率并且效果很好。
在下一步中,我希望能够找到从外部调用我们的应用程序(它们位于单独的服务器上)的端到端测试/功能测试的代码覆盖率。
基本上,我们将应用程序打包为 jar(我们使用 maven)并将其部署到服务器上。我们可以在这个位置触发功能测试。
在这种情况下有没有办法找到代码覆盖率?
我对代码覆盖工具(原始语言)工作原理的理解是它加载 类 并根据具有的代码部分生成报告被击中。因此,根据这种理解,我不需要访问测试代码。我只需要以某种方式 将代码覆盖工具插入 到我的应用程序 jar 中,只要调用此 jar 中的任何代码,报告就会更新。 我的理解正确吗?
注意: 如果可以使用其他工具,我愿意使用其他代码覆盖工具。
您可以 运行 服务器上的代码,由 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
命令将 class 文件静态转换为经过检测的 class 文件在 jacocococli
。有关此信息,请参阅 JaCoCo 'Offline Instrumentation' documentation。
直接调用代理和使用jacococli.jar
是JaCoCo最基本的使用方式。由于您使用的是 Maven,因此您可以使用 JaCoCo Maven 插件获得许多相同的效果。
这就是我在 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]
或者,您可以参考 tutorial,它在 pom.xml
我遇到了同样的问题。这就是我在本地修复它的方式。通过在 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。这是通过文件 -> 导入 -> 覆盖会话 -> select 代理地址单选按钮完成的,但保留默认值 -> 输入一些名称和 select 待测代码。 默认值应为 127.0.0.1,端口为 6300。