一尘不染

如何让Emma或Cobertura与Maven一起报告其他模块中源代码的覆盖率?

java

我有一个带有Java代码的多模块Maven安装程序。

我的单元在其中一个模块中测试多个模块中的代码。当然,这些模块具有相互依赖性,并且在测试执行之前,根据需要编译所有相关模块中的代码。

因此:如何获得有关整个代码库覆盖率的报告?


注意:我不是在问如何在多个模块中合并覆盖测试的结果。我在问如何使用来自多个模块的检测代码来覆盖单个模块中的测试。任何对前者感兴趣的人都可以参考这些其他问题,以及Crowne为Maven
Dashboard
Sonar提出的建议。

使用纯Ant成功获得了完整的覆盖率报告
。[编辑:]我将开发运行时目录中的所有jar插入了一个临时目录;将临时目录添加到类路径;然后 从Ant 进行 批处理测试

可以从Maven运行Ant,但是这里面临的挑战是无缝集成(即,将Maven中的所有类路径和源路径元素自动提供给Ant),这就是为什么我没有为此目的使用Maven的功能。

关于集成测试,还有其他问题。但是,默认情况下,每个项目的报告默认情况下仅报告 同一
项目中代码的覆盖率,而我的测试则在多个项目中执行代码。

文章中的西班牙可能是相关的。这是另一条有关Seam的文章



阅读 243

收藏
2020-12-03

共1个答案

一尘不染

最近的一篇博客由托马斯·桑德博格包含利用蚂蚁的呼叫的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或个位数。

2020-12-03