是否可以将两个可执行文件的覆盖率数据与gcov/gcovr合并?

Bap*_*cht 21 code-coverage g++ gcov gcovr

在一个项目中,我在三个不同的可执行文件上运行测试用例,使用不同的选项进行编译.根据选项,可以使用或不使用某些代码路径.现在,我只使用一个可执行文件的覆盖数据.

我正在使用gcovr生成一个XML,然后由Sonar解析:

gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
Run Code Online (Sandbox Code Playgroud)

我有三套gcda和gcno文件,但我不知道如何生成它们的全局报告.

有没有办法做到这一点?

Dir*_*ann 9

假设通过“使用不同选项编译”,您的意思是您进行编译以便在预处理后获得不同的输出,在 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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

然后对于 sut.c 显示以下结果:

在此处输入图片说明

编辑(感谢 Gluttton 提醒我添加这部分):在此处提供的“lcov 到 cobertura XML 转换器”的帮助下,从 lcov 格式的 total.info 文件到 Cobertura XML 输出应该是可能的(尽管我还没有尝试过):https : //github.com/eriwen/lcov-to-cobertura-xml

然而,可以合并覆盖信息这一事实并不意味着这样做是一个好主意:覆盖,IMO,对于测试套件的质量只有有限的信息价值。合并来自不同预处理器输出的覆盖结果将进一步降低该值。

这是因为开发人员了解他们没有考虑过的场景的可能性将会减少:通过使用条件编译,代码的控制结构和数据流在预处理器输出之间可能会有很大差异 - 覆盖信息来自测试的“覆盖”结果对不同的预处理器输出运行可以使对结果的有意义的解释变得不可能。