当前位置: 首页 > 面试题库 >

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

汝墨一
2023-03-14
问题内容

我有一个带有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或个位数。



 类似资料:
  • 我使用jenkins的代码为每个插件生成覆盖率,并显示我喜欢的管道。是否有一个插件我可以使用它(例如Cobertura,但它似乎不受管道支持)?

  • 我正在使用Cobertura maven插件[2.7版]来了解测试的代码覆盖率。我正在使用PowerMock[1.6.6]模拟依赖对象。但是当我运行mvn cobertura:cobertura并检查报告时,覆盖率保持不变。当我不使用嘲弄的时候,它很好用。这是兼容性问题吗?我多次尝试mvn clean,只是为了确保报告是新生成的。 这是我的pom.xml 对此我们非常感谢您的帮助。

  • 我有一个反应应用,使用 npx 创建-反应-应用命令创建,并为 CI/CD 配置了一个基于 yaml 的 Azure DevOps 管道。然后我添加了一些简单的单元测试。 我在yaml管道中添加了一个脚本任务,以生成如下覆盖率结果。 但是这个任务显示以下输出,然后任务继续运行,永远不会结束。我必须取消管道运行才能最终停止它。不知道发生了什么。有什么想法吗? 但是,当我以CI =true作为前缀以按

  • 我正在为我的grails 3.1.6项目添加cobertura代码覆盖率,覆盖率报告似乎有点少,即我有单元测试用例(pos和neg两种情况)来覆盖if块,但报告说没有覆盖if块。gradle:2.13 Groovy:2.4.5 Grails:3.1.6 cobertura gradle Plugin:net.saliman:gradle-cobertura-plugin:2.3.2 这是我的代码

  • 我试图设置为我的项目的代码覆盖 我的项目基于 下面是我项目的 然后我运行并看到以下内容 然后我运行,我看到 问题 -配置中有什么不正确 -如何生成报告? 谢啦