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

标签 java junit maven cobertura emma

我有一个带有 Java 代码的多模块 Maven 设置。

我的单元测试,在一个模块中,在多个模块中练习代码。自然地,模块具有相互依赖性,所有相关模块中的代码在测试执行之前根据需要进行编译。

那么:我怎样才能得到一份关于整个代码库覆盖率的报告?


注意:我不是在问如何合并多个模块中测试的覆盖率结果。我在问如何使用来自多个模块的检测代码来覆盖单个模块中的测试。对前者感兴趣的可以引用these other questions ,以及 Crowne 对 Maven Dashboard 的建议和 Sonar .

我成功获得了全覆盖报告using pure Ant . [编辑:]我将 development-runtime 目录中的所有 jar 文件检测到一个临时目录中;将临时目录添加到类路径中;然后使用 batch-test 从 Ant 运行测试。

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

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

article in Spanish可能是相关的。这是另一个 Seam-specific article .


最佳答案

recent blog post by 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 或个位数。

关于java - 我如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4717846/

相关文章:

java - 如何从 XML 定义 fragment 的布局?

java - 将 Spinner 包含在 ListView 中后无法单击 ListView

java - IntelliJ IDEA Ultimate 2018.3.5 重复代码未突出显示

java - 将参数从测试套件发送到 junit 4 中的测试用例

maven - 多模块 POM - 创建一个有效的站点

java - 在 'project' 和 'external' 依赖项之间切换的正确 Gradle 项目结构是什么

java - 将字符转换为数组索引

java - 针对更多类型的数据库运行 JUnit 测试

java - JUnit 中的测试方法阻止电子邮件发送

maven - 一个 Maven 配置文件可以从另一个 Maven 配置文件继承吗?