生成lcov的分支覆盖数据

Hug*_*ugo 19 c++ testing code-coverage lcov

我正在尝试将lcov用于代码覆盖率指标,但我无法使分支机构覆盖工作.

这是我如何使用它:

g++ -ggdb3 --coverage src/read.c tests/test.cpp -o bin/test 
lcov --zerocounters --directory $PWD 
lcov --capture --initial --directory $PWD --output-file coverage_output  
./bin/test 
lcov --no-checksum --directory $PWD --capture --output-file coverage_output 
genhtml --branch-coverage --highlight --legend --output-directory out coverage_output
Run Code Online (Sandbox Code Playgroud)

但我得到:

整体覆盖率:
线......:100.0%(60行中60个)
函数..:100.0%(26个函数中的26个)
分支...:未找到数据

有任何想法吗?

小智 30

最新版本的LCOV默认禁用分支覆盖.

您需要通过以下任一方式重新启用它:

  • 编辑~/.lcovrc文件(从/ etc/lcovrc复制)将lcov_branch_coverage设置更改为1
  • 添加--rc lcov_branch_coverage=1到您的lcov命令行

  • 正如Abhay Joshi在下面所说:记得在每个lcov调用中添加--rc行,否则它将丢弃分支统计信息.另外,genhtml选项是--rc genhtml_branch_coverage = 1 (6认同)
  • 您是否偶然地知道此更改的理由?凭直觉,这感觉很不对劲。 (2认同)
  • 如果您想使用“lcov -l file.info”输出基于文本的摘要,则“--rc lcov...”参数不起作用。所以编辑`.locvrc`文件似乎是更好的选择 (2认同)

Abh*_*shi 5

.lcovrc文件是需要放置在lcov文件路径中的设置文件。坦白说,我对该文件的使用并没有做太多研究。

您需要为所有调用的 lcov添加附加参数“ --rc lcov_branch_coverage = 1” 。在您的情况下,请将此参数添加到所有三个调用中。如果错过一个,它将降低分支机构的覆盖范围。

genhtml也需要--branch-coverage。


Tom*_*ing 0

抱歉,与其说是一个“想法”,不如说是确认您所做的一切都是正确的。您的确切命令适用于这个简单的代码:

#include <iostream>
using namespace std;

bool foo(int i)
{
    if (i != 0) {
        return 12 / i;
    } else {
        return 0;
    }
}

int main(int argc, char** argv)
{
    cout << foo(argc) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

lcov 覆盖表包含线路、函数和分支的统计信息。也许仔细检查您是否确实看到了正确的输出 HTML?