行级覆盖(Line Coverage) 是最常用也是最常见的一种代码覆盖方式,就是度量被测代码中每个可执行语句是否被执行到了,通过这些信息,我们可以了解被测代码的测试质量,以及重点关注那些未被覆盖的语句。
行级覆盖系列文章之一《在 IBM Rational Application Developer 中实现 Java 代码覆盖率分析》针对的是 Java 代码,本文则侧重如何使用 Rational 的另一产品 Purecoverage 实现 C/C++ 代码行级覆盖。
Purecoverage 是专用于 C/C++ 程序进行代码覆盖测试的工具,在 C/C++ 项目中得到广泛应用。
本文将通过实际的例子直观的向读者展示如何设置环境变量,准备脚本文件,插装(instrument)可执行文件以便将指令植入到被测文件中,执行覆盖指令,收集覆盖结果,发布覆盖报告等一系列完整过程。为对代码覆盖率分析感兴趣的开发或者测试人员提供经验分享。
度量代码达到的覆盖率是软件质量中非常重要的一个指标,也是测试过程中必不可少的一步,它可以揭示哪些代码 / 函数从未执行过,这通常表明了测试的不完备性。
IBM Rational PurifyPlus 是一个完整的自动化运行时分析工具,用来提高应用程序的性能和质量。非常适合测试人员和开发人员在软件测试和开发期间进行运行时分析,您可以收集和研究以下运行时数据:
IBM Rational PurifyPlus 是三种工具:IBM Rational PureCoverage®、IBM Rational Quantify® 和 IBM Rational Purify® 的集合。
PureCoverage 用来进行代码覆盖率分析:它测量在所有测试用例中多少代码运行了,多少代码没有运行
Quantify 用来进行性能分析:它帮助分析应用程序的性能瓶颈
Purify 用来进行内存分析:它帮助寻找应用程序的内存泄漏和错误的内存使用,这些有可能导致应用程序崩溃。
PurifyPlus 支持 UNIX 平台的 C/C++ 和 Java,以及 Windows 平台上的 VC/C++、C#、VB.NET、VB。PurifyPlus for Windows 对于 Java 的服务器端和客户端提供一样的支持。安装在 Web 服务器上之后,可以针对在服务器诸如 IBM WebSphere、BEA WebLogic 和 Apache Jakarta Tomcat 上的 Java Server Pages(JSP) 和 Java Servlets 使用 PurifyPlus。
Rational PureCoverage 是专门用来分析代码覆盖信息的工具,它是 Rational PurifyPlus 的一个组件。用户通过它可以快速地分析出测试用例对代码的覆盖是否完美,是否有地方需要改进。
越来越多的软件项目采用了敏捷(Agile)开发方式,软件测试需要及时地跟进并尽早地发现问题。这给测试用例的设计和更新提出了更高的要求。
Rational Purecoverage 提供了许多实用的功能来帮助用户减少花费在测试用例维护上的时间,比如:
支持累积方式的代码覆盖数据收集。用户不必一次把所有测试运行完毕,多次运行的覆盖率数据可自动累计,不同的运行可以在不同的 build 上进行。
多个软件程序可能用到相同的共享代码库。对于这种情况,Rational Purecoverage 中可以把多个软件程序的代码覆盖数据合并,从而得到共享代码库的覆盖率情况。
丰富的代码覆盖信息报告。从代码文件,函数到代码行,Rational Purecoverage 可以生成多层次的,内容丰富的报告。报告包含的数据可定制,比如用户可以过滤掉系统调用的代码覆盖信息。
支持命令行方式运行,便于代码覆盖分析过程的全自动化。
Rational PurifyPlus 7.0.1.0 支持与 Visual Studio 2005 及 2008 集成,并可以在 Visual Studio 中对 C++ 应用进行代码覆盖率分析。本文将以 Visual Studio 2008 为例。PureCoverage 在 Visual Studio 2008 中与 Visual Studio 2005 中使用并没有区别。
安装完 Rational PurifyPlus 7.0.1.0 之后,Visual Studio 2008 菜单会多出一项 PurifyPlus,其中包括 Purify,PureCoverage 和 Quantify 三项。本文将用到 PureCoverage 菜单项中的内容对 C++ 代码进行覆盖率分析。
当在 Visual Studio 2008 中打开一个 C++ 项目,并希望对该项目做代码覆盖率分析,可以直接选择“Engage PureCoverage Integration”菜单,对项目做 PureCoverage 集成。
集成成功后,菜单项会变为“Disengage PureCoverage Integration”。选择该项则会取消对项目的 PureCoverage 集成。
在于 PureCoverage 集成的状态下,运行项目,即可对项目进行代码覆盖率分析。下面将以作者编写的一个非常简单的例子作为说明。
启动应用,同时 PureCoverage 收集代码覆盖信息的界面也将显示出来,并会随着测试操作的进行更新数据。示例应用叫做 ColorPicker,提供了 4 个按钮供用户点击,点击后会在文本栏中显示相应的文字。
在图中我们可以看到,Rational PureCoverage Main Window 已经自动启动,开始收集数据。我们点击 Blue 和 Yellow 两个按钮,然后选择 OK 退出程序。这时 PureCoverage 会把最后的覆盖率分析数据结果显示出来,默认显示的是文件视图。
因为这是一个 VC 项目,有很多引用的代码覆盖率统计结果也都包含在这里。从项目路径,我们可以找到我们关心的数据。ColorPicker 的路径是 d:\vs_space\colorpicker\colorpicker,把这个路径打开,我们可以看到更加详细的数据。
在这些数据中,Function 级别的统计数据和行级别的统计数据都有所显示。比如 4 个 OnBnClickedButton.. 方法中,因为我们只点击了 2 个按钮,所以有 2 个按钮对应的方法是 hit 的,而另外两个按钮对应的方法是 missed 的。双击方法名称,会在源代码页面中显示具体的覆盖信息。
在 Module View 中结果的显示如下:
浏览的方式有所区别,但最后都定位到方法和行上。
在 Rational PureCoverage Main Windows 的右边栏中,会记录多次运行的结果。这些结果可以被 Merge,也可以被比较。在我们的范例中,再次运行 ColorPicker,做一些操作,退出应用,就可以得到另一次代码覆盖率分析运行结果。
图中可以看到 2 次运行结果。
在与 Visual Studio 2008 集成的环境中使用 Rational PureCoverage 进行代码覆盖率分析测试,过程很简单,结果也很直观。
如果我们做测试的环境没有安装或者无法安装 Visual Studio 2008,那么 PureCoverage 也是可以单独使用的。
我们使用 ColorPicker 的 release 编译版本,把它放到机器某路径下,确认运行正常。从系统菜单中直接启动 Rational PureCoverage,选择 File->Run。
在 Program name 中选择 ColorPicker.exe 的路径。在 Collect Data From 中选择 Unmanaged Code。从这里我们也可以看到,PureCoverage 也支持对 Managed Code 和 Java Code 做代码覆盖率分析测试,因为 PureCoverage 在 C/C++ 代码覆盖率分析的应用最常见,本文将只举 C++ 的例子说明。其它两种代码覆盖率测试的过程是完全一样的。
Settings 按钮会提供给我们一些重要的设置内容。这些内容在 Rational PureCoverage 与 Visual Studio 2008 集成的菜单中也可以使用,菜单为 PurifyPlus->PureCoverage->Settings->DefaultSettings,可以设置的内容完全一样。
在这里,我们可以选择代码覆盖率分析级别,默认为行级。同时我们也可以选择需要做代码覆盖率分析的 Module。因为 PureCoverage 只对做过 Instrument 的 Module 收集代码覆盖率数据,所以在“Module to Instrument”中的选择将决定需要测试并收集代码覆盖率数据的 Module。选择 Selected Modules,点击 Configure 按钮,显示 Module Coverage[Selective] 对话框。选择添加按钮,把 ColorPicker 添加进来。这里同样可以选择对选择的 Module 进行 Instrument 的设定。可以选择覆盖率数据收集的级别,对 Module 做 Instrument 是暂时的还是永久的。
确定所有设定,点击 Run 按钮运行 ColorPicker 应用。之后就与在 Visual Studio 2008 环境集成的情况下测试基本一样了。点击 Blue 和 Yellow 按钮,退出 ColorPicker。于是我们得到了与在 Visual Studio 2008 集成环境下非常相似的结果。
在 Rational PureCoverage 中进行 C++ 程序的代码覆盖率分析的过程与在 Visual Studio2008 集成环境中非常类似。得到的结果是完全一样的。示例的图中有所区别是因为在 Visual Studio2008 中作者使用的 Debug 编译方式。在单独使用 PureCoverage 的范例中使用了 Release 编译版本,同时只选择了 ColorPicker 这个单独的 Module。
前面介绍了图形界面下如何进行代码覆盖率分析,但是在某些情况下,用户需要以命令行方式进行代码覆盖率分析。比如定期自动化运行这种场景下,命令行方式进行代码覆盖分析就是一个很好的选择。
下面同样以 ColorPicker 程序为例,介绍在命令行下对它进行代码覆盖分析的过程:
1. 首先获得 ColorPicker 程序启用覆盖分析选项后的编译生成的 exe 文件 ColorPicker.exe
2. 接着在命令行使用 purecoverage
启动 ColorPicker 程序
在命令行输出代码覆盖分析数据有两种选项:
/SaveTextData
选项,这样代码覆盖分析数据会保存到 .txt 的文本文件中Coverage /SaveTextData ColorPicker.exe
Coverage /SaveTextData ColorPicker.exe
3. 对启动的 ColorPicker 程序进行操作,该部分可以使用自动化脚本进行操作(例如使用 RFT 脚本操作 ColorPicker 的一些功能)。
4. 对 ColorPicker 程序操作完成之后,退出该程序。这时前面操作所覆盖到的代码信息已经存储到同一目录下的覆盖信息数据文件中了。
上面介绍了命令行方式调用 purecoverage 获取代码覆盖信息的过程,其中提到了生成代码覆盖信息数据的两种文件格式。对于代码覆盖分析频率高工作量大的场合,建议使用文本格式以便于自己写工具进行解析并生成报告。介绍一下我们项目中的使用方法供您参考:生成文本格式的覆盖信息数据文件后,定时批量上传到服务器,由服务器端的一个工具扫描并解析最新上传的数据文件,生成 xml 格式的分析结果以备二次分析使用,同时把分析结果分类写入数据库以便生成汇总分析报告。
本文通过一个实际的例子介绍了如何使用 Ratinal Purecoverage 进行 C++ 代码覆盖率分析
的详细过程,以此来帮助开发或测试人员度量当前使用的测试用例的有效性,并且提供达到尽可能高的覆盖性的信息,尽可能早的发现缺陷。