【问题标题】:Merging test coverage and test results from multiple Jenkins jobs合并来自多个 Jenkins 作业的测试覆盖率和测试结果
【发布时间】:2016-10-11 17:26:07
【问题描述】:

背景:

我们有一个用 Java 编写的相当大的 REST API,我们正在使用单元测试和功能测试的组合进行测试。测试时需要许多变化,特别是在功能级别。虽然单元测试存在于树中,但功能测试位于单独的代码存储库中。

我们目前使用 Jacoco 进行测试覆盖,使用 TestNG 运行我们的单元测试,但我相信我的问题的答案应该适用于其他工具组合。

我们在 Jenkins 中有几个不同的工作,这些工作由签入主项目触发。其中包括运行 Coverity 等工具的作业以及几个不同的功能测试作业。这些作业由初始提交触发,在所有下游作业成功完成之前,该提交不被视为“绿色”。

问题:

我们如何获取覆盖率报告(如 Jacoco 二进制文件和 TestNG xml 文件)并将它们结合起来以显示我们所有测试的总代码覆盖率?具体来说,如果它们存在于同一个作业/目录中,我们知道如何组合它们,但这些文件分布在可能在不同时间运行的多个 Jenkins 作业中。

根据我的经验,最普遍接受的处理方法是使用 Promoted Builds Plugin 触发所有作业,然后在完成后将其工件拉到触发作业。但是,当您尝试汇总的工作不止一两个时,我觉得这种扩展性不太好。当您的主项目(旧版本等)可能有多个变体时尤其如此。

我知道可以在 Jenkins 中对文件进行指纹识别,这样我们就知道 -.jar 与作业 A、B 和 C 中使用的版本相同。是否存在一个插件可以根据是否存在不同的指纹文件?

另一种解决方案(可能从 ant/groovy 脚本运行)是将测试数据推送到与 git 提交哈希绑定的某个目录,并在基于汇总作业的情况下检索所有此类数据在基础项目的 git commit 哈希上。

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

谢谢,

迈克尔

【问题讨论】:

    标签: java unit-testing jenkins functional-testing


    【解决方案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>
    

    Jenkins 文件:

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-11
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 2015-12-19
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多