23

我正在尝试将 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

但我得到:

总体覆盖率:
行......:100.0%(60行中的60行)
功能......:100.0%(26个功能中的26)
分支......:未找到数据

有任何想法吗?

4

4 回答 4

35

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

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

  • 编辑您的~/.lcovrc文件(从 /etc/lcovrc 复制)以将lcov_branch_coverage设置更改为 1
  • 添加--rc lcov_branch_coverage=1到您的 lcov 命令行
于 2013-01-25T14:14:50.373 回答
12

.lcovrc 文件是需要放置在 lcov 文件路径中的设置文件。坦率地说,我没有对这个文件的使用进行太多研究。

您需要将附加参数作为“--rc lcov_branch_coverage=1”添加到 lcov for all calls。在您的情况下,将此参数添加到所有三个调用中。如果你错过了一个,它将降低分支覆盖率。

genhtml 还需要 --branch-coverage。

于 2014-07-30T07:08:39.680 回答
0

根据这篇文章,差异可能取决于您使用的 gcc 版本。你能分享你正在使用的版本吗?我没有得到分支覆盖:

 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
于 2014-02-03T19:21:13.157 回答
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;
}

lcov 覆盖表包含行、函数和分支的统计信息。也许仔细检查您实际上正在查看正确的输出 HTML?

于 2012-09-11T14:54:21.313 回答