1. 安装lcov 2.0

1.1. 介绍

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

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

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

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

image-20231126201406666

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

1.2. 安装lcov

lcov 2.0的安装命令相对来说很简单,就是下面这些。安装lcov之前,需要先安装后文的perl

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

执行完毕后,查看版本号,出现则代表安装成功

1
2
$ lcov --version
lcov: LCOV version 2.0-1

1.3. 可能遇到的问题

在ubuntu上安装可能会遇到如下问题,提示LC_ALL: cannot change locale

image.png

2. perl安装和修改镜像源

2.1. 安装perl

perl的安装命令如下

1
2
3
4
# centos8 安装 perl.
sudo yum install perl
# ubuntu 22.04 安装 perl.
sudo apt install -y perl

用如下命令查看是否安装成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ perl --version

This is perl 5, version 34, subversion 0 (v5.34.0) built for x86_64-linux-gnu-thread-multi
(with 60 registered patches, see perl -V for more detail)

Copyright 1987-2021, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

2.2. perl使用清华镜像源

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

如果你的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

使用清华源就行了 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

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

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

2.3. 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

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覆盖率报告。