我有一个带有Java代码的多模块Maven安装程序。
我的单元在其中一个模块中测试多个模块中的代码。当然,这些模块具有相互依赖性,并且在测试执行之前,根据需要编译所有相关模块中的代码。
因此:如何获得有关整个代码库覆盖率的报告?
注意:我不是在问如何在多个模块中合并覆盖测试的结果。我在问如何使用来自多个模块的检测代码来覆盖单个模块中的测试。任何对前者感兴趣的人都可以参考这些其他问题,以及Crowne为Maven Dashboard和Sonar提出的建议。
我使用纯Ant成功获得了完整的覆盖率报告 。[编辑:]我将开发运行时目录中的所有jar插入了一个临时目录;将临时目录添加到类路径;然后 从Ant 进行 批处理测试 。
可以从Maven运行Ant,但是这里面临的挑战是无缝集成(即,将Maven中的所有类路径和源路径元素自动提供给Ant),这就是为什么我没有为此目的使用Maven的功能。
关于集成测试,还有其他问题。但是,默认情况下,每个项目的报告默认情况下仅报告 同一 项目中代码的覆盖率,而我的测试则在多个项目中执行代码。
该文章中的西班牙可能是相关的。这是另一条有关Seam的文章。
这最近的一篇博客由托马斯·桑德博格包含利用蚂蚁的呼叫的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或个位数。