Rational Purify 使用手册.docx
《Rational Purify 使用手册.docx》由会员分享,可在线阅读,更多相关《Rational Purify 使用手册.docx(21页珍藏版)》请在冰豆网上搜索。
RationalPurify使用手册
IBMPurify/PureCoverageUsageReport
SivaLiu
◆前言
IBMPurify/PureCoverageTestFactory是保证软件的可靠性和可测试性的一种实时自动化测试工具。
其隶属于IBM公司的自动化测试工具包RationalSoftware,是一种嵌入式的测试软件,可以嵌入多种开发环境中,如VisualC++、VisualJ++、JavaDevelopment、.NetManagement等等各种代码开发工具。
Purify/PureCoverage,包括Quantify等一批实时测试工具可以方便的在调试代码和执行代码之间使用。
其测试结果也可以保存为Rational可识别文件为其它测试工具使用,也可以将此次的结果与另一次实例运行的结果作动态对比。
从而得出修改代码前后的区别。
图1-1嵌入VC++的Purify和PureCoverage
◆嵌入工具
在嵌入VisualC++后Purify/PureCoverage将其某些功能集成为工具条,从左到右依次为:
图1-2嵌入式的工具条
EngagePurifyIntegration:
按下此按钮即可以在调试和运行时使用Purify。
CollectCoverageData:
按下此按钮可以在调试和运行时收集实例运行覆盖率的数据,类似
PureCoverage的覆盖率报表。
如果仅仅需要知道语句的覆盖率,可以不使用PureCoverage而直接使用Purify的这个功能。
BringPurifyToTop:
将Purify的报告窗体移至整个窗体组的顶部。
PurifyBreakOnError:
按下此按钮,Purify会在每次检测到错误的时候停止运行该程序,并给出错误信息,方便调试。
PurifyExecutableSettings:
Purify运行设置,对本次实例有效。
PurifyDefaultSettings:
Purify缺省设置,对所有实例有效。
PurifyPreferences:
Purify参数设置。
PurifyFilterManager:
Purify过滤器,可以选择需要过滤的模块或程序。
PurifyNewLeaks:
按下此按钮Purify可以在程序运行到某一点时报告内存泄露,而不必在
每次实例运行结束后报告内存泄露。
◆使用总结
1.Purify
一、功能
通过使用Purify可以实时地检查代码运行产生的一些内存错误。
如内存未初始化、数组越界、内存泄露、COM接口错误等等。
二、软件设置
1.DefaultSettings
1)ErrorandLeaks:
错误和泄漏
Showfirstmessageonly:
在相同的错误第一次出现时显示信息,此后的不显示。
ShowUMCmessage:
显示UMC信息。
Memoryleaks:
报告内存泄漏。
Memoryinuse:
报告内存使用情况。
Handlesinuse:
报告句柄使用情况。
Showmaximumcallstackdetail:
设置最大调用堆栈。
Deferredfreequeue:
延时的自由队列。
Redzonelength:
亏损区长度。
2)PowerCheck选项卡:
Defaulterrorlevel:
缺省的错误标准。
Themoduledoesn’tcontaindebugginginfo:
模块无法容纳调试信息。
Themoduleislarger……KB:
模块大于……字节。
Defaultcoveragelevel:
缺省的覆盖率标准(按行/函数算)。
ExcludeallmodulesinWindowsdirectory:
排除所有Windows目录下的模块。
3)Files选项卡:
Cachedirectory:
Cache文件夹路径设置。
Sourcefilesearch:
源文件所在文件夹路径设置。
Instrumentedfilename:
实例文件路径设置。
(ExecutableSettings有效)
Additionaloptions:
其它附加参数。
4)Advanced选项卡:
Leakscaninterval:
泄漏扫描间隔。
Enablelatedetactscans:
能够察觉新近的扫描。
Latedetactscan:
新近扫描……堆。
Latedetactscaninterval:
新近扫描间隔……秒。
2.PurifyPreferences
1)Runs选项卡:
Showinstrumentionprogess:
当对VC++程序测试时,是否显示工具对话框。
Showinstrumentionwarnings:
当对VC++程序测试时,侦探到警告对话框,是否显
示工具警告对话框。
ShowLoadLibraryinstrumentionprogress:
对VC++、VBnative-code程序测试时,
当工具文件需要调用工具列表时,是否显
示工具对话框。
Confirmrunconcellation:
当每次选择file——Concelrun时,是否显示证实消息对
话框。
Createautomaticmerge:
创建自动的合并。
ActiveMerge:
实时合并。
Usedefaulefilterset:
使用缺省的过滤器设置。
Usecasesensitivepathname:
区分大小写路径名。
Breakonwarningsinadditiontoerror:
当错误增加时中断。
Usethefollowingdebugger:
使用下列调试器。
2)Workspace选项卡
ShowWelcomeScreenatstartup:
当每次打开该工具时,是否显示欢迎对话框。
Showdirectoriesinfilenames:
当文件名显示时。
在可能的情况下是否显示文件路径。
Usesounds:
是否有声音。
Warnonunsaveddata:
当关闭了一个为保存数据的运行时,或退出未保存数据的运
行时,是否显示警告消息对话框。
Expandcallstacks:
扩展调用堆栈的个数。
Createdatabrowsershidden:
创建隐含的数据浏览器。
Showcommasinnumbers:
在数字中显示逗号。
ShowGuidetoUsingMemoryProfiling:
显示引导使用内存压型。
Discardexcessmemoryprofiling:
放弃剩余的内存压型。
SyncCallGraphfromRrference:
同步参考调用曲线图。
ShowObjectListView:
显示对象视图列表。
ShowinNavigator:
选择在Navigator窗口中是否显示日期、时间、命令行论述等信
息。
SortMemoryItemsinErrorView:
选择在错误视图中是否显示的内存种类信息。
3)JVM选项卡
由于笔者没有接触过JVM这一方面,所以没有运用到测试中来,故这里先不作介绍。
4)SourceCode选项卡:
ShowC++classnames:
显示C++的类名。
ShowC++argumentlists:
显示C++参数列表。
Confirmrecentlychangedsource:
确定最近源代码的改变。
Showinstructionpointers:
显示指令指针。
Showinstructionpointersoffset:
显示指令指针分支。
Spacesper…Linesofsource…:
每间隔多少代码行显示。
三、报告信息
我们先来看看Purify的测试报告窗体。
图2-1Purify报告窗体的组成
窗体由三部分组成:
上方是菜单栏和工具栏;左方是实例树型列表(Navigator);右方是信息报告与定位区。
1.菜单栏和工具栏:
包括一些Purify常用的工具和设置。
尤其是工具栏,包含了一些比较实用的工具组。
比如:
①Σ(MergeRuns)
对多次测试的路径的分析与统计,可以看到当前案例覆盖代码的情况,有那些代码没有覆盖到;有时候你对测试案例跑过多少代码并没有记录,这时需要对所有的跑过的测试进行统计,看看还有那一些代码没有覆盖到,这时这个功能就非常有用,可以对你所有的已经测试的案例进行代码覆盖统计,从而发现没有测试到的代码
②Δ(CompareRuns)
对两次实例的运行情况,进行路径比较,由于测试案例比较多,这时我无法判断,两个案例的代码覆盖路径上有什么差别,这时需要对两样者进行比较,从而发现同一个程序每次运行的区别。
2.Navigator:
显示了载入的实例运行的情况。
同一个程序(可以为exe程序)的不同次运行的实例将处于同一颗树中,以本程序为父结点。
双击一个实例可以在右方显示此次实例运行的结果报告。
3.信息报告区:
包含了一次实例运行的情况。
共有三类信息:
1蓝色:
:
InformationMessage——代表一些程序运行的情况,如IgnoredException(EXI)、MemoryInUse(MIU)等都属于信息消息;
2红色:
ErrorMessage——代表发现的此次实例的错误,如ArrayBoundsWrite(ABW);
3黄色:
WaringMessage——代表一些不会立即发生的错误,但可能潜在引起程序错误的地方,如UninitializedMemoryRead(UMR)或BadParameter(PAR)都属于警告消息。
稍后将详细介绍这些错误信息的意义。
将某条消息展开后,会显示出此条信息的详细信息,包括出现错误所在的内存地址、线程ID、错误产生在代码中的位置(会用红色箭头指示)等等。
双击该行代码还可以使用默认开发工具将源代码文件打开并定位到错误处。
图2-2Purify详细消息报告窗体
四、消息类型
1.InformationMessage
BOX:
MessageBox当程序中调用了MessageBox()或MessageBoxEx()作为输出时,提示
所调用的位置。
EXC:
ContinuedException显示捕获到异常第一次出现并报告出现异常的位置。
EXH:
HandledException显示捕获到句柄异常。
EXI:
IgnoredException显示捕获到异常,但异常过滤器(ExceptionFilter)忽略。
HIU:
HandleInUse句柄没有被释放。
MAF:
MemoryAllocationFailure内存分配失败。
MIU:
MemoryInUse内存没有被释放,往往是产生内存泄露的直接原因。
MPK:
PotentialMemoryLeak潜在可能造成内存泄露的代码。
比如指针偏移。
ODS:
OutputDebugString当程序中调用了OutputDebugString()作为输出时,提示所调用
的位置。
2.ErrorMessage
ABR:
ArrayBoundsRead数组越界读取。
ABW:
ArrayBoundsWrite数组越界写入。
ABWL:
LateDetectArrayBoundsWrite可能造成的数组越界写入。
BSR:
BeyondStackRead尝试读取非法堆指针的数据。
比如在一个函数中读取另一个不
可见的函数体指针。
BSW:
BeyondStackWrite尝试写入非法堆指针的数据。
EXU:
UnhandledException显示无法捕捉到的异常句柄。
FFM:
FreeingFreedMemory尝试释放已被释放的内存。
FIM:
FreeingInvalidMemory尝试释放非法内存。
而该内存没有被分配空间。
FMM:
FreeingMismatchedMemory尝试释放的内存不匹配。
比如分配的堆为buffer1,
但却尝试释放buffer2。
FMR:
FreeMemoryRead读取空内存。
FMW:
FreeMemoryWrite写入空内存。
FMWL:
LateDetectFreeMemoryWrite可能造成的写入空内存。
IPR:
InvalidPointerRead尝试读非法内存,如系统保留的内存区。
IPW:
InvalidPointerWrite尝试写非法内存。
NPR:
NullPointerRead尝试读取空指针。
NPW:
NullPointerWrite尝试写入空指针。
3.WarningMessage
COM:
COMAPI/InterfaceFailure调用COM接口错误。
HAN:
InvalidHandle非法句柄。
如类型不匹配。
ILK:
COMInterfaceLeak没有释放COM接口对象空间。
MLK:
MemoryLeak堆内存没有被释放。
PAR:
BadParameter尝试调用Win32API或C-runtime程序如write(),使用了错误的参
数导致内存出错。
UMC:
UninitializedMemoryCopy尝试拷贝一片未初始化的内存区(已分配空间)。
UMR:
UninitializedMemoryRead尝试读取一片未初始化的内存区。
如果出现了不懂的消息类型,也可以在一条消息上点鼠标右键,在探出菜单的第一项中选择:
Describe***
2.PureCoverage
一、功能
检查程序一次运行的实例在整个模块中的语句覆盖率,也包括每个函数、每行代码的调用次数,是检查测试完整性的优秀工具。
通过它你可以快速的了解到设计的白盒测试案例执行后代码的覆盖情况,为白盒测试案例的修正提供的有效的标准,从而快保证了代码路径的覆盖。
二、软件设置
1.DefaultSettings
1)PowerCov选项卡:
DefaultCoverageLevel:
Line——默认行覆盖,Function——默认函数覆盖。
(Caution:
如果在设置中选择Line和选择Function,在覆盖率的表示结果上是不一样的。
前者表示出语句的覆盖率,而后者表示函数的覆盖率。
)
ModulestoInstrument:
选择要覆盖的模块,默认为所有模块,但排除了Windows
系统模块。
Java/Managed:
暂时不介绍。
:
-b
2)Files选项卡
与Puriy的意义一样,可参考前面的介绍。
2.PureCoveragePreference
1)Runs选项卡:
Showinstrumentionprogess:
当对VC++程序测试时,是否显示工具对话框。
Showinstrumentionwarnings:
当对VC++程序测试时,侦探到警告对话框,是否显
示工具警告对话框。
ShowLoadLibraryinstrumentionprogress:
对VC++、VBnative-code程序测试时,
当工具文件需要调用工具列表时,是否显
示工具对话框。
Confirmrunconcellation:
当每次选择file——Concelrun时,是否显示证实消息对
话框。
ShowCoverageBrowser:
当对当前数据或汇总数据做快照时、打开一个.cfy文件或
Purify错误时、打开一个.pcy文件时、推出正在运行的程序时,是否在覆盖浏览器显示数据。
ShowFunctionList:
在与上相同的情况下,是否在函数列表窗口中显示数据。
AutomaticMerge:
当运行一个程序时,是否在Navigator窗口创建一个自动汇总入
口,或在接下来的运行时,是否自动更新汇总数据。
Usedefaultfilterset:
当下一次运行程序时,是否使用当前的过滤器设置。
Usecasesensitivepathnames:
当下一次运行程序时显示的数据,该工具是否区分大
小写字母盘。
2)Workspace选项卡:
ShowWelcomeScreenatstartup:
当每次打开该工具时,是否显示欢迎对话框。
Showdirectoriesinfilenames:
当文件名显示时。
在可能的情况下是否显示文件路
径。
Usesounds:
是否有声音。
Warnonunsaveddata:
当关闭了一个为保存数据的运行时,或退出未保存数据的运
行时,是否显示警告消息对话框。
ShowinNavigator:
选择在Navigator窗口中是否显示日期、时间、命令行论述等
信息。
JVM和SourceCode选项卡都不知道怎么用-_-!
三、报告消息
先来看看PureCoverage的报告界面窗体:
图3-1PureCoverage报告界面
可以看出其与Purify的报告界面类似,不同的是某些工具和右方的报表界面。
1.报表
PureCoverage共有四种形式的报表可供使用,分别是总体覆盖率摘要、模块覆盖率列表、文件覆盖率列表、函数覆盖率列表。
1总体覆盖率摘要(RunSummary)
图3-2PureCoverageRunSummary
RunSummary一个明显的特点就是它以一个容量槽的形式表现出实例语句覆盖率的情况。
从下方的介绍可以看出。
白色部分代表没有被调用过的部分;绿色代表少于调用10次但至少调用过1次(hit)的部分;蓝色代表少于调用100次的部分;青色代表少于调用1000次的部分;粉色代表调用过1000次以上的部分。
前面的数字表示具体的调用情况,比如第一行表示模块fd_test.exe调用过12590次(算累积的,如果你设置中CoverageLevel选择的是line,也就是同一行代码调用2次算+2。
而选择Fuction的话算进入函数体的次数。
其它报表也是如此计算的)其中41个函数没有被调用过,49个函数被调用过,总共89个函数,覆盖率53.93%。
2模块覆盖率列表(ModuleView)
可以看到实例中每个模块的语句(函数)的调用次数和覆盖率。
展开模块可以看到其子模块和函数的具体数据。
其意义以第三行的模块fd_test.exe来举例,表示fd_test中被调用了12537次(代码行),其中没有被调用的函数为3个,调用过17个函数,函数覆盖率85.00%;31行代码没有被调用,161行代码被调用,代码覆盖率83.85%。
在展开后还可看到其中具体的函数的覆盖数据。
双击其中某个函数还可以进入到函数体中看到具体的代码的覆盖情况。
具体将在稍后介绍,如果是动态测试这将变得非常方便。
图3-3PureCoverageModuleView
3文件覆盖率列表(FileView)
图3-4PureCoverageFileView
可以看到其格式与ModuleView一样,不同的是ModuleView以模块为根节点。
而FileView以文件目录为根节点。
4函数覆盖率列表(FunctionList)
图3-5PureCoverageFunctionList
此报表详细地列出了实例中包含的所有函数。
在右边还显示了函数所处的模块和所处的文件。
单击上方的表头还可以排序,方便地定位需要找的函数。
当然,双击一条函数也可以进入到函数体中查看具体代码执行的情况。
2.源代码显示
当使用PureCoverage查看代码覆盖率的时候,也能够打开源代码文件(如果有的话)查看具体代码的执行情况。
可以通过双击列表中某个函数或者点击鼠标右键,在弹出菜单中选择AnnotatedSource查看。
如下图所示:
图3-6PureCoverageAnnotatedSourcWindow
源代码中使用了不同的颜色表示代码的5种测试状态:
蓝色HitLines:
每次都执行到的代码行。
红色MissedLinces:
没有执行到的代码行。
粉色PartiallyHitMuti-blockLines:
在实例中部分执行到的代码。
多半是遇到条件语句
中有时满足条件而有些没有满足条件发生。
绿色Summary:
测试的摘要,通常为函数摘要。
默认不显示,可以在右键菜单中选择
ShowFunctionSummary将其显示出来。
黑色DeadLines:
实例无法达到的代码行。
通常是注释或函数声明等等。
(小技巧:
通过按F7可以不断地定位到下一条MissedLines,方便调试和记录)
3.工具条使用
下面是一些PureCoverage特有的工具简介,它们在工具条的正中央摆放:
Pause/Recording:
当你发觉测试过程中必需跳过一些不需要的测试流程时,你可以使用此功能进行测试的控制,你可停止纪录让程序走到你要测试的function,再启动记录,对你需要的过程进行记录。
Cleardata:
当你发现前面的测试案例,已经走过或是属于重复案例时,是否需要重新重做,这完全是不必要的,你可以使用cleardata对之前的测试结果进行清除,再继续进行你有效的测试案例,这样可以不用中断测试。
Snaphotdata:
:
对测试进行中数据的快照,你可以对测试案例的执行的不同阶段点进行数据的快照,这样你就可以得到每一个案例执行后的情况而不需要多次重启测试,呵呵。
◆使用心得
在对软件做了一个总体的介绍后,笔者谈谈自己使用的心得和小小的体会。
算是给大家一个参考:
⏹如果只是检查一次实例运行的情况来获得程序的内存错误,建议直接打开软件按F5运行exe程序,那样不必做一些代码的载入工作。
但如果要实时监控和调试程序,建议使用嵌入式的测试工具,可以方便快速的跳到应该修改的程序部分。
⏹如果要对比或合并一些执行结果的报告,可以先保存为Rational可识别文件(cfy、pcy等),不建议选择AutoMerge,因为难以控制,还会拖慢执行速度。
可以静态地用Rational打开这些文件然后选择Compare或者Merge。
⏹在使用PureCoverage做白盒测试的覆盖率统计的时候,最好能动态使用。
因为方便修改输入和调试程序。
当然,如果要最后统计整个测试的覆盖率,最好保存为cfy文件。
⏹在使用Purify做内存检查时也推荐使用动态使用,因为静态有时候想定位出错代码时会出现找不到源文件的情况。
这时要手动定位源文件位置,甚为麻烦。
有时候一些系统源文件连自己也找不到在哪儿。
@_@
⏹使用Purify时如果按下BreakOnError的按钮,那么它会在找到第一个错误时停止程序的运行。
(注意:
是停止,不是