我使用Sonar 4.1.1,Jboss 6.x,Jacoco 0.6.4,使用Ant执行任务我不允许使用Maven。在eclipse工作区中,我有两个项目,一个是Web应用程序,另一个是selenium测试。
我能够获得单元测试的单元测试和代码覆盖率。但是声纳无法读取Jacoco
创建的集成测试文件。我认为我创建jacoco-it.exec
文件的方式可能有问题,因此声纳无法读取它。因为声纳确实读取了我的jacoco-ut.exec
文件。我可以让reportPath
和itReportPath
同时阅读我的jacoco-ut.exec
文件。也许在我的构建文件中可能有问题。我做了很多研究,并尝试了许多不同的方法来创建jacoco-it.exec
文件,不同的Jacoco设置,并遵循声纳,jacoco,其他博客的不同示例,但仍然无效。我一定得错过帮助!!谢谢!
我有像这样的Jboss的VM参数
-javaagent:/path to jar/jacocoagent.jar=destfile=/path for create/jacoco-it.exec
当我运行selenium时,上面的代码创建了一个包含一些数据的文件,大小约为1.3MB
以下是与此问题相关的构建部分
<property name="sonar.sourceEncoding" value="UTF-8" />
<property name="sonar.java.coveragePlugin" value="jacoco" />
<property name="sonar.core.codeCoveragePlugin" value="jacoco" />
<property name="sonar.dynamicAnalysis" value="reuseReports" />
<property name="sonar.jacoco.reportsPath" value="${reports.dir}/junit" />
<property name="sonar.jacoco.itReportPath" value="${reports.dir}/jacoco-it.exec" />
<property name="sonar.jacoco.reportPath" value="${reports.dir}/jacoco-ut.exec" />
<target name="unitTest" depends="compile">
<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
<classpath>
<path refid="classpath"/>
</classpath>
</taskdef>
<!-- Import the JaCoCo Ant Task -->
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath refid="classpath"/>
</taskdef>
<!-- Run your unit tests, adding the JaCoCo agent -->
<jacoco:coverage destfile="reports/jacoco-ut.exec" xmlns:jacoco="antlib:org.jacoco.ant">
<junit printsummary="yes" haltonfailure="yes" forkmode="once" fork="true" dir="${basedir}" failureProperty="test.failed">
<classpath location="${classes.dir}" />
<classpath refid="classpath"/>
<formatter type="plain" />
<formatter type="xml" />
<batchtest fork="true" todir="${reports.junit.xml.dir}">
<fileset dir="src">
<include name="**/*TestAdd.java" />
</fileset>
</batchtest>
</junit>
</jacoco:coverage>
</target>
<target name="coverageTest" depends="compile">
<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
<classpath>
<path refid="classpath"/>
</classpath>
</taskdef>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath refid="classpath"/>
</taskdef>
<!--Run your unit tests, adding the JaCoCo agent-->
<jacoco:coverage xmlns:jacoco="antlib:org.jacoco.ant" dumponexit="true" >
<junit printsummary="yes" haltonfailure="yes" forkmode="once" fork="true" dir="${basedir}" failureProperty="test.failed">
<classpath location="${classes.dir}"/>
<classpath refid="classpath"/>
<formatter type="plain" />
<formatter type="xml" />
<formatter type="plain" usefile="false"/>
<batchtest todir="${reports.junit.xml.dir}">
<fileset dir="../HelloAppTest/src">
<include name="**/answerTest.java"/>
</fileset>
</batchtest>
</junit>
</jacoco:coverage>
</target>
答案 0 :(得分:1)
原因是,您可能没有将Jacocoagent.jar文件附加到&#34; TARGET &#34; (例如:JBoss / Tomcat)JVM的范围并将其停止,以便它可以将最终的代码覆盖率数据刷新到jacoco it exec文件。
一旦这样做(而不是使用Maven / ANT的JVM范围),运行非单元(IT)测试,然后停止目标JVM。
在目标JVM停止后,您将获得为IT测试生成的最终jacoco .exec文件。将该文件用于sonar.jacoco.itReportPath变量并且它可以正常工作。
例如:我将此变量传递给Tomcat的startup.sh脚本,并在启动tomcat(目标JVM)时,在Tomcat的实际启动命令中使用此变量。
PROJ_EXTRA_JVM_OPTS=-javaagent:tomcat/jacocoagent.jar=destfile=build/jacoco/IT/jacocoIT.exec,append=false