常问问题
自从那次我对 jacoco 发疯以来,我脑海中浮现的问题。
我的应用程序服务器(jBoss、Glassfish..)位于伊拉克、叙利亚等等。在其上运行集成测试时是否可以获得多模块覆盖?Jenkins 和 Sonar 也在不同的服务器上。
是的。您必须使用在 mode 下运行的jacoco 代理output=tcpserver
,jacoco ant lib。基本上是两个jar
s。这会给你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/ 需要的是 jacocoant.jar 位于我的 jenkins 工作区中,而 jacocoagent.jar 位于我的应用服务器 VM 上?
这是正确的。
我不想用ant,我听说jacoco maven插件也可以做所有的事情。
不对,jacoco maven 插件可以收集单元测试数据和一些集成测试数据(请参阅Arquillian Jacoco),但是如果您有例如放心的测试作为 jenkins 中的单独构建,并且想要显示多模块覆盖率,我可以'看不到 maven 插件如何帮助你。
jacoco 代理究竟产生了什么?
只有覆盖数据.exec
格式。然后声纳可以读取它。
jacoco 是否需要知道我的 java 类所在的位置?
不,声纳可以,但 jacoco 不行。当您mvn sonar:sonar
进行课程路径时,就会发挥作用。
那么蚂蚁脚本呢?
它必须呈现在您的詹金斯工作区中。我的蚂蚁脚本,我称之为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
使用它来指向您的詹金斯工作区和-Djacoco.host=yourappserver.com
主机http://
还要注意我把我jacocoant.jar
放到 ${workspace}/tools/jacoco/jacocoant.jar
接下来我该怎么办?
您是否使用 jacocoagent.jar 启动了您的应用服务器?
您是否将 ant 脚本和 jacocoant.jar 放入您的 jenkins 工作区?
如果是,最后一步是配置 jenkins 构建。这是策略:
- 调用 ant 目标
jacocoReset
以重置所有以前收集的数据。
- 运行你的测试
- 调用 ant 目标
jacocoReport
获取报告
如果一切正常,您将it-jacoco.exec
在构建工作区中看到。
看截图,我也ant
安装在我的工作区的$WORKSPACE/tools/ant
dir 中,但你可以使用安装在你的 jenkins 中的一个。
如何在声纳中推送此报告?
Mavensonar: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
它来避免它。