距离上次更新本文已经过去了 180 天,文章部分内容可能已经过时,请注意甄别

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

bash
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

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

bash
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 的安装命令如下

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

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

bash
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。

plaintext
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 的命令行

bash
1
perl -MCPAN -e shell

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

bash
1
o conf init

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

image-20231126200126012

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

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

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

image-20231126200230352

我这里添加后的 urllist 配置项如下,第一项是镜像源就 OK

plaintext
1
'urllist' => [q[https://mirrors.tuna.tsinghua.edu.cn/CPAN/], q[http://www.cpan.org/]],

但是要注意一下,在我这边的网络环境中,清华源在 perl 安装包的时候也容易抽风,我试出来比较稳定的 ip 如下,将其写入 /etc/hosts 文件中,这样安装 perl 包的时候就不会 timeout 了

plaintext
1
101.6.15.130 mirrors.tuna.tsinghua.edu.cn

这个 ip 后续可能会有变化啊,请以你的实际情况为准!

2.3. perl 安装 module

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

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

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

plaintext
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 包,就用如下命令

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

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

image-20231126201023622

2.4. ubuntu 安装 perl module

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

你可以根据 perl 的包名中的关键字,尝试在 apt list 里面找找有没有对应的包。有的话,直接 apt 下载就可以了。

bash
1
sudo apt list | grep 包名

比如 datetime 和 capture-tiny 这两个 perl moudle 就可以直接通过 apt install 来安装。

bash
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++ 编译需要在原有命令之后添加如下选项

shell
1
-fprofile-arcs -ftest-coverage -fprofile-update=atomic

选项 -ftest-coverage 可以让 g++ 编译器在代码中插入额外的指令,来确认某部分的代码是否执行了,一般要和 -fprofile-arcs 连用才能产生完整的覆盖率报告。程序运行后会产生.gcda 文件,记录了覆盖率信息,lcov 依赖于.gcda 产生最终的 html 覆盖率报告。