C++ 代码覆盖率分析工具

本文对C++相关的代码覆盖率分析工具进行调研,作出简要的总结


内容提要

  1. Squish Coco (收费)
  2. OpenCppConverage (开源)

Squish Coco

简介

quish Coco是Tcl,QML,C#和C / C ++程序(包括SystemC程序)的完整代码覆盖工具链。它运行在macOS,Linux™和Microsoft®Windows上。

Squish Coco分析应用程序运行的方式,例如 可作为测试套件的一部分进行使用,然后可以利用其结果使测试更有效和完整。

功能

Squish Coco在一下方面的帮助尤为突出:

  1. 找到未经测试的代码部分。

  2. 找到可以消除的冗余测试。Squish Coco可以识别测试涵盖源了代码的哪些部分。它可以检测新测试是否涵盖了现有测试未涵盖的源代码。

  3. 通过显示从未执行过的代码来查找死代码。

  4. 计算最佳测试执行顺序,以便最大化每次运行的测试覆盖率。这对手动测试特别有用。

  5. 分析应用程序的两个单独版本并比较差异。这使得可以查看哪些测试受到源代码修改的影响,并且还可以测量补丁或修补程序的测试覆盖率。

  6. 衡量程序和测试的执行时间。

Squish Coco可用于测试的每个阶段和所有测试方法(单元测试,自动测试,手动白盒测试,黑盒测试等)。 测试套件可以分为各个独立部分,Squish Coco可以将多个执行报告合并为一个统一的报告。

组件

Squish Coco包的主要组件是两个独立的工具和一个插件:

  1. CoverageScanner: 一个分析和检测Tcl,QML,C#和C/C++应用程序的程序。

  2. CoverageBrowser - 用于显示和管理覆盖率分析结果的程序。

  3. Microsoft®VisualStudio® Add-In - 一个可选插件,用于为Microsoft®VisualStudio®下开发的C#或C ++项目配置代码覆盖率。

此外还有几个辅助程序用于报告生成,覆盖数据操作和许可证管理。

CoverageScanner – Instrumentation as part of the build process

CoverageScanner可以检测编译器看到的源代码,而无需触及原始代码。 它生成一个检测的可执行文件,共享库或插件。 检测会跟踪运行可执行文件或使用库或插件时执行的代码。 能够测算每行执行次数、是否执行了某一行。 当检测程序终止时,会生成执行报告。

为了获得高质量的覆盖率测量,CoverageScanner不仅可以在方法和语句级别上使用,还可以记录语句覆盖率和决策覆盖率信息。

此外,还可以将测试名称和执行状态(即“通过”或“失败”)插入到报告中。 这可以通过脚本或直接从应用程序完成。 进一步,可以将CoverageScanner集成到测试框架(如CppUnit或CxxTest)中,在该框架中为每个测试生成单独的覆盖信息。

CoverageScanner是一个命令行工具,它取代了通常用于构建可执行文件,库或插件的编译器。 它将特殊的检测指令插入到预处理的源代码中,然后使用原始编译器编译修改后的代码。 同时,生成数据库(.csmes文件)以供以后分析。 它包含仪器列表和检测源代码的副本。

在编译之后,可以像往常一样运行检测的可执行文件(并且可以通过访问它们的程序使用检测的库或插件),但是现在,当程序终止时,生成执行报告(.csexe文件)。

CoverageScanner几乎适用于任何标准编译器,包括GNU gcc,GNU g ++,Microsoft®VisualStudio®6.0,.NET,Express和嵌入式C ++,英特尔®C++等。对于大多数其他编译器,可以轻松配置CoverageScanner。

CoverageBrowser – Viewing, analyzing and managing code coverage results

可以使用CoverageBrowser工具分析和管理.csexe文件中的执行报告。 该程序具有GUI图形用户界面,用户可以通过GUI浏览和管理其执行报告。 这样可以直接找到未经测试或无法访问的代码以及低效的测试。

CoverageBrowser的能力总结如下:

  • 向已检测的源代码行添加注释。

  • 在树视图中显示执行列表。

  • 标记无法测试的代码段为“手动验证”。

  • 浏览已检测的代码。

  • 在覆盖级别之间切换:决策覆盖,条件覆盖和语句块覆盖。

  • 显示工具状态的详细说明。 这包括:

    • 用户评论。

    • 每个已检测语句的状态:已执行,未执行,已部分执行。

    • 执行检测语句的次数。

    • 执行检测语句的测试列表。

  • 从自动测试套件中检索执行状态。

  • 单元测试的代码覆盖率分析。

  • 将结果导出到电子表格。

  • 测试效益分析模式可以查看一组测试添加的附加代码覆盖范围。

  • 源代码和函数浏览器,显示每个文件,每个类,每个命名空间以及每个Tcl,QML,C#和C / C ++函数的代码覆盖率统计信息。

  • 以HTML格式生成报告。 它包括每个源文件的统计信息,方法,执行和未执行的代码行列表。

  • 黑盒测试支持。

  • 比较不同版本软件的覆盖率数据。

