合并来自多个Jenkins作业的测试覆盖率和测试结果



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二进制文件,或者明确指定它们的位置。

最新更新