【Linux】lcov2.0安装和perl修改镜像源
1. 安装lcov 2.0
1.1. 介绍
你可能不知道lcov是什么,简而言之,它是一个代码单元测试覆盖率的显示工具,基于gcov。
- 什么是单元测试覆盖率?
我们需要对项目中的每个函数编写单元测试,其实就是测试函数的功能。通过gcc/g++的相关编译选项,可以得到一个gcda文件,内部包含某个cpp文件中相关函数被执行了多少次,以及某些if/switch中的多分支是否覆盖上了;
lcov就可以解析这些gcda文件,得到如下图所示的函数测试覆盖率的报告
包括单元测试在内,这部分对代码函数测试的操作一般被称之为代码的功能安全
,这里就不多说了。
1.2. 安装lcov
lcov 2.0的安装命令相对来说很简单,就是下面这些。安装lcov之前,需要先安装后文的perl。
1 | wget https://github.com/linux-test-project/lcov/releases/download/v2.0/lcov-2.0.tar.gz |
执行完毕后,查看版本号,出现则代表安装成功
1 | $ lcov --version |
1.3. 可能遇到的问题
在ubuntu上安装可能会遇到如下问题,提示LC_ALL: cannot change locale
。
2. perl安装和修改镜像源
2.1. 安装perl
perl的安装命令如下
1 | # centos8 安装 perl. |
用如下命令查看是否安装成功。
1 | ❯ perl --version |
2.2. perl使用清华镜像源
使用lcov的时候需要perl module,此时就需要修改perl的镜像源。默认的perl module的源是在国外的,国内基本上是完全用不了。
如果你的lcov运行的时候遇到下面类似的错误,那么就是因为perl缺少对应module导致的,比如如下报错是因为缺少Capture::Tiny
这个module。
1 | Can't locate Capture/Tiny.pm in @INC (you may need to install the Capture::Tiny module) (@INC contains: /usr/local/lib/lcov /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5) at /usr/local/lib/lcov/lcovutil.pm line 14. |
使用清华源就行了 https://mirrors.tuna.tsinghua.edu.cn/help/CPAN/。
因为我用的centos的系统,安装的perl版本很老,v5.26.3
,所以这里记录一个手动修改镜像源的办法。
在root用户下执行如下命令,会进入一个perl的命令行
1 | perl -MCPAN -e shell |
在perl的命令行中执行如下命令
1 | o conf init |
最终展现的结果应该如下,会自动往当前用户的家目录下创建一个配置文件
这里创建的配置文件是在root用户下,输入quit
退出perl的命令行后,我们直接vim打开这个配置文件
1 | vim /root/.cpan/CPAN/MyConfig.pm |
在里面找到urllist选项,根据已有格式添加一个新的镜像路径就可以了
我这里添加后的urllist配置项如下,第一项是镜像源就OK
1 | 'urllist' => [q[https://mirrors.tuna.tsinghua.edu.cn/CPAN/], q[http://www.cpan.org/]], |
但是要注意一下,在我这边的网络环境中,清华源在perl安装包的时候也容易抽风,我试出来比较稳定的ip如下,将其写入/etc/hosts
文件中,这样安装perl包的时候就不会timeout了
1 | 101.6.15.130 mirrors.tuna.tsinghua.edu.cn |
这个ip后续可能会有变化啊,请以你的实际情况为准!
2.3. perl安装module
后续安装包的时候,就可以用上镜像源了,安装包的语句如下,请注意这个安装语句最后还有个英文的单引号,一定不要把他删了!
1 | sudo perl -MCPAN -e 'install "包名"' |
我需要用perl是因为要用到lcov,在lcov仓库的readme里面提到了lcov需要的perl包,一个一个安装就行了(以下节选自lcov2.0
的仓库README)
1 | These perl packages include: |
比如我需要安装Capture::Tiny
包,就用如下命令
1 | sudo perl -MCPAN -e 'install "Capture::Tiny"' |
正常安装的命令输出结果如下图所示
2.4. ubuntu安装perl module
如果是ubuntu,安装perl的包会方便一点,因为apt源里面是有perl的module。
你可以根据perl的包名中的关键字,尝试在apt list
里面找找有没有对应的包。有的话,直接apt下载就可以了。
1 | sudo apt list | grep 包名 |
比如datetime和capture-tiny这两个perl moudle就可以直接通过apt install来安装。
1 | sudo apt install -y libcapture-tiny-perl libdatetime-perl |
3. 使用lcov
对于lcov2.0的命令使用,可以参考我的linux仓库中的测试
https://gitee.com/musnows/raspberry-practice/tree/master/lcov_test
使用lcov时,g++编译需要在原有命令之后添加如下选项
1 | -fprofile-arcs -ftest-coverage -fprofile-update=atomic |
选项-ftest-coverage
可以让g++编译器在代码中插入额外的指令,来确认某部分的代码是否执行了,一般要和-fprofile-arcs
连用才能产生完整的覆盖率报告。程序运行后会产生.gcda
文件,记录了覆盖率信息,lcov依赖于.gcda
产生最终的html覆盖率报告。