gpt4 book ai didi

g++ - 是否可以使用gcov/gcovr合并来自两个可执行文件的coverage数据?

转载 作者:行者123 更新时间:2023-12-03 11:59:33 26 4
gpt4 key购买 nike

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

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

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

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

有什么办法吗?

最佳答案

假设“用不同的选项编译”是指您进行编译,以便在预处理之后借助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的结果如下:

enter image description here

编辑(感谢Gluttton提醒我添加此部分):借助此处提供的“lcov到cobertura XML转换器”,应该可以将lcov格式的total.info文件转换为Cobertura XML输出(尽管尚未尝试过): https://github.com/eriwen/lcov-to-cobertura-xml

但是,可以合并承保范围信息这一事实当然并不意味着这样做是一个好主意:IMO承保范围在测试套件质量方面的信息值(value)有限。来自不同预处理器输出的合并覆盖结果将进一步降低该值。

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

关于g++ - 是否可以使用gcov/gcovr合并来自两个可执行文件的coverage数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30833081/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com