Parasoft C++ test 是一个集成解决方案,用于使一系列被广泛证明可改进软件开发团队生产力和软件质量的最佳实践得以自动化处理。通过C++ test,可进行编码策略增强、静态分析、综合代码复审、单元测试和组件测试、以及运行时错误检测,以此向团队提供一种确保 C 和 C++ 代码达到其预期功能的实用方法。C++ test 可以在桌面上 IDE 的引导下使用,也可以通过命令行界面、批处理方式进行回归测试。C++ test 与 Parasoft 的 GRS 报告系统相集成,后者提供了具有向下钻取功能并基于 Web 的交互式仪表板,允许团队根据 C++test 结果和其它关键的进程度量值,跟踪项目的状态和趋势。
Parasoft C++ test 支持:
本文档针对 Parasoft C++ test 9.2 版本。其它版本可能有区别,仅作参考。
运行 cpptest_9.2.1.26_win32.exe ,根据提示安装即可。
运行后,点击主界面菜单“帮助” -> “帮助内容”,可打开 Parasoft C++ test 帮助文档,该帮助文档包括:
安装后,Parasoft 自带了一些示例项目(存储在Parasoft C++ test安装目录的 \C++ test\9.2\Examples 的目录下),这里我们使用 Shapes 这个 Makefile 示例工程作为我们的目标工程,开始学习和使用 Parasoft C++ test 的一般操作流程。
正确的编译器配置是关键。在大多数情况下, C++ test 需要调用编译器和链接器以执行静态分析和运行时测试任务,这通常包括预处理,编译和链接程序。
为了访问 C++ test 的全部功能,在运行 C++ test 的机器上必须有完整的开发环境和编译器工具链。
在您能用 C++ test来测试代码之前,代码必须在workbench中的某个 C++ test 项目中可用(临时的工作区域-每个用户唯一)。创建 C++ test 能测试的项目包括:
创建或导入一个项目:
如果你有存在的 existing Eclipse CDT, Wind River Workbench, 或 ARM RVDS 项目, 使用 C++ test简单的配置您的现有项目。转到第二步。
如果你有从命令行运行的构建系统(如 make/nmake), 使用 cpptestscan 工具从构建过程收集信息,然后让 C++ test 自动创建一个基于收集信息的项目。能够从命令行或使用 GUI 向导创建项目。
如果你想 导入现有的 6.0 projects项目(import existing Visual Studio 6.0 projects), 使用描述在 导入现有的 Visual Studio 6.0 项目的过程。
如果你想 导入现有的 Wind River Tornado项目(import existing Wind River Tornado projects),使用描述在 导入现有的 Wind River Tornado 项目的过程。
否则,从GUI 创建 C++ test 项目所描述的从GUI配置您的项目。
在 C++ test 项目选项中配置构建设置。对于所有的 C++ test 项目这是必须的,包括您想要使用 C++ test 测试的现有Eclipse CDT, Wind River Workbench, 和 ARM RVDS 项目。
前两个任务只需要执行一次,在您的一个团队成员创建和配置一个项目之后,能够把它添加到源码控制器(如SVN)中,然后被工作在这个代码上的所有开发者复用,如 共享项目所描述的那样。
必须确保目标项目能正确编译(构建),才能让 Parasoft C++ test 借助编译器做深入的 BugDetective 静态分析。
这里假设机器已经安装了 MinGW 编译链(Qt的SDK包自带的MinGW),并且正确设置了环境变量(如把QT安装目录D:\Qt\Qt5.2.1-mingw48\Tools\mingw48_32\bin; D:\Qt\Qt5.2.1-mingw48\5.2.1\mingw48_32\bin; 添加到PATH环境变量),在命令行能直接运行 make (默认为mingw32-make.exe,可更改该文件名称为make.exe,下文假设已改名)、gcc、g++、ld 等必备的编译链接程序。
打开 cmd,切换当前目录(cd)到 \C++test\9.2\Examples\Shapes 目录,执行 make 命令,如果没有报错,且生成了 a.exe 文件,则表示项目能正常编译。
我们将使用 cpptestscan 工具从构建(编译+链接)现有代码的过程收集信息,
所有的构建信息被存储在一个单独的文件中,我们称作“构建数据文件 (build data file),即 BDF 文件”,该文件含有原始命令行以及工作目录的信息。
cpptestscan 程序被设计来收集既有代码库的构建过程信息。 cpptestscan 用作构建时编译器和/或链接器的前缀。为了能在任务目录运行 cpptestscan 程序,我们需要把它所在的目录(\Parasoft\C++test\9.2)添加到操作系统的PATH环境变量中。
打开cmd命令行窗口,切换到目标路径,指定cpptestscan作为CXX/CC执行 mingw32-make, 执行的命令如下:
D:
cd D:\Program Files\Parasoft\C++test\9.2\Examples\Shapes
make clean
make CXX="cpptestscan g++"
上述命令中,make 将使用 cpptestscan 这个伪 g++ 编译器编译扫描每一个CPP源文件,生成 cpptestscan.bdf 文件。事实上,cpptestscan 仍会调用原始编译器 g++ 以确保整个编译过程的完整性(整个构建过程与原始的一致。
如果没有指定输出文件,如上例,将在每个Makefile工程目录(源码构建目录)生成一个 cpptestscan.bdf;如果希望所有Makefile工程合并生成一个BDF文件,则需要指定输出的文件路径。更详细的 cpptestscan 使用方式:
make -f </path/to/makefile> <make target> [user-specific options] CXX="cpptestscan --cpptestscanOutputFile=/path/to/name.bdf --cpptestscanProjectName=<projectname> g++"
对于QT项目,在我们生成 BDF 文件之前,需要先调用 qmake 程序生成 Makefile 文件,才能调用 make 指定 cpptestscan 生成BDF文件。
点击开始菜单 -> Qt5.2.1 -> 5.2.1 -> MinGW 4.8 -> Qt 5.2.1 for Desktop (MinGW 4.8),打开 MinGW 4.8 专用的命令行(已配置好相关的环境变量),切换到某一目标Qt项目,对 pro 文件执行 qmake 命令生成 Makefile 文件,执行命令如下:
E:
cd E:\test\HelloQt
qmake HelloQt.pro
一旦通过构建系统(编译工具键)生成了 BDF 文件,就可以基于BDF文件创建Parasoft C++ Test项目 (从 GUI 或从命令行都可以)。
GUI创建步骤如下:
创建后,可以左侧导航器中看到新创建的项目,默认原项目源文件作为链接文件存在。
创建后,可进一步检查更改项目配置(包括项目创建向导中的设置)。在左侧导航器右击项目,点选“属性”,即可打开项目属性配置对话框。
对代码进行 BugDetective 分析, 无需测试用例或执行软件即可识别复杂的运行时错误。查找到的错误包括未初始化或无效的内存,空指针引用,数组以及缓存溢出,被零除,内存以及资源泄漏以及无效代码。
在左侧导航器选择待分析的项目(也可Ctrl+单击进行多选),右击,点选 Parasoft > 测试执行 > 内建 > Static Analysis > BugDetective,即可进行缺陷分析。BugDetective Aggressive 配置与BugDetective基本一致,但是会执行更加严格的检查,将所有可能是问题的代码都报告为违规,因此会出现较多误判。
在分析过程中,下方窗格将出现当前测试窗口,显示当前分析的进度。分析完后,将下方给出分析结果。如果一切顺利,在“质量任务”标签窗格显示所有检测出的问题。
因为 c++ test 分析时使用不同于编译器的分析程序,即使项目能正常编译,c++ test 也可能识别不了某些代码,最终导致报告没生成而提示分析错误。如 c++ test 9.2 对于 MinGW 4.8 支持得不是很好,造成有些C程序的宏识别不了:
在 /StyleTest/StyleTest/main.cpp 中的 BugDetective 分析错误
1. 在解析文件时的错误
"d:\develop\qt\qt5.2.1-mingw48\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\ext\atomicity.h", line 47: error:
identifier "__atomic_fetch_add" is undefined
{ return __atomic_fetch_add(__mem, __val, 4); }
^
"d:\develop\qt\qt5.2.1-mingw48\tools\mingw48_32\lib\gcc\i686-w64-mingw32\4.8.0\include\c++\ext\atomicity.h", line 51: error:
identifier "__atomic_fetch_add" is undefined
{ __atomic_fetch_add(__mem, __val, 4); }
^
修改 qt5.2.1-mingw48 的头文件 atomicity.h ,去掉 __atomic_fetch_add
的所有调用代码,即可让 c++ test 分析忽略这个问题。但这样改之后,可能对正式版本的程序有影响,因此需要确保这个 mingw32 库仅用于 Parasoft c++ test 专用。
C++test启动测试时会打开Testing(测试)面板,测试进度和结果摘要都将报告在该面板中。详细的结果将在 Parasoft> 查看视图> 质量任务视图中列出,通过这个列表可以帮助我们确定如何做才能确保项目代码的质量。向下展开即可查看与测试结果相关的详细信息,双击将直接定位到源代码问题行处;右击,点选“查看规则文档”,将打开该问题对应的规则的详细描述。
在当前测试的进度显示窗口,点击右上角的 “生成报告” 按钮,即可生成检测报告。
BugDetective 是最基本的bug探测。我们通常会增加必要的编程规范的检查、必要的测试用例、代码评审等,以保证代码质量。
更改测试设置 - 例如检查什么规则、如何生成测试用例、是否跟踪覆盖率等 - 可编辑现有测试配置,或者创建新的测试配置,然后使用修改的/新建的测试配置来运行测试。可以在测试配置对话框中查看、编辑和修改测试配置、以及所有相关的参数。要打开此对话框,可从菜单栏选择 Parasoft > 测试配置。在测试配置窗口,我们能基于系统内置的配置创建新配置、修改配置、导出或导入配置等。
这里可导入我们项目使用的这些规则: