背景:
我们有一个用Java编写的相当大的REST API,我们正在测试单元和功能测试的组合。在测试时需要许多变化,特别是在功能级别。虽然单元测试是在树中进行的,但功能测试位于单独的代码存储库中。
我们目前正在使用Jacoco进行测试覆盖,使用TestNG来运行我们的单元测试,但我相信我的问题的答案应该适用于其他工具组合。
我们在Jenkins有几个不同的工作,由主要项目的签到触发。这些包括运行Coverity等工具的作业以及几个不同的功能测试作业。这些作业由初始提交触发,在所有下游作业成功完成之前,该提交不被视为“绿色”。
问题:
我们如何获取覆盖率报告(如Jacoco二进制文件和TestNG xml文件)并将它们组合在一起以显示我们所有测试的总代码覆盖率?具体来说,如果它们存在于同一个作业/目录中,我们知道如何组合它们,但这些文件分布在可能在不同时间运行的多个Jenkins作业中。
根据我的经验,最常用的处理方法是使用 Promoted Builds Plugin触发所有作业,然后在完成触发作业时将其工件拉出。但是,当你有一两个以上的工作试图卷起时,我觉得这个尺度并不是很好。当您在主项目(旧版本等)上有多个变体时,尤其如此。
我知道可以在Jenkins中指纹文件,这样我们就知道-.jar与作业A,B和C中使用的版本相同。是否存在可以检索所有匹配模式的文件的插件存在不同的指纹文件?
一种替代解决方案(可能从ant / groovy脚本运行)是将测试数据推送到与git commit hash绑定的某个目录,并在基于汇总作业的情况下检索所有此类数据在基础项目的git commit hash上。
有没有简单的方法可以做到这一点?有没有人想出更好的其他方法来解决这个问题?
谢谢,
迈克尔
答案 0 :(得分:1)
面对类似问题,调整jacoco maven插件配置以合并jacoco结果。基本上将jacoco-unit.exec和jacoco-it.exec合并为一个二进制文件,并通过管道步骤在Jenkins上发布合并结果。
的pom.xml:
<plugin>
<inherited>false</inherited>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.agent.version}</version>
<executions>
<execution>
<id>merge-results</id>
<phase>post-integration-test</phase>
<goals>
<goal>merge</goal>
</goals>
<configuration>
<fileSets>
<fileSet>
<directory>${project.parent.build.directory}</directory>
<includes>
<include>jacoco-*.exec</include>
</includes>
</fileSet>
</fileSets>
<destFile>${project.parent.build.directory}/jacoco.exec</destFile>
</configuration>
</execution>
</executions>
</plugin>
Jenkinsfile:
echo 'Publish Jacoco trend'
step($class: 'JacocoPublisher',
execPattern: '**/jacoco.exec',
classPattern: '**/classes',
sourcePattern: '**/src/main/java',
)
但是,你仍然需要通过另一个构建步骤从几个Jenkins构建中获取jacoco二进制文件,或者明确指定它们的位置。