1 前言
我在本文中具体介绍了測试工具NuMega Devpartner(下面简称NuMega)的用法。
NuMega是一个动态測试工具,主要应用于白盒測试。该工具的特点是学习简单、使用方便、功能有效。NuMega共同拥有三个独立的子功能——BoundsChecker、TrueCoverage、TrueTime。BoundsChecker为代码检错工具,TrueCoverage为測试覆盖率统计工具,TrueTime为程序执行性能測试工具。
本文挡通过三章对NuMega三个子功能的用法进行了介绍,各部分之间内容独立。假设你想了解NuMega的各项功能,建议阅读本文挡所有内容,假设你仅仅想了解NuMega提供的某一个子功能的相关信息,按文件夹查看对应的章节就可以。
须要说明的一点是,本文挡中所介绍的測试工具NuMega,专指NuMega for Visual C++版,对于NuMega for Visual Basic版和NuMega for Delphi版的使用说明,不在本文挡的介绍范围之内,这一点请注意。
2安装
NuMega的安装非常easy。获得NuMega安装程序后,点击setup.exe进行安装就可以。在安装过程中不须要什么特殊的设置。
只是有一点须要说明,在安装NuMega之前,应该确保你的机器上已经安装好了Visual C++,由于仅仅有这样才干使NuMega成功的集成到Visual C++开发环境中去。
好了,以下我们分三个部分,分别介绍BoundsChecker、TrueCoverage、TrueTime的用法。
3 BoundsChecker
BoundsChecker 是一个Run-Time错误检測工具,它主要定位程序在执行时期发生的各种错误。BoundsChecker能检測的错误包含:
1))1、指针操作和内存、资源泄露错误,比方:
内存泄露;
资源泄露;
对指针变量的错误操作。
22、内存操作方面的错误,比方:
内存读、写溢出;
使用未初始化的内存。
33、API函数使用错误
BoundsChecker成功安装后,在你的VC++集成开发环境中,会多出了一个名为BoundsChecker的菜单,例如以下所看到的:
图3-1 BoundsChecker在VC++集成开发环境中加入�的菜单
BoundsChecker 已经很完善的集成到VC++集成开发环境中了。
使用BoundsChecker对程序的执行时错误进行检測,有两种使用模式可供选择。一种模式叫做ActiveCheck,一种模式叫做FinalCheck。以下分别进行介绍。
3.1 ActiveCheck
ActiveCheck是BoundsChecker提供的一种方便、快捷的错误检測模式,它能检測的错误种类有限,仅仅包含:内存泄露错误、资源泄露错误、API函数使用错误。
要想使用ActiveCheck模式来检測程序的执行时错误,仅仅需在VC++集成开发环境中打开BoundsChecker功能,然后从调试状态执行程序就可以。此时ActiveCheck会在后台自己主动执行,随时检測程序是否发生了错误。以下说一下详细的使用步骤。
3.1.1 用ActiveCheck来检測错误
使用ActiveCheck的详细的操作过程例如以下:
首先,在VC++集成开发环境中打开你要对其进行測试的程序,同一时候保证项目处于Debug编译状态下。
其次,确保VC++集成开发环境中[BoundsChecker/Integrated Debugging]菜单项和[BoundsChecker/Report Errors and Events]菜单项处于被选中的状态。仅仅有这两项被选中,BoundsChecker才会在程序执行过程中发挥作用。
最后,在VC++集成开发环境中选择[Build/ Start Debug/Go]菜单命令,在Debug状态下执行程序,ActiveCheck也在后台開始执行了。
这时,就能够依照制定好的測试用例,对程序进行操作。凡是程序运行过的代码,假设存在错误,ActiveCheck就会记录下来。
有一个地方要说一下,在[BoundsChecker]菜单中有一项[Report Errors Immediately],例如以下图所看到的:
图3-2 关于[BoundsChecker / Report Errors Immediately] 菜单项
该菜单项对于ActiveCheck 模式,以及以下就要介绍的FinalCheck模式的作用是一样的,即:假设不选中该项,则BoundsChecker会记录程序执行过程中发现的各种错误,直到程序结束后再进行报告;当选中该菜单项时,在程序的执行过程中,一旦BoundsChecker发现错误,会立即弹出例如以下的对话框进行提示:
图3-3 错误报告对话框
以下按图中标注的数字序号解释一下对话框中各个button的功能:
button1:点击该button,则表示先临时不理会这个错误,继续运行程序。
button2:点击该button,则会立即跳转到出现故障的代码行处。处理完问题后,点击[Build/ Start Debug/Go]菜单项,能够继续运行程序,进行检測。
button3:点击该button,则将该错误加入�到被忽略的错误列表中去,当再次出现这个问题时,BoundsChecker将不会进行报告。
button4:点击该button,则马上终止程序的运行。
button5:点击该button,会显示当前内存的申请、使用情况。
button6:点击该button,会得到当前这个错误的帮助信息。
button7、8: 这两个button与[BoundsChecker/Report Errors Immediately]和[BoundsChecker/ Report Errors and Event] 菜单命令的功能是全然一样的,在此不再赘述。
button9:点击该button,会显示/隐藏与该错误有关的函数调用堆栈情况,以及详细的出错代码行的位置。
是否选中[BoundsChecker/Report Errors Immediately]菜单项,全然取决于你自己的喜好,以及測试时的详细情况。假设你想要BoundsChecker在程序执行过程中实时向你汇报发现的错误,那么你就选中这个菜单项;假设想等到操作结束后,再对操作过程中BoundsChecker发现的错误统一进行分析,就不必选中这个菜单项。我在寻常使用过程中更偏向于使用后一种。
3.1.2 分析错误
在你操作所有结束,退出程序后,
BoundsChecker 会显示一个所发现错误的列表。我们须要对列表中罗列的错误进行分析,来确定错误的原因和位置。
在错误检測结果列表中,罗列出了在程序的运行过程中ActiveCheck检測到的全部的内存泄露、资源泄露和API函数使用错误的相关信息。例如以下图所看到的:
图3-4 错误检測结果
在左边的窗体中,逐条列出了程序在内存、资源、API 函数使用上的问题,包含:该问题的种类,该问题发生的次数,假设是内存泄露,损失了多少内存,以及发生该问题的代码位置等等。当你用鼠标单击选中某一条记录时,在右边的窗体中会显示出与该条错误记录相相应的函数调用堆栈情况。当你用鼠标双击某一条错误记录时,会定位到引发该错误的源码处。
好了,BoundsChecker在ActiveCheck模式下的用法至此介绍完了,是不是非常easy?
在ActiveCheck模式下检測程序时,程序的执行速度基本不受影响,但其缺点是检測的错误种类有限,即仅仅能检查出内存泄露错误、资源泄露错误、API函数使用错误。BoundsChecker 提供了第二种检測错误的模式—— FinalCheck,也就是我们在前面提到的BoundsChecker的第二种使用模式。 FinalCheck能够检測出程序中很多其它的错误。以下我们就对它进行介绍。
3.2 用 FinalCheck检測很多其它的错误
FinalCheck具有BoundsChecker提供的全部检错功能。FinalCheck 是ActiveCheck的超集,它除了可以检測出ActiveCheck可以检測出的错误,还能发现非常多 ActiveCheck 不能检測到的错误,包含:指针操作错误、内存操作溢出、使用未初始化的内存等等,而且,对于ActiveCheck能检測出的错误,FinalCheck可以给出关于错误更具体的信息。所以,我们可以把FinalCheck觉得是ActiveCheck的功能增强版。我们付出的代价是:程序的执行速度会变慢,有时甚至会变的非常慢。
要想在FinalCheck 模式下測试程序,不能使用VC++集成开发环境提供的编译连接器来构造程序,而必需要使用BoundsChecker提供的编译连接器来编译连接程序。当 BoundsChecker的编译连接器编译连接程序时,会向程序中插装一些错误检測代码,这也就是FinalCheck可以比ActiveCheck找到很多其它错误的原因。
以下就
介绍一下怎样在FinalCheck模式下对程序进行測试:
1在VC++集成开发环境中打开你所要測试的项目。
2因为要使用BoundsChecker的编译连接器又一次编译连接程序,所以我们为BoundsChecker独自构造一个目录。在VC++集成开发环境中,详细操作方法是:
A)点击[ Build/Configurations...]菜单命令。
B)在弹出的对话框中点击 Add button。在Configuration 编辑框中添入你为BoundsChecker创建的目录的名称,这个名称是随意的,比方我们取名为BoundChecker。
C)在 Copy settings from组合框中选中 XXX—Win32 Debug项,然后点击OKbutton,接着点击Closebutton。
如今,我们已经为FinalCheck构造好了一个目录。
3 点击[Build/Set Active Configuration…] 菜单命令,选中你刚才为BoundsChecker建的目录, 然后点击OKbutton。这样BoundsChecker编译连接程序时生成的中间文件、可运行程序,都会被放到该目录下。
4选择[BoundsChecker/Rebuild All with BoundsChecker] 菜单命令,对程序又一次进行编译连接,也就是在这时,BoundsChecker向被測程序的代码中添�了错误检測码。编译连接完毕后,BoundsChecker会在你为BoundsChecker构造的目录中生成可运行文件。
在FinalCheck模式下对程序进行检測的准备工作都已经做好,这时能够启动程序開始測试了,
操作步骤与在ActiveChecker模式下没什么差别。详细过程例如以下:
- 确保VC++集成开发环境中[BoundsChecker/ Integrated Debugging]菜单项和[BoundsChecker/Report Errors and Events]菜单项处于选中状态。
- 点击[ Build/Start Debug]菜单,选中“Go” 菜单项。程序開始在Debug状态下执行。
- 依照你制定好的測试用例,对程序进行操作。
- 当BoundsChecker检測到了错误时,会弹出窗体向你汇报,你能够当时就进行处理,也能够等到你的操作所有完毕,退出程序之后再对列出的这些错误进行分析。这全然取决于你是否选中了[BoundsChecker/Report Errors Immediately] 菜单项。
- 退出程序后,BoundsChecker会给出错误检測结果列表。该错误列表与ActiveChecker给出的错误列表的查看方法全然一样。仅仅只是这个列表中所报告的信息会很多其它、更具体一些。
好了,BoundsChecker在FinalCheck模式下的使用也介绍完了。ActiveChecker、FinalCheck这两种模式,比較而言各有长短。ActiveChecker使用方便,仅仅需在Debug状态下直接执行程序就可以,而且程序的执行速度较快,但检測的错误种类有限;FinalCheck模式下,须要使用BoundsChecker的编译连接器又一次编译连接生成可执行程序,而且程序的执行速度比較慢,但检測的错误种类、提供的错误相关信息要多于ActiveChecker。所以,何时使用何种模式,应依据当时的详细情况而定。
3.3 检測Win32 API函数的兼容性
BoundsChecker还提供了一个功能——检測程序中使用的Win32 API函数在不同平台上的兼容性。该功能与前面提到的ActiveChecker、FinalCheck模式没有什么关系,它是独立的一个功能。
尽管大多数Win32 API函数都适用于Win95、Win98、Win2000、WinNT等不同的Windows操作系统平台,但并非全部的API函数都满足这样的情况。你可能不知不觉的使用了在某一个平台下同意,在还有一个平台下却不同意使用的API函数,而项目的要求是:程序可以在这两种平台下执行。 BoundsChecker提供的这个检測Win32 API函数兼容性的功能,恰好可以处理这个问题。
该功能的用法例如以下:
启动[BoundsChecker/View/Compliance Report]菜单命令,例如以下图所看到的:
图3-5 启动Win32 API函数兼容性检測功能
会弹出以下的窗体:
图3-6Win32 API函数兼容性检測功能
在对话框中选择程序承诺可以执行的平台,以及被要求遵从的其它标准(标准C和扩展的标准C),点击“OK”button,BoundChecker会给出兼容性检測报告。
3.4 忽略错误
在某些情况下,我们须要忽略BoundsChecker报告的一些错误,这些情况包含:
1 误报。BoundsChecker 指定程序中的某段代码存在错误,但经过我们的细致检查,证实程序确实没有这个错误,这是BoundsChecker的误报。工具毕竟是工具,它仅仅能按照为它制定的算法行事,所以会有误报的情形发生。但千万不要轻易认定某一个错误为误报,一定要对错误进行细致的分析,确定是真正的误报。
2第三方的代码。BoundsChecker指定的发生错误位置在第三方提供的代码中,包含第三方提供的程序库、DLL、OCX等。对于这种情况,我们也要先进行认真的检查,确定不是因为我们错误的使用第三方的代码引起的。假设最后确定不是我们的原因,则这种错误报告能够忽略。
3.5 其它
另一点须要强调,使用BoundsChecker对程序进行測试时,须要有程序的源代码。假设没有源代码,BoundsChecker尽管也能够打开EXE文件将其运行起来,但得出的測试结果常常是不对的,因此也就没有太大的意义。
另外,除了能够在VC++集成开发环境中使用BoundChecker外,从 [開始菜单] 中启动BoundChecker,然后打开经BoundChecker编译连接生成的可运行文件,也能够对程序进行測试,操作方法与集成到VC++集成开发环境中的BoundChecker的操作方法是一样的,在此就不赘述了。
至此,BoundChecker所提供的功能所有介绍完了。
4 TrueCoverage
覆盖率对于測试来说是一项重要的数据。在我们运行了针对一个功能模块的全部測试用例后,很想了解測试对于模块代码的覆盖情况,也就是測试覆盖率到达了多少,以此来推断測试工作能否够结束,假设还未达到測试目标,怎样进一步补充測试用例。
对于这些问题,假设没有覆盖率统计工具的帮助,而想通过手工来进行,差点儿是不可能的。
TrueCoverage的功能就是统计測试覆盖率,它恰好能为我们就上面这个问题提供帮助。TrueCoverage给出的覆盖率是“语句覆盖”,是最低覆盖强度的覆盖率,所以我们測试的项目,用TrueCoverage统计后,应尽量达到100%的覆盖。
TrueCoverage的应用阶段为单元測试阶段和集成測试阶段。
和BoundChecker一样,TrueCoverage成功安装后,在你的VC++集成开发环境中,会多出一个名为TrueCoverage的菜单,例如以下图所看到的:
图4-1 TrueCoverage在VC++集成开发环境中加入�的菜单
这说明,TrueCoverage已经完善的集成到VC++集成开发环境中了。
以下開始介绍TrueCoverage的详细使用步骤。
4.1 使用TrueCoverage
TrueCoverage使用步骤:
1 在VC++集成开发环境中,打开你所要測试的项目。
2 为TrueCoverage构造一个目录,方法为:
首先,点击[ Build/Configurations...]菜单命令。
其次,在弹出的对话框中点击 Add button。
然后,在Configuration 编辑框中添入你为TrueCoverage创建的目录的名称,这个名称是随意的,比方我们叫做TrueCoverage。
最后,在 Copy settings from组合框中选中 XXX—Win32 Debug项,然后点击OKbutton,接着点击Closebutton。
如今,我们已经为TrueCoverage构造好了一个目录。
3 点击[Build/Set Active Configuration…] 菜单命令,选中你刚才为TrueCoverage建的目录,然后点击OKbutton。
4 选择[TrueCoverage/Rebuild All with TrueCoverage] 菜单命令,用TrueCoverage的编译连接器对程序又一次进行编译连接。TrueCoverage对程序进行编译连接时生成的中间文件、可运行程序,会放到你刚才为TrueCoverage创建的目录下。在这个编译连接过程中,TrueCoverage向可运行程序中插入了一些信息,这也就是 TrueCoverage可以跟踪、统计測试覆盖率的原因。
5点击[TrueCoverage/Run with TrueCoverage] 菜单命令,TrueCoverage被启动,接着你的程序也被运行起来。如今就能够依照事先已经制定好的測试用例,在程序中逐个进行运行了, TrueCoverage会在后台记录程序的运行覆盖情况。
在TrueCoverage界面中有一个工具条,我们有必要在这里对它做一下说明。例如以下所看到的:
图4-2 执行控制工具条
这个工具条在程序执行起来后,会由不可用状态变为可用状态。工具条上各button功能为:
button1:假设在程序的执行过程中你按下了该button,则覆盖率的统计仅仅计算到此,你还能够继续操作程序,但此时对程序的不论什么操作都不再计入到覆盖率统计中去了。
button2:假设在程序的执行过程中你按下了该button,则TrueCoverage会立即显示截止到眼下为止的測试覆盖率情况。之后你能够继续操作程序,TrueCoverage会继续在后台记录程序的执行覆盖情况。
button3:假设在程序的执行过程中你按下了该button,则TrueCoverage会清除在这之前的覆盖数据,使各项覆盖率的数据均为零。你能够继续操作,TrueCoverage在后台从零開始又一次记录程序的执行覆盖情况。
6 当你退出程序时,TrueCoverage会显示本次操作结束后,程序的运行覆盖情况,包含:整个可运行程序的覆盖情况、每一个代码文件的覆盖情况、每一个代码文件里每一个函数的覆盖情况,对于这些覆盖率统计结果,能够文件的形式进行保存。要想再次运行程序,点击TrueCoverage 中的[Program/ Start]菜单命令就可以。
我们不太可能一次运行全然部的測试用例。TrueCoverage 为我们想到了这一点。在我们每次使用TrueCoverage运行起程序,运行了一些用例,关闭程序,并保存这一次的覆盖率统计结果后, TrueCoverage会询问你是否将本次的測试结果合并到总的覆盖率统计结果中去,普通情况下,我们合并进去就能够了。
以下介绍一下TrueCoverage的界面,按图中的编号分别给出说明。
图4-3 TrueCoverage的执行界面
1:表示程序在某一次运行结束后的測试覆盖情况。双击某一个条目,会在3、4部分的窗体中显示关于本次覆盖率的具体信息。本图中的情况,表示測试人员运行了两次程序。
2:表示程序当前总的測试覆盖情况,是多个1合并后的结果。双击该条目,会在3、4部分的窗体中显示关于总覆盖率的具体信息。
3:该窗体中显示的数据与你当前选中的某一次或总的測试覆盖统计结果相相应(即前面说到的1、2)。该窗体中显示的数据包含:程序的覆盖率、每一个代码文件的覆盖率。更具体的信息显示在窗体4中。
4:该窗体中显示的数据与你在窗体3中的选择相相应,显示了各个函数的測试覆盖情况。用鼠标双击某一个函数,会显示该函数的源码,TrueCoverage用不同的颜色标识运行过的和未被运行过的代码,例如以下图所看到的:
图4-4 TrueCoverage用不同颜色标识运行过的和未被运行过的代码
TrueCoverage 默认情况下,用绿色代表已运行的代码,用红色代表未被运行的代码,用黑色代表不可运行的代码(你能够通过选择TrueCoverage的 [program/setting]菜单命令,在启动的对话框中的setting标签页中进行设置,来改变这样的默认情况)。通过这些信息,我们能够有针对性的添加�、改动用例,来提高測试覆盖率。
4.2 对内联函数的处理
内联函数尽管具有函数的形式,但其机制与函数全然不同,所以,在用TrueCoverage统计測试覆盖率时,对内联函数须要採用不同的处理方式。
默认情况下,TrueCoverage是不会统计内联函数的运行覆盖率的。假设你须要得到内联函数的覆盖率数据,则须要进行一些额外的设置,详细方法是,在VC++的集成环境中选择[TrueCoverage/TrueCoverage Setting...]菜单命令,弹出例如以下对话框:
图4-5 内联函数设置
选中“Instrument inline function”复选框,点击OK。
然后选择[TrueCoverage/Rebuild All with TrueCoverage] 菜单命令,又一次进行编译连接,对于这个可运行程序,TrueCoverage在其运行过程中就行记录内联函数的覆盖率数据了。
4.3 TrueCoverage与BoundsChecker的结合使用
TrueCoverage与BoundsChecker能够结合起来使用。在[BoundsChecker]和[TrueCoverage]菜单下,都有一个[Rebuild with BoundsChecker and TrueCoverage]项,通过这一菜单命令编译连接生成的可执行文件,在程序执行结束后,能同一时候得到TrueCoverage和BoundsChecker(FinalCheck)的检測结果。
但这里有一个限定,那就是:必须由BoundChecker打开该exe程序运行,或是在VC++集成开发环境中通过Debug来运行该exe。这样在运行完程序后,能同一时候得到TrueCoverage和BoundsChecker(FinalCheck)的检測结果,假设你通过TrueCoverage来运行程序,则仅仅会得到TrueCoverage检測结果。这一点请注意。
4.4 其它
与BoundsChecker一样,要使用TrueCoverage,一定要有被測程序的源代码。假设没有源代码,TrueCoverage无法统计覆盖率。
除了能够在VC++的集成环境中使用TrueCoverage外,从 [開始菜单] 中启动TrueCoverage,然后打开经TrueCoverage编译连接生成的可运行文件,也能够进行覆盖率的统计,操作方法与集成到VC++集成开发环境中的TrueCoverage的操作方法一样,在此不再赘述。
TrueCoverages的使用介绍到此结束了,该工具对于我们进行測试覆盖率统计、补充測试用例的工作非常实用处。
5 TrueTime
怎样提高代码的执行效率,是开发过程中的一个重要问题。一个应用程序执行速度慢,但不easy找到到底是在哪里出了问题,所以查找出性能瓶颈的位置是调整代码性能的关键。TrueTime 就是一个相应用程序的执行性能进行分析,查找程序性能瓶颈的工具。
TrueTime 能够收集、显示应用程序执行性能的相关数据,这些数据包含每个模块(EXE、DLL、OCX等)的执行性能,每个函数的执行性能,对于有源码的部分,TrueTime还能够给出每一行代码的执行性能。通过这些数据,我们能够确定系统的性能瓶颈,进一步优化程序的性能。
值得一提的是,TrueTime 在收集应用程序执行性能数据时,使用了一种叫做“Quantum”的技术。“Quantum”技术可以将你測试的应用程序所包括的线程的执行时间,与操作系统中同一时候执行着的其它应用程序的线程的执行时间区分开来计算,也就是说,TrueTime仅仅会计算花费在你的应用程序的线程上的时间片。这样一来,在同一台计算机上对同一应用程序的性能測试结果,不会由于在该计算机系统中所执行的程序的多少而改变。所以,仅仅要程序执行的硬件条件不发生改变, TrueTime的測试结果也基本不会变化,所以TrueTime相应用程序性能測试的结果是可复现的。
TrueTime成功安装后,在你的VC++集成开发环境中,会多出一个名为TrueTime的菜单,例如以下图所看到的:
图5-1 TrueTime在VC++集成开发环境中加入�的菜单
这说明,TrueTime已经完善的集成到VC++集成开发环境中了。
以下開始介绍TrueTime的详细使用步骤。
5.1 使用TrueTime
TrueTime使用步骤:
1在VC++集成开发环境中打开你所要測试的项目。
2 为TrueTime构造一个目录 ,详细方法是:
首先,点击[ Build/Configurations...]菜单命令。
其次,在弹出的对话框中点击 Add button。
然后,在Configuration 编辑框中添入你为TrueTime创建的构造目录的名称,这个名称是随意的。比方我们取名为TrueTime。
最后,在 Copy settings from组合框中选中 XXX—Win32 Debug项,然后点击OKbutton,接着点击Closebutton。
如今,我们为TrueTime构造好了一个目录。
3 点击[Build/Set Active Configuration…] 菜单命令,选中你刚才为TrueTime创建的目录, 然后点击OKbutton。
4 选中[TrueTime/Rebuild All with TrueTime] 菜单命令,用TrueTime的编译连接器对程序又一次进行编译连接。TrueTime对程序进行编译连接生成的中间文件、可运行程序,都会被放到你为 TrueTime创建的目录下。在这个编译连接过程中,TrueTime向可运行程序中插入了一些信息,这也就是TrueTime可以记录程序运行性能的原因。
5点击[TrueTime/Run with TrueTime] 菜单命令,TrueTime被启动,接着你的程序也被启动并运行起来。
这时,依照事先制定好的測试用例,运行測试用例。TrueTime会记录下被运行到的程序代码的性能数据。
在TrueTime界面中有一个工具条,它的外观与我们在TrueCoverage中说到的那个工具条全然一样,实现的功能也基本一样,仅仅是在TrueCoverage中,它控制的是覆盖率,在这里,它控制的是性能数据。我们如今来对它做一下说明。例如以下所看到的:
图5-2 执行控制工具条
这个工具条在程序执行起来后,会由不可用状态变为可用状态。工具条上各button功能为:
button1:假设在程序的执行过程中你按下了该button,则性能统计仅仅计算到此,尽管还能够继续操作程序,但此时对程序的不论什么操作都不再计入到性能统计中去了。
button2:假设在程序的执行过程中你按下了该button,则TrueTime会立即显示截止到眼下为止的性能统计情况。之后你能够继续操作程序,TrueTime会继续在后台记录程序的性能数据。
button3:假设在程序的执行过程中你按下了该button,则TrueTime会清除在这之前所记录的性能数据,使各项性能数据为零。你能够继续操作,TrueTime在后台从零開始又一次记录程序的性能数据。
6当你退出程序时,TrueTime会显示本次操作过程中被运行到的模块、函数、代码行的运行性能数据。要想对程序開始一次新的性能统计,点击TrueTime 中的[Program / Start]菜单命令就可以。
TrueTime检測结果的界面例如以下:
图5-3 TrueTime的执行界面
区域1:
列出了多次执行应用程序后,得到的多个性能检測结果。双击某一项,会在区域2、区域3中显示应用程序在这一次执行过程中的具体性能数据。
区域2:
该窗体中显示的数据与你在区域1中选中的某一次性能检測相相应。窗体中显示的数据以模块(exe、dll等)为单位,列出了程序在某一次运行过程中,各模块的性能数据。对于各模块更为具体的性能数据,显示在区域3中。
区域3:
该窗体中显示的数据与你在区域2中的选择相相应,显示了模块中各个函数的性能数据。在区域3中有三个标签页——Function List标签页、Source标签页、Session Summary标签页。每一个标签页中都列出了一组性能数据。事实上要使用TrueTime,也就是要了解这些性能数据的含义。以下依照标签页对各项性能数据的含义进行解释:
Function List标签页
在Function List标签页中,用鼠标左键双击某一个函数,会弹出一个对话框,例如以下图所看到的:
图5-4 性能数据查看对话框
通过该对话框,可以查看该函数的父函数(调用该函数的函数)、子函数(被该函数调用的函数)的性能信息。
Function List标签页列出了选定模块所包括的函数的性能数据,这些数据包括:
Function Name——函数名称。
% in Function——这是一个百分比,分子为该函数执行的时间,分母为系统从開始执行到结束的时间。
% with Children —— 这是一个百分比,分子为该函数执行的时间,当中包含在该函数中又调用的子函数的执行时间,分母为系统从開始执行到结束的时间。
Called——函数在本次的运行过程中被调用的次数。
Image——函数所在的模块名称(模块指EXE、DLL、OCX等)。
% in Image——这是一个百分比,分子为该函数执行的时间,分母为该函数所在的模块(EXE、DLL、OCX)执行的时间。
Average——函数多次执行时的平均执行时间,当中不包含该函数调用的子函数的执行时间。
First——函数第一次运行所耗费的时间。
Minimum——函数的多次运行中,耗费时间最短的那一次所用的时间。
Maximum——函数的多次运行中,耗费时间最长的那一次所用的时间。
Average with Children——函数被多次运行时,平均运行时间,当中包含该函数调用的子函数运行的时间。
Real——函数的平均执行时间,包含该函数调用的子函数所执行的时间,除此之外,还包含了花费在系统中同一时候执行着的其它应用程序的线程所耗费的时间。
Address——函数的入口地址。
Source标签页
Source标签页列出了选定模块的指定源文件所包括的各行程序代码的性能数据,这些数据包括:
Count——该行代码在測试过程中被运行的次数。
% of Function——这是一个百分比,分子为该行代码运行的时间,分母为该函数运行的时间。
% With Children——这也是一个百分比,分子为该行代码执行的时间,分母为系统从開始执行到结束的时间。
Time——在系统的执行过程中,该行代码执行时间的累计和。
Functions——该行代码调用的函数的数量。
Line#——代码所在行的行号。
Source——源码。
Session Summary标签页
Session Summarye标签页列出了该次性能统计的概要信息,内容非常好理解,在此就不具体介绍了。
TrueTime为性能数据提供了四种不同的单位,各自是:CPU时钟周期、微妙、毫秒、秒。我们可通过TrueTime中的[View/Scale]菜单项进行设置,例如以下:
图5-5 性能数据单位设置菜单
在菜单中选中哪一项,性能数据就会以该时间单位显示。
5.2 其它
TrueTime能够收集没有源代码部分(比方第三方的DLL、OCX等)的执行性能数据,但假设我们想获得某一个模块的具体执行性能数据,还是须要该模块的源代码。
除了能够在VC++集成环境中使用TrueTime外,从 [開始菜单] 中启动TrueTime,然后打开经TrueTime编译连接生成的可运行文件,也能够进行性能数据的收集,操作方法与集成到VC++集成开发环境中的TrueTime的操作方法一样,在此不再赘述。
TrueTime的介绍到此就结束了。
6 结束
至此,NuMega for Visual C++的三个子功能——BoundChecker、TrueCoverage、TrueTime的用法,都已经介绍完成。如今我们应该做的就是使用NuMega去測试程序,在实践中进一步深入了解这个白盒測试工具。