在一个项目中,我正在运行三个不同选项编译的可执行文件上的测试用例。根据选项,某些代码路径会被采取或不采取。目前,我只使用一个可执行文件的覆盖率数据。
我正在使用 gcovr 生成一个 XML 文件,然后通过 Sonar 解析:
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
我有三组gcda和gcno文件,但是不知道如何生成它们的全局报告。
有没有什么方法可以做到这一点?
在一个项目中,我正在运行三个不同选项编译的可执行文件上的测试用例。根据选项,某些代码路径会被采取或不采取。目前,我只使用一个可执行文件的覆盖率数据。
我正在使用 gcovr 生成一个 XML 文件,然后通过 Sonar 解析:
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
我有三组gcda和gcno文件,但是不知道如何生成它们的全局报告。
有没有什么方法可以做到这一点?
假设你所说的“使用不同选项编译”是指在预处理后获得不同输出,我使用lcov(正如k0n3ru所提到的)就可以实现。这是文件 sut.c 中的示例代码:
#include "sut.h"
#include <limits.h>
int foo(int a) {
#if defined(ADD)
a += 42;
#endif
#if defined(SUB)
a -= 42;
#endif
return a;
}
只提供foo的声明和test.c中调用foo并打印结果的简单main函数,sut.h并未提供具体实现。接着,通过以下命令序列,我能够为sut.c创建一个总覆盖率为100%的total.info文件:
> g++ --coverage -DADD test.c sut.c -o add.out
> ./add.out
> lcov -c -d . -o add.info # save data from .gdda/.gcno into add.info
> g++ --coverage -DSUB test.c sut.c -o sub.out
> ./sub.out
> lcov -c -d . -o sub.info # save again, this time into sub.info
> lcov -a add.info -a sub.info -o total.info # combine them into total.info
> genhtml total.info
对于sut.c,以下是显示的结果:
编辑(感谢Gluttton提醒我添加这一部分):通过使用此处提供的“lcov to cobertura XML converter”,可以从以lcov格式呈现的total.info文件转换为Cobertura XML输出(尽管我尚未尝试过):https://github.com/eriwen/lcov-to-cobertura-xml
然而,能够合并覆盖信息并不意味着这么做是一个好主意:在我看来,覆盖率对于测试套件的质量只有有限的信息价值。从不同的预处理器输出中合并覆盖率结果甚至会进一步降低这个价值。
这是因为开发人员了解到他们没有考虑的情况的可能性将会减少:通过使用条件编译,代码的控制结构和数据流在预处理器输出之间可能会非常不同——从不同的预处理器输出中“叠加”测试运行结果的覆盖率信息可能会使结果的有意义解释变得不可能。
html
转换为 xml
(Cobertura)格式? - Gluttton