如何使用带有ifdef代码的gcovr获得100%的覆盖率?

时间:2019-10-30 19:33:26

标签: linux code-coverage gcov test-coverage gcovr

我喜欢在Linux机器上使用gcovr,以了解测试的内容和未测试的内容。 我掉进了一个坑,那里看不到解决方案。

我有如下所示的C代码(另存为main.c)。该代码非常简单-实际上,重点仅在于#if构造以及如何针对不同的编译设置进行覆盖率分析。

/* Save as main.c */

void fct(int a)
{
// Define PRINTSTYLE to 0 or 1 when compiling
#if PRINTSTYLE==0
    if (a<0) {
        printf("%i is negative\n", a);
    } else {
        printf("%i is ... sorta not negative\n", a);
    }
#else
    if (a<0) {
        printf("%i<0\n", a);
    } else {
        printf("%i>=0\n", a);
    }
#endif
}


int main(void)
{
    fct(1);
    fct(-1);
    return 0;
}

我可以使用以下方法在Linux上进行编译和覆盖测试

$ rm -f testprogram *.html *.gc??
$ gcc -o testprogram main.c \
  -g --coverage -fprofile-arcs -ftest-coverage --coverage \
  -DPRINTSTYLE=0
$ gcovr -r . --html --html-details -o index.html
$ firefox index.main.c.html

这几乎是非常好的-但我要做的是将-DPRINTSTYLE=0(请参见ahove)和-DPRINTSTYLE=1的测试结果结合起来-那么从逻辑上讲,我应该在所产生的索引中获得100%的覆盖率。 main.c.html

我完全理解中间需要重新编译。

如何通过带有ifdef代码的gcovr获得100%的覆盖率?

1 个答案:

答案 0 :(得分:1)

这是可行的-但需要https://gcovr.com/en/stable/guide.html#combining-tracefiles中所示的gcovr 4.2(或更高版本)

首先安装或升级gcovr,例如与

pip install -U gcovr

然后确保〜/ .local / bin /在$ PATH中。

接下来,对每个配置运行一次gcovr,并生成JSON报告:

gcc -o testprogram main.c -g --coverage -DPRINTSTYLE=0
./testprogram
gcovr -r . --json run-1.json

gcc -o testprogram main.c -g --coverage -DPRINTSTYLE=1
./testprogram
gcovr -r . --json run-2.json

最后,使用-a /-add-tracefile模式合并JSON报告并生成所需的报告:

gcovr --add-tracefile run-1.json --add-tracefile run-2.json --html-details coverage.html

参考:https://github.com/gcovr/gcovr/issues/338