常见问题解答
自从我对 jacoco 发疯以来,我脑海中浮现的问题。
我的应用服务器(jBoss、Glassfish..)位于伊拉克、叙利亚等等。在其上运行集成测试时是否可以获得多模块覆盖? Jenkins 和 Sonar 也在不同的服务器上。
是的。您必须使用以output=tcpserver 模式运行的jacoco agent,jacoco ant lib。基本上是两个jars。这将使您获得 99% 的成功。
jacoco 代理是如何工作的?
你附加一个字符串
-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*
到您的应用程序服务器 JAVA_OPTS 并重新启动它。在此字符串中,只有 [your_path] 必须替换为 jacocoagent.jar 的路径,并将其存储(存储!)在运行应用程序服务器的 VM 上。自从您启动应用服务器后,所有部署的应用程序都将被动态监控,并且它们的活动(即代码使用情况)将准备好让您通过 tcl 请求以 jacocos .exec 格式获取。
我可以重置 jacoco 代理以仅从我的测试开始时开始收集执行数据吗?
是的,为此,您需要位于 jenkins 工作区中的 jacocoant.jar 和 ant 构建脚本。
所以基本上我从 http://www.eclemma.org/jacoco/ 需要的是位于我的 jenkins 工作区中的 jacocoant.jar 和位于我的应用服务器 VM 上的 jacocoagent.jar?
没错。
我不想用ant,听说jacoco maven插件也能做到。
这是不对的,jacoco maven 插件可以收集单元测试数据和一些集成测试数据(参见Arquillian Jacoco),但是如果你有例如在 jenkins 中作为单独构建的放心测试,并且想要显示多模块覆盖范围,我看不出 maven 插件如何帮助你。
jacoco剂究竟产生了什么?
仅.exec 格式的覆盖率数据。然后声纳可以读取它。
jacoco 需要知道我的 java 类所在的位置吗?
不,声纳可以,但 jacoco 不行。当您执行 mvn sonar:sonar 时,课程路径就会发挥作用。
那么蚂蚁脚本呢?
它必须呈现在您的 jenkins 工作区中。我的 ant 脚本,我叫它jacoco.xml 看起来像这样:
<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
<property name="jacoco.port" value="6300"/>
<property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
</taskdef>
<target name="jacocoReport">
<jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
</target>
<target name="jacocoReset">
<jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
<delete file="${jacocoReportFile}"/>
</target>
</project>
调用此脚本时应传递的两个强制性参数
-Dworkspace=$WORKSPACE
用它来指向你的 jenkins 工作区和 -Djacoco.host=yourappserver.com 没有 http:// 的主机
还请注意,我将 jacocoant.jar 放入了 ${workspace}/tools/jacoco/jacocoant.jar
接下来我应该做什么?
您是否使用 jacocoagent.jar 启动您的应用服务器?
您是否将 ant 脚本和 jacocoant.jar 放入您的 jenkins 工作区?
如果是,最后一步是配置 jenkins 构建。这是策略:
- 调用 ant 目标
jacocoReset 以重置所有之前收集的数据。
- 运行测试
- 调用蚂蚁目标
jacocoReport获取报告
如果一切正常,您将在构建工作区中看到it-jacoco.exec。
看截图,我在$WORKSPACE/tools/ant dir 的工作区中也安装了ant,但您可以使用安装在jenkins 中的一个。
如何在声纳中推送此报告?
Maven sonar:sonar 将完成这项工作(不要忘记配置它),将其指向 main pom.xml 以便它将运行所有模块。使用sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.exec 参数告诉声纳您的集成测试报告的位置。每次分析新的模块类时,它都会在it-jacoco.exec 中查找有关覆盖率的信息。
我的 `target` 目录中已经有 jacoco.exec,`mvn sonar:sonar` 会忽略/删除它
默认情况下mvn sonar:sonar 执行clean 并删除您的目标目录,使用sonar.dynamicAnalysis=reuseReports 来避免它。