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

时间:2016-10-11 17:26:07

标签: java unit-testing jenkins functional-testing

背景:

我们有一个用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上。

有没有简单的方法可以做到这一点?有没有人想出更好的其他方法来解决这个问题?

谢谢,

迈克尔

1 个答案:

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