如何让lcov统计单元测试未包含文件的0%覆盖率及正确行数
如何让lcov统计单元测试未包含文件的0%覆盖率及正确行数
我之前也碰到过和你一模一样的场景——交叉编译ARM目标代码,但单元测试跑在主机上,导致未被测试包含的文件完全没被lcov统计,看起来覆盖率虚高。下面是亲测有效的解决步骤:
第一步:给所有源文件加上gcov编译选项
不管是单元测试用到的文件,还是那些只用于ARM目标、没被测试包含的文件,必须在编译时加上-fprofile-arcs -ftest-coverage这两个选项。这会让编译器生成.gcno文件,里面记录了代码的行数和结构信息——这是lcov能统计总行数的基础,没有它,未测试文件根本不会被纳入统计。
第二步:生成初始覆盖率基线
用lcov的--capture --initial参数来收集所有编译生成的.gcno文件信息,生成一份初始覆盖率报告。这一步相当于给所有文件“建档”,记录它们的总行数,此时未测试文件的覆盖率就是0%。命令示例:
lcov --directory ./your-build-dir --capture --initial --output-file initial_coverage.info
记得把./your-build-dir替换成你实际的编译输出目录,确保所有.gcno文件都在这个目录或其子目录下。
第三步:捕获单元测试后的实际覆盖率
正常运行你的单元测试,测试结束后会生成.gcda文件(记录实际执行的代码路径)。然后用lcov捕获这份测试后的覆盖率数据:
lcov --directory ./your-build-dir --capture --output-file test_coverage.info
第四步:合并初始基线和测试覆盖率数据
把初始的基线数据和测试后的覆盖率数据合并,这样就能得到包含所有文件(包括未测试的)的完整覆盖率信息:
lcov --add-tracefile initial_coverage.info --add-tracefile test_coverage.info --output-file combined_coverage.info
第五步:生成可视化报告
最后用genhtml把合并后的信息转成网页报告,打开后就能看到那些未测试的文件显示0%覆盖率,且正确统计了它们的总行数:
genhtml combined_coverage.info --output-directory coverage_report
额外注意点
- 确保交叉编译那些未测试文件时,使用的gcc版本和主机上运行lcov的gcc版本尽量一致,避免
.gcno文件兼容性问题。 - 如果有不需要统计的文件,可以用lcov的
--remove选项过滤,但如果你要保留未测试文件的统计,就别加这个过滤。 - 运行lcov命令时,目录一定要指定准确,不然会漏掉部分
.gcno文件。
备注:内容来源于stack exchange,提问作者Jan Schatz
相关产品推荐
相关产品推荐

