我在多个虚拟机上运行自定义并行系统测试,并使用jacoco代理在我们编译的应用程序上执行运行时分析。这些代理中的每一个都将生成自己的report.exec,并具有相应的覆盖范围,我们想要一种方法来表示整个项目(在SONAR中)的整体“集成测试”覆盖率。
这项努力仍处于规划阶段,所以我正在尽力制定路线图。我知道ant / maven构建使报告合并变得容易,但是由于我们的测试环境的性质,需要使用jacoco 代理来生成运行时覆盖。
我已经搜索了适用于这种情况的解决方案的高低,但似乎几乎所有属于这种jacoco /声纳类别的问题都有其独特的条件,几乎没有人对使用jacoco代理有任何兴趣
代理将以tcpserver模式运行,主客户端负责编排转储和报告输出。如果此客户端配置为输出到单个文件,这些报告是否会自动附加/合并为一个?是否存在用于合并多个覆盖率报告的API或独立项目,我可以将其集成到不依赖于ant或maven的客户端中?
或者,是否有一个SONAR配置用于接受这种性质的多个报告并通过代码行合并它们的覆盖范围?在父pom.xml中定义每个单独的报告,或者只是给它一个包含整个集合的文件夹的路径,然后让SONAR对其进行排序?
我愿意接受这个问题没有简单的解决办法,但是不得不编写我自己的合并功能,这真的有助于实现这个项目。
E:值得一提的是,我们不会生成任何实际的HTML / XML /等。报告,只是exec文件,我们将提供给SONAR。
答案 0 :(得分:2)
我对jacoco的体验(我们将它用于使用ant构建的单元测试覆盖率)表明您希望一步执行测试,并在单独的步骤中加载到SonarQube。所以我不知道你是否使用蚂蚁,maven,jacoco代理等等。我希望你的进程创建jacoco.exec文件,然后在执行SonarQube分析之前将它们合并。
答案 1 :(得分:2)
如果您使用的是Gradle,则必须先获取merge the Jacoco execution数据,然后告诉sonarqube使用该数据而不是每个子模块生成的单个exec
文件。
以下是它的样子:
def allTestCoverageFile = "$buildDir/jacoco/allTestCoverage.exec"
sonarqube {
properties {
property "sonar.projectKey", "your.org:YourProject"
property "sonar.projectName", "YourProject"
property "sonar.jacoco.reportPaths", allTestCoverageFile
}
}
task jacocoMergeTest(type: JacocoMerge) {
destinationFile = file(allTestCoverageFile)
executionData = project.fileTree(dir: '.', include:'**/build/jacoco/test.exec')
}
task jacocoMerge(dependsOn: ['jacocoMergeTest']) {
// used to run the other merge tasks
}
subprojects {
sonarqube {
properties {
property "sonar.jacoco.reportPath", allTestCoverageFile
}
}
}
简而言之:
allTestCoverageFile
)定义全局覆盖文件输出。sonar.jacoco.reportPaths
)。但请注意,我们还必须在子项目关闭中执行此操作。这非常重要。不要错过。JacocoMerge
(来自Jacoco插件的孵化类)扩展,将所有项目(executionData
)的所有测试覆盖率报告合并到我们的{{1 }}。答案 2 :(得分:1)
由于这个问题得到了如此多的观点:
ExecutionData对象有一个合并方法。合并完所有报告后,生成的对象可以传递到ExecutionDataWriter并正常输出。
覆盖率是一种OR比较,因此合并不同测试的同一软件的多个实例的覆盖范围将是全面的。
就SONAR而言(取决于您的管道),您可以手动引入合并的报告,只要SLOC /二进制文件是等距的,那么您将获得一堆漂亮的红色和绿色条。