单元测试中,我们经常会问一个问题,哪些代码被测到,哪些没有被测到?
Gcov和Lcov可以帮助我们回答这个问题。
Gcov是非常容易使用的,安装完gcc后就应该有gcov了(未确认);Lcov的安装方法看这里:https://www.jianshu.com/p/30679d7531ac
Gcov的原理就是哪些代码被运行到了,哪些代码就是被测过的。Lcov是生成可视化报告的工具。下面看一个最简单的例子:
$ cat a.cpp
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
}
正常编译运行:
$ g++ a.cpp && ./a.out
hello world
带gcov的编译:
$ g++ a.cpp --coverage
生成a.gcno
。
运行a.out
,生成a.gcda
。
接着运行:
$ gcov a.cpp
会产生a.cpp.gcov
,这个文件是可读的,内容如下:
$ cat a.cpp.gcov
-: 0:Source:a.cpp
-: 0:Graph:a.gcno
-: 0:Data:a.gcda
-: 0:Runs:1
-: 1:#include <iostream>
-: 2:
1: 3:int main() {
1: 4: std::cout << "hello world" << std::endl;
1: 5:}
这个文件的读法是,以-
开头的行,是不用覆盖的。以数字n
开头的,表示这一行已经被运行了n次。没有被执行到的以#####
开始,请自行实验。
最后,就是用Lcov生成更清晰的可视化报告:
$ lcov -c -d . -o a.info
$ genhtml a.info
$ firefox index.html

网友评论