在一个项目中,我在三个不同的可执行文件上运行测试用例,使用不同的选项进行编译。根据选项,可以使用或不使用某些代码路径。现在,我只使用一个可执行文件的覆盖数据。
我使用gcovr生成一个XML,然后由Sonar解析:
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
我有三套gcda和gcno文件,但我不知道如何生成它们的全局报告。
有没有办法做到这一点?
答案 0 :(得分:3)
假设通过"编译了不同的选项"你的意思是你编译使得你在预处理之后获得不同的输出,在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;
}
sut.h只提供foo的声明,而test.c中有一个简单的main,它调用foo并打印结果。然后,通过这一系列命令,我能够为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格式的total.info文件到Cobertura XML输出应该可以借助&#34; lcov到cobertura XML转换器& #34;这里提供(虽然我没有尝试过):https://github.com/eriwen/lcov-to-cobertura-xml然而,合并覆盖范围信息的事实并不意味着这样做是个好主意:覆盖范围IMO对测试套件的质量只有有限的信息价值。合并不同预处理器输出的覆盖率结果甚至会进一步降低此值。
这是因为开发人员了解他们未考虑的场景的可能性将会减少:通过使用条件编译,代码的控制结构和数据流在预处理器输出之间可能会有很大差异 - 来自&#39的覆盖率信息;覆盖&#39;不同预处理器输出的测试运行结果可以对结果进行有意义的解释。