22

我有带有大量单元测试的 c++/c 应用程序。我想获得每个测试的整体覆盖率以及每个测试的单独覆盖率,条件是每个测试只能运行一次。覆盖格式必须是 xml (cobertura xml),jenkins cobertura 插件才能处理。

到目前为止,我在编译时生成 gcno 文件,在使用 source 时生成 gcda 文件。然后调用 gcovr 获取 xml 文件。

我想创建每个单元测试的覆盖率(从而为每个单元测试创​​建覆盖率 xml),然后将这些 xml 文件合并到一个 xml 文件中。

谢谢!

4

5 回答 5

20

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

您可以从nuget安装它

用法:

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

在 targetdir 目录中生成一个文件Corbertura.xml

可以使用dotnet core版本在linux或者mac上使用

于 2018-09-19T18:22:13.717 回答
4

我发现的用于合并 Cobertura 文件的最简单实用程序是cobertura-merge通过 NPM。

用法:

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.

于 2019-10-31T18:07:01.293 回答
4

看来您正在使用 gcovr。从 4.2 版开始,gcovr 可以将其 JSON 报告与-a选项合并。所以你可以这样做:

# 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
于 2020-02-01T13:00:58.237 回答
3

我编写了可以将 cobertura 报告合并在一起的python 脚本。它只合并行“命中”,并且能够在合并时过滤特定的包。

条件( branch-rate ) 覆盖率和线路覆盖率 ( line-rate ) 百分比值尚未合并。Jenkins 插件重新计算这些值,因此在这种情况下它不必实现(但也许它会)。

此外,条件覆盖似乎不容易组合在一起,因此当报告在最终值上合作时它不起作用(意味着一个文件具有条件覆盖50% (2/4),另一个文件也具有条件覆盖50% (2/4)其他两个分支。结果设置为更高这两个数字所以它仍然是50% (2/4)

于 2014-11-19T08:51:16.400 回答
1

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

最后,我提出了merge-cobertura.py一个执行合并的 Python 脚本。但是,它支持的内容非常有限,因为我只需要合并来自OpenCppCoverage的报告以在Codecov使用。所以它只是合并行命中,忽略任何分支信息(没有来自 OpenCppCoverage)并假设所有覆盖率报告都是针对同一路径的。它还将所有包合并为一个。

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

于 2017-03-30T08:20:59.470 回答