首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以将来自两个可执行文件的覆盖率数据与gcov/gcovr合并?

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

Stack Overflow用户
提问于 2015-06-15 02:34:39
回答 1查看 9.5K关注 0票数 23

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

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

代码语言:javascript
复制
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml

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

有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-01 06:18:14

假设您所说的“使用不同的选项进行编译”的意思是,在预处理之后获得不同的输出,在lcov (正如k0n3ru提到的)的帮助下,我能够做到这一点。以下是sut.c文件中的示例代码:

代码语言:javascript
复制
#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文件:

代码语言:javascript
复制
> 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转换器“的帮助下,应该可以将lcov格式的total.info文件转换为cobertura XML输出(尽管我还没有尝试过):https://github.com/eriwen/lcov-to-cobertura-xml

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30833081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档