戏说c第二十六篇: 测试完备性衡量(代码覆盖率)
前言
师弟:“师兄,我又被鄙视了。说我的系统太差,测试不过关。”
我:“怎么说?”
师弟:“每次发布版本给程夏,都被她发现一些bug,太丢人了。师兄,有什么方法来衡量测试的程度么?”
我:“有,代码覆盖率就是一个比较好的方式。”
正文
通过gcov和lcov,可以很直观的看到代码的运行情况,同时也可以查看代码的行覆盖率,函数覆盖率等等信息,为开发提供一个方便的测试手段。
gcov是Linux下GCC自带的一个C/C++代码覆盖率分析工具,因此只要安装了gcc,就具备了。
gcov能够生成代码覆盖信息,但是不够直观,因此需要借助lcov/genhtml直观展示覆盖率,主要特点有:
● 基于Html输出,并生成一棵完整的HTML树
● 输出包括概述、覆盖率百分比、图表,能快速浏览覆盖率数据
● 支持大项目,提供三个级别的视图:目录视图、文件视图、源码视图
具体操作方法
代码编译的时候需要加上编译参数: -ftest-coverage -fprofile-arcs 和库 -lgcov。编译完会生成.gcno文件,然后进行测试,程序正常退出,会有.gcda文件生成。然后根据.gcda生成可视化信息。
Step1: lcov根据.gcda生成info数据
lcov 可以在指定目录去找代码覆盖的信息, 输出为 *.info, 这个 *.info 是一个中间结果 lcov -c -o
code_coverage.info -d .
Step2: 生成html数据
genhtml code_coverage.info -o coverage_result
Step3: 在coverage_result目录启动http服务,就可以通过网页访问
python3 -m http.server
其中第一二步,可以封装脚本为code_coverage.sh:
lcov -c -o code_coverage.info -d . genhtml code_coverage.info -o coverage_result
结果如下
代码行覆盖率21.0%,函数覆盖率39.1%。
详细代码覆盖信息如下,其中标红的表示未测试到的代码行。