是否可以使用 gcov/gcovr 合并来自两个可执行文件的覆盖率数据?

Is it possible to merge coverage data from two executables with gcov/gcovr?

在一个项目中,我 运行 使用不同选项编译的三个不同可执行文件的测试用例。根据选项,某些代码路径是否被采用。现在,我只使用来自一个可执行文件的覆盖率数据。

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

gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml

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

有什么办法吗?

假设 "compiled with different options" 你的意思是你编译后在预处理后获得不同的输出,在 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;
}

with sut.h 仅提供 foo 的声明,以及 test.c 中的简单 main,它调用 foo 并打印结果。然后,通过这一系列命令,我能够创建一个 total.info 文件,其中 sut.c:

的覆盖率为 100%
> 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 输出应该可以在 "lcov to cobertura XML converter" 这里提供(虽然我没试过):https://github.com/eriwen/lcov-to-cobertura-xml

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

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