运行 Jacoco 覆盖任务中的 Ant 宏
Running Ant macro from within Jacoco's coverage task
我的项目正在使用 Ant,它有几个测试套件。由于每个suite都是运行类似的,所以定义了一个宏:
<macrodef name="exec-tests">
<attribute name="test-suite" />
<element name="test-run" implicit="yes" />
<sequential>
<junit printsummary="yes" haltonfailure="true" haltonerror="true" showoutput="true" outputtoformatters="true" fork="true" maxmemory="512m">
<jvmarg value="-XX:MaxPermSize=256m" />
<jvmarg value="-Xmx512m" />
<jvmarg value="-Xms512m" />
<classpath refid="test.run.class.path" />
<formatter type="plain" usefile="false" />
<formatter type="xml" usefile="true" />
<test name="@{test-suite}" todir="${test.build.results.dir}" />
</junit>
</sequential>
</macrodef>
所以有几个目标 运行 像这样在不同的套件中:
<target name="run-xxx-tests" depends="build-tests">
<exec-tests test-suite="com.mycompany.XxxTestsSuite" />
</target>
<target name="run-yyy-tests" depends="build-tests">
<exec-tests test-suite="com.mycompany.YyyTestsSuite" />
</target>
现在我还想 运行 一个具有 Jacoco 覆盖率的测试套件。所以这样做会很好:
<target name="run-xxx-tests-with-coverage" depends="build-tests">
<jacoco:coverage destfile="${test.coverage.unit.file}">
<exec-tests test-suite="com.mycompany.XxxTestsSuite" />
</jacoco:coverage>
</target>
但是,Jacoco 似乎不支持 coverage 标签内的宏,因为我收到错误:
Caused by: C:\Users\taavi\projects\cds\build.xml:87: exec-tests is not a valid child of the coverage task
at org.jacoco.ant.CoverageTask.addTask(CoverageTask.java:68)
at org.apache.tools.ant.UnknownElement.handleChildren(UnknownElement.java:367)
现在我创建了另一个与 "exec-tests" 非常相似的 macrodef,但只是增加了覆盖范围。这并不重要,但我想知道是否还有什么方法可以避免这个重复的 "junit" 任务部分?
k6ps
<jacoco:coverage>
任务有 an enabled
attribute 可能有用...
If set to true coverage data will be collected for the contained task.
要使用 enabled
,您可以对 <exec-tests>
进行几处更改:
- 将
<jacoco:coverage>
移入其中
- 添加一个可选的
coverage.destfile
属性
它看起来如何...
<macrodef name="exec-tests">
<attribute name="test-suite" />
<!-- If <test-suite> is called without coverage.destfile, then -->
<!-- coverage.enabled won't be set to true and coverage info won't -->
<!-- be collected. -->
<attribute name="coverage.destfile" default="" />
<element name="test-run" implicit="yes" />
<sequential>
<local name="coverage.enabled" />
<condition property="coverage.enabled" value="false" else="true">
<equals arg1="@{coverage.destfile}" arg2="" />
</condition>
<jacoco:coverage enabled="${coverage.enabled}" destfile="@{coverage.destfile}">
<junit ...>
...
</junit>
</jacoco:coverage>
</sequential>
</macrodef>
然后,每个测试都可以指定是否应该收集覆盖率信息...
<exec-tests
test-suite="com.mycompany.XxxTestsSuite"
coverage.destfile="${test.coverage.unit.file}" />
在上面的示例中,将收集覆盖范围信息,因为提供了 coverage.destfile
。
我的项目正在使用 Ant,它有几个测试套件。由于每个suite都是运行类似的,所以定义了一个宏:
<macrodef name="exec-tests">
<attribute name="test-suite" />
<element name="test-run" implicit="yes" />
<sequential>
<junit printsummary="yes" haltonfailure="true" haltonerror="true" showoutput="true" outputtoformatters="true" fork="true" maxmemory="512m">
<jvmarg value="-XX:MaxPermSize=256m" />
<jvmarg value="-Xmx512m" />
<jvmarg value="-Xms512m" />
<classpath refid="test.run.class.path" />
<formatter type="plain" usefile="false" />
<formatter type="xml" usefile="true" />
<test name="@{test-suite}" todir="${test.build.results.dir}" />
</junit>
</sequential>
</macrodef>
所以有几个目标 运行 像这样在不同的套件中:
<target name="run-xxx-tests" depends="build-tests">
<exec-tests test-suite="com.mycompany.XxxTestsSuite" />
</target>
<target name="run-yyy-tests" depends="build-tests">
<exec-tests test-suite="com.mycompany.YyyTestsSuite" />
</target>
现在我还想 运行 一个具有 Jacoco 覆盖率的测试套件。所以这样做会很好:
<target name="run-xxx-tests-with-coverage" depends="build-tests">
<jacoco:coverage destfile="${test.coverage.unit.file}">
<exec-tests test-suite="com.mycompany.XxxTestsSuite" />
</jacoco:coverage>
</target>
但是,Jacoco 似乎不支持 coverage 标签内的宏,因为我收到错误:
Caused by: C:\Users\taavi\projects\cds\build.xml:87: exec-tests is not a valid child of the coverage task
at org.jacoco.ant.CoverageTask.addTask(CoverageTask.java:68)
at org.apache.tools.ant.UnknownElement.handleChildren(UnknownElement.java:367)
现在我创建了另一个与 "exec-tests" 非常相似的 macrodef,但只是增加了覆盖范围。这并不重要,但我想知道是否还有什么方法可以避免这个重复的 "junit" 任务部分?
k6ps
<jacoco:coverage>
任务有 an enabled
attribute 可能有用...
If set to true coverage data will be collected for the contained task.
要使用 enabled
,您可以对 <exec-tests>
进行几处更改:
- 将
<jacoco:coverage>
移入其中 - 添加一个可选的
coverage.destfile
属性
它看起来如何...
<macrodef name="exec-tests">
<attribute name="test-suite" />
<!-- If <test-suite> is called without coverage.destfile, then -->
<!-- coverage.enabled won't be set to true and coverage info won't -->
<!-- be collected. -->
<attribute name="coverage.destfile" default="" />
<element name="test-run" implicit="yes" />
<sequential>
<local name="coverage.enabled" />
<condition property="coverage.enabled" value="false" else="true">
<equals arg1="@{coverage.destfile}" arg2="" />
</condition>
<jacoco:coverage enabled="${coverage.enabled}" destfile="@{coverage.destfile}">
<junit ...>
...
</junit>
</jacoco:coverage>
</sequential>
</macrodef>
然后,每个测试都可以指定是否应该收集覆盖率信息...
<exec-tests
test-suite="com.mycompany.XxxTestsSuite"
coverage.destfile="${test.coverage.unit.file}" />
在上面的示例中,将收集覆盖范围信息,因为提供了 coverage.destfile
。