《编码 – 代码分析》代码覆盖检测

1 代码覆盖率概述

覆盖率(code coverage rate)是反映测试用例对被测软件覆盖程度的重要指标,也是衡量测试工作进展情况的重要指标。在代码逻辑比较复杂的情况下,测试工作往往只能覆盖到显而易见的逻辑分支,而更多的深层次的逻辑分支则不容易被测试人员发现。为了保证测试的覆盖率,有些开发人员会尝试协助测试人员写出所有的测试用例,这不仅会牺牲大量的宝贵的开发时间,同时也拥有一定的难度,最重要原因就是因为测试难以量化。而代码覆盖工具就是用来量化代码测试的覆盖率,让测试人员可以直观的发现那些没有覆盖到的代码分支。

代码覆盖率是评价单元测试的效果的一个重要指标。在实际的工作中,通常使用代码覆盖率来评价单元测试的效果。

代码覆盖率可以由语句覆盖率和分析分析率两个方面来进行评估。

  • 语句覆盖率是指在测试过程中实际得到执行的语句数和代码总语句数之间的比值。比如总共有 100 条语句,在测试过程中有 80 条语句得到执行,那么语句覆盖率就是 80%。

  • 分支覆盖率是指在程序的控制流图中实际得到执行的分支数和总分支数据之间的比值。例比如总共有 100 个分支,在测试过程中实际有 80 个分支得到执行,那么分支覆盖率就是 80%。 可以简单的理解为控制流图中每一条线性无关路径即为一个分支。

2 Windows 下覆盖率分析工具

OpenCppCoverage是Windows平台下开源的C++代码覆盖率工具,使用简单,功能齐全而强大。

使用起来非常简单,它不需要在编译时插桩,只需要有pdb文件,运行时插桩,通过OpenCppCoverage启动进程即可。功能也比较全,主要特点有:

 不需要重新编译被测程序,只需要使用penCppCoverage运行程序
 性能开销比较小
 按模块、代码路径过滤
 自动生成html覆盖率结果报告
 支持多个覆盖率结果合并
 集成Jenkins

OpenCppCoverage 是与Visual Studio 配合使用的一个代码覆盖率分析工具,当测试程序使用Visual Studio编译时,就可以使用这个工具进行代码覆盖率分析,为了能够进行分析,应用程序必须编译为Debug版本。

源码地址

OpenCppCoverage可以单独下载安装,也可以作为插件在VisualStudio的进行安装。这里以单独下载安装为例。

2.1 OpenCppCoverage单独安装与使用

2.1.1 下载安装

OpenCppCoverage下载地址

zz2gAI.md.png

根据自身环境选择x86或者x64版本进行安装。

安装过程比较简单,只需要注意一点:勾选将运行目录添加到环境变量中(默认也是勾选)。

zz22Nt.png

2.1.2 使用

OpenCppCoverage最简单的运行格式为:

OpenCppCoverage.exe –sources MySourcePath* — YourProgram.exe arg1 arg2

以如下的TestOpenCppCoverage工程为例,工程由utils.c、utils.h和main.c组成。

工程的代码目录为:
C:\Users\ouxiaolong\Desktop\TestOpenCppCoverage\TestOpenCppCoverage\src

工程的输出程序为:
C:\Users\ouxiaolong\Desktop\TestOpenCppCoverage\Debug\TestOpenCppCoverage.exe

运行CMD,运行命令:
OpenCppCoverage –sources C:\Users\ouxiaolong\Desktop\TestOpenCppCoverage\TestOpenCppCoverage\src — C:\Users\ouxiaolong\Desktop\TestOpenCppCoverage\Debug\TestOpenCppCoverage.exe

zz2R4P.md.png

输出信息说明,生成的html文件(index.html)位于:

C:\Users\ouxiaolong\Desktop\TestOpenCppCoverage\CoverageReport-2022-12-09-11h47m10s。

zz2f9f.md.png

单击C:\Users\ouxiaolong\Desktop\TestOpenCppCoverage\Debug\TestOpenCppCoverage.exe即可对文件进一步分析。

zz24gS.md.png

绿色部分表示已覆盖到的部分,红色部分表示未覆盖的部分。

2.2 作为Visual Studio插件

2.2.1 插件安装

打开VisualStudio –> 工具 –> 扩展和更新 –> 联机 –> 右上角输入OpenCppCoverage,在下面的结果会出现“OpenCppCoverage Plugin”点击安装即可(安装中需要将VisualStudio重启)。

zz25jg.md.png

2.2.2 使用

程序写好,编译执行之后,点击“工具 –> Run OpenCppCoverage”,程序运行。

zz2ouQ.png

将命令行窗口关掉,则代码会出现红色或者绿色的阴影,下面会出现Coverage的报告,如下图。

zz27Hs.md.png

3 Linux下覆盖率分析工具

3.1 Lcov简介

gcov是一个测试代码覆盖率的程序,正确地使用它搭配 gcc 可以分析、帮助你将代码写得更高效。帮助你优化程序。类似于一个profiling tool,使用 gcov 或者 gprof,可以收集到一些基础的性能统计数据。比如:

 每一行代码执行的频度
 每个代码文件中实际被执行到的行数
 每一个代码块执行使用的时间

gcov创建一个logfile叫做 源文件名称.gcxx (这里的源文件名称指的是.c或者.cc文件的文件名),表示的是这个 源文件.c 中每一行所被执行的次数。这些文件可以配合gprof使用。

gcov要工作只能用gcc编译这些代码。和其他的profiling 或者 测试代码覆盖率的机制不兼容。

fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。

Lcov是GCC覆盖率测试工具gcov的前端图形工具。它通过收集多个源文件的 行、函数和分支的代码覆盖信息并且将收集后的信息生成HTML页面。生成HTML需要使用genhtml命令。

3.2 Lcov安装

在Linux 中安装 lcov 非常简单,只要使用如下命令即可完成 lcov 的安装。

$ sudo apt-get install lcov

安装完成后,后续就可以使用 lcov 生成代码覆盖率报告。

3.3 Lcov使用

Step1 : 使用 GCC 以 -fprofile-arcs 和-ftest-coverage 选项编译程序。

$ gcc -fprofile-arcs -ftest-coverage -o test test.c

则会在当前目录下生成test.gcno和test.gcda文件

注:一般情况,gcda和gcno会在同一个目录,假如在编译机器上面是test/path,编译的时候会在这个目录下生成.gcno文件,那么在执行机器上也会生成.gcda文件在test/path目录下。如果要使用lcov统计覆盖率,必须将gcno和gcda放在同一个目录,并且有源代码,且源代码的目录和编译时的目录一样,否则不能生成。

Step2: 运行程序

$ ./test

Step3: 然后该目录下执行lcov

$ lcov --directory . --capture --output-file app.info

其中:
–directory 或者-d 表示的是目录,也就是gcno和gcda目录
–capture 或者 -c 表示获取覆盖率信息
–output-file 或者 -o 表示输出文件

Step4: 获取 HTML 输出
生成 html 格式的报告比较简单, 只要在 coverage 目录下使用以下的命令就可以生成html 格式的报告。

$ genhtml -o results app.info

results是一个目录,index.html为导航文件,使用 web 浏览器打开 index.html 文件查看代码覆盖结果。

zz2qNq.md.png

也可查看更加详细的信息。

zz2L40.md.png

如要查看某个文件具体的信息,点击对应的文件名即可,打开的文件详细信息页面。

zz2XCV.md.png


欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎

Related posts

Leave a Comment