24

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

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

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

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

有什么办法吗?

4

1 回答 1

12

假设通过“使用不同的选项编译”意味着您进行编译以便在预处理后获得不同的输出,在 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 到 cobertura XML 转换器”,从 lcov 格式的 total.info 文件到 Cobertura XML 输出应该是可能的(尽管我没试过):https ://github.com/eriwen/lcov-to-cobertura-xml

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

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

于 2016-01-31T22:18:13.993 回答