Thomas Sundberg 最近的这篇博客文章包含一种方法,该方法通过使用 ant 进行 cobertura 调用而不是使用 maven cobertura 插件来部分解决该问题。
它依赖于以下带有专门 pom.xml 和 build.xml 文件的基本方法:
从父 pom 上的典型 maven 编译开始,它将编译子模块中的所有类。
mvn clean compile # maven-compile-plugin called for compiling
然后检测所有模块类:
ant instrument # cobertura called for instrumentation
然后调用 maven-surefire-plugin 调用使用检测类进行测试,cobertura 作为测试依赖项
mvn test
然后使用自定义报告调用从不同模块中提取所有结果:
ant report # cobertura called for reporting
ant build.xml 文件的关键元素是分别检测所有模块,然后在合并结果后报告所有模块。在他的示例中,需要为每个模块调用此函数:
<target name="instrumentAModule">
<property name="classes.dir" value="target/classes"/>
<cobertura-instrument todir="./${module}/${classes.dir}">
<fileset dir="./${module}/target/classes">
<include name="**/*.class"/>
</fileset>
</cobertura-instrument>
</target>
然后在测试完成后,报告阶段首先将所有不同目录的所有结果合并到一个新的 .ser 文件中(在他的示例中称为 sum.ser)
<target name="report" depends="merge">
<property name="src.dir" value="src/main/java/"/>
<cobertura-report datafile="sum.ser"
format="html"
destdir="./target/report">
<!-- Add all modules that should be included below -->
<!-- fileset dir="./MODULE_NAME_TO_REPLACE/${src.dir}"/ -->
<fileset dir="./product/${src.dir}"/>
</cobertura-report>
</target>
<target name="merge">
<cobertura-merge datafile="sum.ser">
<fileset dir=".">
<include name="**/cobertura.ser"/>
</fileset>
</cobertura-merge>
</target>
可以使用 antrun 插件将 ant 组件集成到 maven 中,但我对阶段/生命周期不够熟悉,不知道在哪里放置不同的调用。
这对我来说非常有用,因为我在我的 api 模块中编写抽象测试类,然后在我的 lib 模块中为它们提供一个实现。到目前为止,cobertura 和 emma 都无法处理这种设计,因此我的代码覆盖率通常为 0 或个位数。