有没有任何方法可以合并cobertura覆盖率xml报告?

32

我有一些C++/C的应用程序,并且有很多单元测试。我希望能够获得整体覆盖率以及每个测试的个别覆盖率,前提是每个测试只能运行一次。

覆盖率的格式必须为XML(Cobertura XML),以便Jenkins Cobertura插件进行处理。

到目前为止,我在编译时生成gcno文件,在使用源代码时生成gcda文件。然后调用gcovr来获取XML文件。

我想创建每个单元测试的覆盖率(因此为每个单元测试创建覆盖率XML文件),然后将这些XML文件合并为一个XML文件。

谢谢!


请参见:https://dev59.com/pHjZa4cB1Zd3GeqPiMg5 - Grzesuav
很不幸,该应用程序相当复杂,并使用cmake脚本构建,没有使用ant/maven。 - jan-hybs
在我的情况下,https://gcovr.com/en/stable/guide/merging.html(即生成JSON文件,然后使用--add-tracefile选项合并)解决了问题。 - Roland Sarrazin
Cobertura现在是否有内置机制来合并XML文件?我正在寻找在JavaScript环境中支持良好的解决方案。 - Mehul Parmar
5个回答

24

最新版本的ReportGenerator可以合并cobertura文件。

您可以从nuget安装它。

用法:

reportgenerator "-reports:target\*\*.xml" "-targetdir:C:\report" -reporttypes:Cobertura

在targetdir目录中生成一个名为Corbertura.xml的文件。

您可以使用dotnet core版本在Linux或Mac上使用它。


太好了。他们还有一个Azure DevOps管道任务,我已经成功地实现了解决像这样的问题。 - wolfyuk

8

我发现最简单的合并Cobertura文件的工具是通过NPM安装 cobertura-merge

用法:

npm install cobertura-merge
cobertura -merge -o output.xml package1=input1.xml package2=input2.xml

或者可以直接使用 npx 而无需安装:

npx cobertura-merge -o output.xml package1=input1.xml package2=input2.xml

这些示例来自GitHub cobertura-merge 说明文档


cobertura-merge 不会合并结果,而是将结果串联起来。当多个测试运行叠加在一起以获得合并的覆盖集时,这并没有帮助。 - Paebbels

6

看起来您正在使用gcovr。从4.2版本开始,使用-a选项,gcovr可以合并其JSON报告。因此,您可以执行以下操作:

# run test1
./test1
gcovr ... --xml coverage-test1.xml --json coverage-test1.json
find . -type f -name '*.gcda' -exec rm {} +

# run test2
./test2
gcovr ... --xml coverage-test2.xml --json coverage-test2.json
find . -type f -name '*.gcda' -exec rm {} +

# combine JSON reports
gcovr -a coverage-test1.json -a coverage-test2.json --xml coverage-combined.xml

1
在Node环境中是否有类似的选项可用于合并XML? - Mehul Parmar

4
我编写了一个Python脚本,可以合并Cobertura报告。它只合并行“命中”数据,并且能够在合并时过滤特定的包。
条件(分支率)覆盖和行覆盖率(行率)百分比值尚未合并。Jenkins插件会重新计算这些值,因此在这种情况下不需要实现(但也许会添加)。
此外,条件覆盖似乎很难合并,因此当报告协作产生最终值时,它无法正常工作(意味着一个文件具有条件覆盖率为50%(2/4),而另一个也具有条件覆盖率50%(2/4),其他两个分支。结果将设置为这两个数字中较高的值,因此仍将是50%(2/4))。

是否有可能使用 PowerShell 脚本将所有 Cobertura 覆盖率 XML 报告合并在一起?因为我不熟悉 Phyton 语言,而且我需要在 TFS 2017 构建摘要中显示合并后的结果。 - SRP

2

我也在寻找解决方案,但在我的情况下,有大约1000个Cobertura XML文件,所有上述脚本在处理这样的数量时都非常慢。

最终,我想出了merge-cobertura.py,这是一个Python脚本,用于合并。然而,它支持的内容相当有限,因为我所需要的只是将OpenCppCoverage的报告合并到Codecov中使用。因此,它只合并线路覆盖率,忽略任何分支信息(来自OpenCppCoverage没有分支信息),并假定所有覆盖率报告都是针对同一路径的。它还将所有包合并为一个。

也许其他人也会发现这个有用,我的博客中有更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接