1 前言
我在本文中介绍了NuMega Devpartner Studio 6.5测试工具套件(以下简称NuMega)在测试过程中应用的问题,以使该工具能更好的辅助我们的测试工作。
文中所介绍的NuMega,专指NuMega for Visual C++版,对于NuMega for Visual Basic版和NuMega for Delphi版的使用说明,不在本文的介绍范围之内,这一点请注意。
2 应用方案
NuMega for Visual C++版共提供了三个工具BoundsChecker、TrueCoverages和TrueTime。我们也分三部分分别介绍BoundsChecker、TrueCoverages、TrueTime在测试过程中的应用。因为本文只讨论工具与测试过程的结合,所以对工具功能只做简单介绍。如果想要详细了解工具的功能和使用,请参见我Blog中的另一篇文章——《单元测试工具Numega》。
好了,现在就开始,先来说BoundsChecker。
2.1 BoundChecker
BoundsChecker主要定位程序在运行时期发生的各种错误。BoundsChecker能检测的错误包括:内存泄露;资源泄露;对指针变量的错误操作;内存读、写溢出; 使用未初始化的内存;API函数使用错误等等。
BoundsChecker是一个动态、白盒测试工具,最适合在单元测试阶段、集成测试阶段使用。在使用BoundsChecker对程序进行检测时,要求有程序的源代码。
在单元测试阶段、集成测试阶段使用BoundsChecker的基本步骤是:
1、为被测试程序制定测试用例。这一步很重要,因为BoundsChecker只能检查被执行过的代码中是否存在错误,如果某一部分的代码没有被执行到,即使这部分代码有问题,BoundsChecker也不能发现。所以,在开始使用BoundsChecker前,为被测程序制定覆盖全面的测试用例非常重要。
2、执行测试用例。打开BoundsChecker功能,运行被测试的程序,按照制定好的测试用例,逐个执行。在操作被测试程序时,就象操作平常的程序一样,输入数据,点击鼠标,观察预期的结果,BoundsChecker会在后台跟踪、监视程序的运行情况,一旦发现错误,会马上记录下错误的相关信息。
这个时候,BoundsChecker的价值就体现出来了。反映在功能上的错误,我们通过观察马上就可以发现,但对于象内存泄露这样的“癌症”,光从程序运行的外表是不能发现的,所以这种错误也就更可怕。通过BoundsChecker,能增强我们对程序内部正常运行的信心。
3、第三步就是分析错误了。根据BoundsChecker列出的错误列表,分析错误产生的原因。对于每一个错误,BoundsChecker会给出该错误的类型、描述、发生位置等信息。
4、除了用BoundsChecker检查程序中的Run-Time错误外,还可以使用BoundsChecker检测程序中使用的Win32 API函数在不同平台上的兼容性。能检测的平台包括:Windows2000、Windows NT 4.0、Windows NT 3.51、Windows 98、Windows 95、Windows CE 2.0,除此之外,还可以检测代码是否符合标准C和扩展标准C的要求。
5、最后,根据发现的问题,提交检测报告。
BoundsChecker的应用就是这些内容。再重申一遍,使用该工具时,制定覆盖全面的测试用例非常重要,因为BoundsChecker只能检查被执行过的代码中是否存在错误,对于没有被执行过的代码,BoundsChecker不会有任何反映。
2.2 TrueCoverage
覆盖率对于测试来说是一项重要数据。在我们执行了针对一个功能模块的所有测试用例后,非常想了解测试对于模块代码的覆盖情况,也就是测试覆盖率达到了多少,以此来判断测试工作是否可以结束,如果还未达到测试目标,如何进一步补充测试用例。对于这些问题,如果没有覆盖率统计工具的帮助是很难进行的。
TrueCoverage的功能就是统计测试覆盖率,它恰好能为我们就上面这个问题提供帮助。在使用TrueCoverage记录程序的覆盖情况时,要有程序的源代码。
TrueCoverage统计测试覆盖率时是针对代码级的,所以只适合应用于单元测试阶段和集成测试阶段,将TrueCoverage(包括类似的覆盖率统计工具)应用到系统测试上去是不适宜的。
在单元测试、集成测试阶段使用TrueCoverage的基本步骤是:
1、制定出尽可能完善的测试用例。这一步和是否使用TrueCoverage没有太大的关系,不管你是否统计覆盖率,对于测试来说,制定出完善的测试用例都是必要的。
2、打开TrueCoverage,启动被测试的程序,依次执行测试用例。你就象往常那样操作程序,按照测试用例进行输入,观察实际输出,并与预期输出进行比较,最后记录下每个测试用例的执行结果。TrueCoverage会在后台记录程序的执行覆盖情况。
3、查看、分析测试覆盖情况。在执行完事先制定好的测试用例后,根据TrueCoverage提供的测试覆盖率信息,决定测试工作是否可以结束,如果还未达到测试目标,我们可以根据TrueCoverage提供的测试覆盖率信息,进一步补充测试用例。TrueCoverage用不同的颜色标识被执行的代码和未被执行的代码,这很有利于我们补充测试用例。
4、最后,达到事先要求的覆盖率。
TrueCoverage给出的覆盖率是“语句覆盖”,是一种低强度的覆盖率,所以我们测试的项目,用TrueCoverage统计覆盖率后,应使其尽量趋近100%。
TrueCoverage在我们的测试工作中是一个辅助、引导的角色,它本身并不能发现程序中的错误。它的作用是使我们能够了解当前测试达到的状况,并为进一步增强测试提供依据。
2.3 TrueCoverage和BoundsChecker的结合使用
TrueCoverage和BoundsChecker这两个工具可以结合起来使用。NuMega集成到VC++ IDE后,在TrueCoverage和BoundsChecker菜单下,都有一个菜单项[Rebuild with BoundsChecker and TrueCoverage],通过这一菜单命令编译连接生成的可执行文件,在程序运行结束后,能同时得到TrueCoverage和BoundsChecker(FinalCheck)的检测结果。
2.4 TrueTime
如何提高代码的运行效率,是开发过程中的一个重要问题。程序运行速度慢,但不容易找到是在哪里出了问题,查找性能瓶颈的位置就成为解决问题的关键。TrueTime 就是一个对应用程序的运行性能进行分析,查找程序性能瓶颈的工具。
TrueTime 能收集、显示应用程序运行性能的相关数据,这些数据包括每个模块(EXE、DLL、OCX等)的运行性能, 每一个函数的运行性能,对于有源代码的部分,TrueTime还可以给出每一行代码的运行性能。这些正是我们进行性能测试所需要的数据。
使用TrueTime的基本步骤是:
1、制定测试用例。TrueTime只能给出被执行过的代码的性能数据,未被执行的代码不会显示性能数据。
这一步看起来好象与使用BoundsChecker、TrueCoverages的第一步一样,其实不然。在BoundsChecker、TrueCoverages中,要求测试用例制定的尽可能详细、全面,但在TrueTime 中没有这个要求,这是因为使用TrueTime的目的与前两者不一样。TrueTime用来测试程序的运行性能,但我们并不是对程序任何部分的性能都感兴趣,因此,我们只需要那些覆盖了想要了解其性能的功能部分的测试用例,比如:实际运行速度较慢的功能部分、需提供给用户性能指标的功能部分等。所以,在使用TrueTime测试程序的性能数据时,制定的测试用例是有针对性的,并不要求有多么多么的全面。
2、打开TrueTime,启动被测试的程序,执行测试用例。TrueTime会在后台记录下程序的性能数据。
3、查看、分析、报告性能数据。在执行完有针对性的测试用例后,根据TrueTime提供的性能数据,可以得出程序的性能测试报告。
3 结束
BoundsChecker、TrueCoverages和TrueTime在测试中的应用就介绍到这了。这三个工具,最适合应用的测试阶段是单元测试、集成测试阶段,当进行这两个测试阶段的工作时,可考虑使用这些工具。