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

swa*_*357 7 java unit-testing functional-testing jenkins

背景:

我们有一个用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检索汇总作业中的所有此类数据提交基础项目的哈希值.

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

谢谢,

迈克尔

lud*_*nus 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>
Run Code Online (Sandbox Code Playgroud)

詹金斯文件:

            echo 'Publish Jacoco trend'
            step($class: 'JacocoPublisher',
                    execPattern: '**/jacoco.exec',
                    classPattern: '**/classes',
                    sourcePattern: '**/src/main/java',
            )
Run Code Online (Sandbox Code Playgroud)

但是,您仍然需要通过另一个构建步骤从多个 Jenkins 构建中获取 jacoco 二进制文件,或者显式指定它们的位置。