Background:
我们有一个用Java编写的相当大的REST API,我们正在结合单元测试和功能测试对其进行测试。在测试它时,特别是在功能级别上,需要有许多变体。虽然单元测试位于树中,但功能测试位于单独的代码存储库中。
我们目前使用Jacoco来进行测试覆盖,使用TestNG来运行我们的单元测试,尽管我相信我的问题的答案应该适用于其他工具组合。
我们在Jenkins中有几个不同的作业是由签入到主要项目触发的。这些作业包括运行像Coverity这样的工具的作业,以及几个不同的功能测试作业。这些作业是由初始提交触发的,在所有下游作业成功完成之前,初始提交不会被认为是"绿色"的。
问题:
我们如何获取覆盖率报告(如Jacoco二进制文件和TestNG xml文件)并将它们组合起来以显示所有测试的总代码覆盖率?具体来说,如果它们存在于同一个作业/目录中,我们知道如何组合它们,但是这些文件分布在多个Jenkins作业中,这些作业可能在不同时间运行。
根据我的经验,最普遍接受的处理方法是使用提升构建插件触发所有作业,然后在完成后将其工件拉到触发作业。然而,当你有一两个以上的工作要做时,我觉得这种方法并不适用。当您在主项目(旧版本等)上可能有多个变体时,这尤其正确。
我明白在Jenkins中指纹文件是可能的,这样我们就知道-.jar是在工作A, B和c中使用的相同版本。是否存在一个插件,可以检索基于不同指纹文件存在的模式匹配的所有文件?
另一种解决方案(可能从ant/groovy脚本运行)是将测试数据推送到某个与git提交散列绑定的目录中,并在基于基本项目的git提交散列的滚升作业中检索所有这些数据。
有什么简单的方法吗?有没有人想出其他更好的方法来解决这个问题?
谢谢,迈克尔
面对类似的问题,调整了jacoco maven插件config来合并jacoco结果。基本上是合并的雅可比单位。Exec和jacoco。
将合并后的结果发布到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二进制文件,或者明确指定它们的位置。