安装lcov 2.0

你可能不知道lcov是什么,简而言之,它是一个代码单元测试覆盖率的显示工具,基于gcov。

  • 什么是单元测试覆盖率?

我们需要对项目中的每个函数编写单元测试,其实就是测试函数的功能。通过gcc/g++的相关编译选项,可以得到一个gcda文件,内部包含某个cpp文件中相关函数被执行了多少次,以及某些if/switch中的多分支是否覆盖上了;

lcov就可以解析这些gcda文件,得到如下图所示的函数测试覆盖率的报告

image-20231126201406666

包括单元测试在内,这部分对代码函数测试的操作一般被称之为功能安全,这里就不多说了。

lcov 2.0的安装命令相对来说很简单,就是下面这些

1
2
3
4
wget https://github.com/linux-test-project/lcov/releases/download/v2.0/lcov-2.0.tar.gz
tar -zxvf lcov-2.0.tar.gz
cd lcov-2.0
sudo make install

perl

使用lcov的时候需要perl,此时就需要修改镜像源。默认的perl module的源是在国外的,国内基本上是完全用不了。

1
2
# centos8 安装perl
sudo yum install perl

如果你的lcov运行的时候遇到下面类似的错误,那么就是因为perl缺少对应module导致的,比如如下报错是因为缺少Capture::Tiny这个module;

1
2
3
4
5
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.
BEGIN failed--compilation aborted at /usr/local/lib/lcov/lcovutil.pm line 14.
Compilation failed in require at /usr/local/bin/lcov line 102.
BEGIN failed--compilation aborted at /usr/local/bin/lcov line 102.
make: *** [makefile:6: lcov] Error 2

perl使用清华源

使用清华源就行了 https://mirrors.tuna.tsinghua.edu.cn/help/CPAN/

因为我用的centos的系统,安装的perl版本很老,v5.26.3,所以这里记录一个手动修改镜像源的办法

1
perl --version

在root用户下执行如下命令,会进入一个perl的命令行

1
perl -MCPAN -e shell

在perl的命令行中执行如下命令

1
o conf init

最终展现的结果应该如下,会自动往当前用户的家目录下创建一个配置文件

image-20231126200126012

这里创建的配置文件是在root用户下,输入quit退出perl的命令行后,我们直接vim打开这个配置文件

1
vim /root/.cpan/CPAN/MyConfig.pm

在里面找到urllist选项,根据已有格式添加一个新的镜像路径就可以了

image-20231126200230352

我这里添加后的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后续可能会有变化啊,请以你的实际情况为准!

perl安装module

后续安装包的时候,就可以用上镜像源了,安装包的语句如下,请注意这个安装语句最后还有个英文的单引号,一定不要把他删了!

1
sudo perl -MCPAN -e 'install "包名"'

我需要用perl是因为要用到lcov,在lcov仓库的readme里面提到了lcov需要的perl包,一个一个安装就行了(以下节选自lcov2.0的仓库README)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
These perl packages include:

- Capture::Tiny
- DateTime
- Devel::Cover
- Digest::MD5
- File::Spec
- at least one flavor of JSON module.
In order of performance/preference:
- JSON::XS
- Cpanel::JSON::XS
- JSON::PP
- JSON
- Memory::Process
- Module::Load::Conditional
- Scalar::Util
- Time::HiRes

If your system is missing any of these, then you may be able to install them
via:

$ perl -MCPAN -e 'install "packageName"'

比如我需要安装Capture::Tiny包,就用如下命令

1
sudo perl -MCPAN -e 'install "Capture::Tiny"'

正常安装的命令输出结果如下图所示

image-20231126201023622

ubuntu安装perl module

如果是ubuntu,安装perl的包会方便一点,因为apt源里面是有perl的module

1
2
# ubuntu 22.04 可以直接安装下面的依赖项,就可以使用lcov 2.0了
sudo apt install -y perl libcapture-tiny-perl libdatetime-perl

你可以根据perl的包名中的关键字,尝试在apt list里面找找有没有对应的包

1
sudo apt list | grep 包名

使用lcov

对于lcov2.0的命令使用,可以参考我的linux仓库中的测试

https://gitee.com/musnows/raspberry-practice/tree/master/lcov_test