我有一些C++/C的应用程序,并且有很多单元测试。我希望能够获得整体覆盖率以及每个测试的个别覆盖率,前提是每个测试只能运行一次。
覆盖率的格式必须为XML(Cobertura XML),以便Jenkins Cobertura插件进行处理。
到目前为止,我在编译时生成gcno文件,在使用源代码时生成gcda文件。然后调用gcovr来获取XML文件。
我想创建每个单元测试的覆盖率(因此为每个单元测试创建覆盖率XML文件),然后将这些XML文件合并为一个XML文件。
谢谢!
我有一些C++/C的应用程序,并且有很多单元测试。我希望能够获得整体覆盖率以及每个测试的个别覆盖率,前提是每个测试只能运行一次。
覆盖率的格式必须为XML(Cobertura XML),以便Jenkins Cobertura插件进行处理。
到目前为止,我在编译时生成gcno文件,在使用源代码时生成gcda文件。然后调用gcovr来获取XML文件。
我想创建每个单元测试的覆盖率(因此为每个单元测试创建覆盖率XML文件),然后将这些XML文件合并为一个XML文件。
谢谢!
最新版本的ReportGenerator可以合并cobertura文件。
您可以从nuget安装它。
用法:
reportgenerator "-reports:target\*\*.xml" "-targetdir:C:\report" -reporttypes:Cobertura
在targetdir目录中生成一个名为Corbertura.xml的文件。
您可以使用dotnet core版本在Linux或Mac上使用它。
我发现最简单的合并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看起来您正在使用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
50%(2/4)
,而另一个也具有条件覆盖率50%(2/4)
,其他两个分支。结果将设置为这两个数字中较高的值,因此仍将是50%(2/4)
)。我也在寻找解决方案,但在我的情况下,有大约1000个Cobertura XML文件,所有上述脚本在处理这样的数量时都非常慢。
最终,我想出了merge-cobertura.py,这是一个Python脚本,用于合并。然而,它支持的内容相当有限,因为我所需要的只是将OpenCppCoverage的报告合并到Codecov中使用。因此,它只合并线路覆盖率,忽略任何分支信息(来自OpenCppCoverage没有分支信息),并假定所有覆盖率报告都是针对同一路径的。它还将所有包合并为一个。
也许其他人也会发现这个有用,我的博客中有更多详细信息。