Squish Coco的使用

由于是收费应用,,,,,,


OpenCppCoverage

OpenCppCoverage 是一个开源的windows平台下的C++源代码覆盖率测试工具。
主要用于单元测试覆盖,但也可以使用它来了解程序中执行的行以进行调试。

功能:

  • Visual Studio支持:支持带有程序数据库文件(.pdb)的编译器。

  • 非侵入式:只需使用OpenCppCoverage运行程序,无需重新编译应用程序。

  • HTML报告: 使用命令行方式运行,生成HTML格式的报告。

  • 行覆盖: 支持代码行级别的覆盖检查,在报告中以不同的背景色加以区分。

  • 作为Visual Studio插件运行: 可以Visual Studio插件的形式进行使用,安装该插件后,在Visual Studio的tool栏中可以直接进行覆盖率检查。

  • Jenkins支持

  • 支持优化构建。

  • 根据正则表达式排除代码行。

  • 子进程覆盖。

  • 覆盖率聚合:可运行多个代码覆盖率检测并将它们合并到单个报告中。

环境要求

  • Windows Vista或更高版本。

  • Microsoft Visual Studio 2008或更高版本的所有版本,包括Express版本。 也应该可以与以前版本的Visual Studio一起使用。

使用方法

命令行模式

下载OpenCppCoverage并进行安装,安装时选择将其添加到环境变量。

最基本的命令如下:

1
OpenCppCoverage.exe --sources MySourcePath -- YourProgram.exe arg1 arg2

其中MySourcePath是要检测的项目的源文件目录,YourProgram.exe是编译好的准备进行检测的项目可执行文件,最后可以添加检测的目标程序运行的参数。

使用--sources MySourcePath参数是为了告诉OpenCppCoverage我们需要纳入覆盖率检测的源代码。否则,在计算覆盖率时可能会对许多非项目中的文件进行统计。

运行之后,将在当前目录生成HTML的报告文档。在浏览器中可以进行方便的查看。报告中包含了整个项目的覆盖率数据,各个文件的覆盖率,以及各个文件的代码行级的覆盖情况。在每个文件中根据代码是否被被运行到做了颜色的区分。

生成报告文档的格式以及目录同样是可以配置的,配置命令为--export_type arg,使用示例如下:

1
OpenCppCoverage.exe --export_type=export_type_value:outputPath -- MyProgram.exe

其中export_type_value为输出的格式,支持的格式有:

  • html:将报告保存为一个Html文件。 如果未设置此标志,则为默认值。
  • cobertura:创建了一个与Jenkins的Cobertura插件兼容的xml文件
  • binary:覆盖率报告保存在二进制文件中。 可以使用–input_coverage重新加载此文件。

outputPath是将执行导出的路径。未配置时使用默认值:

  • 对于html: CoverageReport-YYYY-MM-DD-HHhMMmSSs,其中YYYY-MM-DD-HHhMMmSSs将被当前日期取代。outputPath应为一个目录。

  • 对于cobertura: 默认为ProgramNameCoverage.xml,其中ProgramName是已执行程序或CoverageOutput的名称。 outputPath必须是文件。

  • 对于binary:默认为ProgramName.cov,其中ProgramName是已执行程序或CoverageOutput的名称。 outputPath必须是文件。

还可以同时指定多个输出配置:

1
OpenCppCoverage.exe --sources=MySources --export_type=html:OutputFolder --export_type=cobertura -- MyProgram.exe

更多的参数选项见此处

Visual Studio 插件模式

OpenCppCoverage对Visual Studio提供插件支持,支持2015和2017等版本。

安装插件之后,正常编译项目,在菜单栏选择Tools(工具) –> Run OpenCppCoverage将会弹出运行OpenCppCoverage的配置菜单,在Basic栏中Program to run为我们要检测的目标程序,对应命令行运行时我们输入的YourProgram.exeArguments为运行目标程序时使用的参数。在FilterAdditional Source Pattern中可以配置检测的目标项目源文件目录,对应命令行运行时的--sources=MySources

将这三个参数配置好就可以进行最基本的覆盖率检测了。

运行完毕后将在output窗口生成覆盖率报告,同时也会在代码浏览窗口中根据代码是否被执行来对各行代码以不同的颜色进行标识。

此外在Import/Export栏可以配置输出文件的格式等,此处多更多的配置使用不作详细介绍。