一.基本介绍

代码覆盖(英语:Code coverage)是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。

二.c++代码结构浅谈

1.编译过程

(1)预处理->编译->汇编->链接
Linux/c++代码覆盖率

2.文件分类

Linux/c++代码覆盖率

  • .h:头文件
  • (.c)(.cc)(.cxx):是C++源文件
  • .cpp:c++源文件,是c++语言的后缀。
  • Linux/c++代码覆盖率
    【cpp 是C++的后缀 C 是C语言的后缀 嵌入标准SQL 语句的程序 后缀为.cp】
  • .xml:配置文件
  • .key:秘钥文件
  • .crt:证书
  • .sh:执行文件
  • .so:链接库
  • .o:编译后的目标文件
  • .s:汇编语言源代码文件
  • .S:经过预编译的汇编语言源代码文件
  • .cfg:配置文件,一般是“config”的缩写,如注册表,日志文件,系统参数,软件配置等
  • Gcda:代码覆盖文件。运行程序后生成的文件。
  • Gcno :
  • 参考文献:https://blog.csdn.net/u012662731/article/details/78531497

三.代码覆盖

1.原理简述

  • [基本块]
    基本块(Basic Block),”A basic block is a sequence of instructions with only entry and only one exit. If any one of the instructions are executed, they will all be executed, and in sequence from first to last.” 这里可以把基本块看成一行整体的代码,基本块内的代码是线性的,要不全部运行,要不都不运行;

  • 【基本块图】
    基本块图(Basic Block Graph),基本块的最后一条语句一般都要跳转,否则后面一条语句也会被计算为基本块的一部分。 如果跳转语句是有条件的,就产生了一个分支(arc),该基本块就有两个基本块作为目的地。如果把每个基本块当作一个节点,那么一个函数中的所有基本块就构成了一个有向图,称之为基本块图(Basic Block Graph)。且只要知道图中部分BB或arc的执行次数就可以推算出所有的BB和所有的arc的执行次数;

  • 【打桩】
    打桩,意思是在有效的基本块之间增加计数器,计算该基本块被运行的次数;打桩的位置都是在基本块图的有效边上;

  • 【行覆盖率】
    行覆盖率(line coverage),源代码有效行数与被执行的代码行的比率;

  • 【分支覆盖率】
    分支覆盖率(branch coverage),有判定语句的地方都会出现2个分支,整个程序经过的分支与所有分支的比率是分支覆盖率。注意,与条件覆盖率(condition coverage)有细微差别,条件覆盖率在判定语句的组合上有更细的划分。

2.核心步骤

1、在组件编译中添加gcov编译参数,然后编译debug版本,同时生成gcno文件
2、在gtest编译中使用添加编译参数的组件
3、执行生成的程序,生成代码覆盖文件gcda
4、使用lcov工具解析gcno和gcda文件,生成html报表文件

3.操作流程

(1)创建一个c++文件:vim test.cc
(2)编译文件:g++ test.cc 【g++是编译C++的编译器】
(3)执行文件:./a.out
(4)安装工具:lcov 【推荐使用命令直接安装:yum install lcov】
(5)添加编译参数:在Makefile文件中添加参数 [-fprofile-arcs -ftest-coverage]
(6)编译文件生成gcno文件:gcc -fprofile-arcs -ftest-coverage test.cc -o test
(7)执行程序生成gcda文件:./test
(8)生成info文件:lcov -c -o test.info -b . -d .
-b指示以当前目录作为相对路径;
-d表示统计目录中的覆盖数据文件而不是内核数据;
-o目标文件,将生成的信息存于-o所示文件;
(9)生成HTML报告:genhtml test.info -o Report

3.代码覆盖报告

(1)报告文件
Linux/c++代码覆盖率
(2)报告信息

  • 主要包括:测试文件名,报告生成日期;代码执行的行数,代码总行数,执行的次数代码覆盖率;方法执行的个数,方法总个数,方法覆盖率。
    Linux/c++代码覆盖率

四.参考文献

1.c++语法教程:http://www.runoob.com/cplusplus/cpp-data-encapsulation.html
2.linux基础教程:http://www.runoob.com/linux/linux-yum.html
3.Linux-(C/C++)动态链接库生成以及使用(libxxx.so):
https://blog.csdn.net/qq_33850438/article/details/52014399
4.代码覆盖率:https://blog.csdn.net/yukin_xue/article/details/7653482
5.gcov代码覆盖率测试-原理和实践总结:
https://blog.csdn.net/yanxiangyfg/article/details/80989680
6.代码覆盖率原理介绍:https://www.cnblogs.com/StitchSun/p/4480229.html

五.实际演练

1.获取项目源码

  • 克隆
    命令:【git clone 分支名 ssh://用户名@ip:port/代码库名】
    下载分支代码:加参数-b(branch).

2.将源码拷贝到目标Linux系统

  • 工具介绍:WinSCP&SecureCRT用来远程Linux服务器;
  • 拷贝文件:可通过sz,rz命令操作。

3.准备编译环境

注:依赖库因项目而定,不同项目依赖的库和编译环境也不一致;
例如:
(1)下载依赖库
(3)下载yum -y install openssl-devel
(4)安装ice3.5.1版本[https://zeroc.com/downloads/ice/3.5#redhat]
(5)下载zookeeper的依赖库;

4.编译代码

(1)修改配置文件,添加参数
生成gcno文件:在Makefile中添加参数-fprofile-arcs -ftest-coverage

(2)编译

  • 执行编译脚本
  • 执行make命令

5.执行程序

  • 直接到当前程序所在目录执行运行命令。

6.检查是否生成gcda文件

  • 源码文件的路径没有改变的情况下,gcda文件会直接生成在gcno的同级目录中。
    -Linux/c++代码覆盖率

7.生成info文件

lcov -c -o report.info -b . -d .

8.生成HTML文件

genhtml report.info -o Report

9.查看HTML文件

  • 直接拷贝当前生成的Report文件到本地,然后使用浏览器打开index.html文件;
    Linux/c++代码覆盖率
    Linux/c++代码覆盖率

相关文章: