【IT168 技术文章】
1引言
最近几年,软件测试在国内越来越受到重视,因为大家逐渐认识到了软件测试对于保证软件质量的重要性。随着对软件测试重视的提高,国内软件测试技术的发展也很快,逐渐从过去手工作坊式的测试向测试工程化的方向发展。
要真正实现软件测试的工程化,其基础之一就是要有一大批支持软件测试工程化的工具。因此,软件测试工具对于实现软件测试的工程化来说至关重要。本文就从如何进一步提高软件测试质量和效率的角度出发,讨论测试工具在软件测试过程中的应用。
2为什么要引入测试工具
在测试过程中引入测试工具能给我们带来以下的好处。
2.1提高工作效率
这是引入测试工具给我们带来的一个显著好处。那些固定的、重复性的工作,可以由测试工具来完成,这样就使得测试人员能有更多的时间来计划测试过程,设计测试用例,使测试进行的更加完善。
2.2保证测试的准确性
测试是需要投入大量的时间和精力的,人工进行测试时,经常会犯一些人为的错误,而工具的特点恰恰能保证测试的准确性,防止人为疏忽造成的错误。
2.3执行困难的测试工作
有一些测试工作,人工进行是很困难的。有的是因为进行起来较为复杂,有的是因为测试环境难以实现。测试工具可以执行一些通过手工难于执行,或者是无法执行的测试。
3测试工具在软件测试过程中的具体应用
在这一部分,我们讨论测试工具在测试过程中的具体应用。
现在的测试工具很多,基本上覆盖了各个测试阶段。按照工具所完成的任务,可以分为以下几大类:测试设计工具、静态分析工具、单元测试工具、功能测试工具、性能测试工具、测试过程管理工具。下面,我们就针对每一类工具展开介绍。
3.1测试设计工具
测试设计工具,更完整的名称应该是测试用例设计工具,是一种帮助我们设计测试用例的软件工具。
设计测试用例是一项智力性的活动,工具如何能够代替呢?确实是这样,但仔细思考一下我们就会发现,很多设计测试用例的原则、方法是固定的,比如等价类划分、边界值分析、因果图等等,这些成型的方法,很适合通过软件工具来实现。
测试用例设计工具按照生成测试用例时数据输入内容的不同,可以分为:基于程序代码的测试用例设计工具和基于需求说明的测试用例设计工具。下面分别对这两类工具进行介绍。
3.1.1基于程序代码的测试用例设计工具
基于程序代码的测试用例设计工具是一种白盒工具,它读入程序代码文件,通过分析代码的内部结构,产生测试的输入数据。这种工具一般应用在单元测试中,针对的是函数、类这样的测试对象。由于这种工具与代码的联系很紧密,所以,一种工具只能针对某一种(些)编程语言。
这类工具的局限性是——只能产生测试的输入数据,而不能产生输入数据后的预期结果,这个局限也是由这类工具生成测试用例的机理所决定的。所以,基于程序代码的测试用例设计工具所生成的测试用例,还不能称之为真正意义上的测试用例。不过即使这样,这种工具仍然为我们设计单元测试的测试用例提供了很大便利。
3.1.2基于需求说明的测试用例设计工具
这种测试用例设计工具,依据软件的需求说明,生成基于功能需求的测试用例。这种工具所生成的测试用例既包括了测试输入数据,也包括预期结果,是真正完整的测试用例。
使用这种测试用例设计工具生成测试用例时,需要人工的事先将软件的功能需求转化为工具可以理解的文件格式,再以这个文件作为输入,通过工具生成测试用例。在使用这种测试用例设计工具来生成测试用例时,需求说明的质量是很重要的。
由于这种测试用例设计工具是基于功能需求的,所以可用来设计任何语言、任何平台的任何应用系统的测试用例。
我们来看一个这类工具的例子——SoftTest。在使用SoftTest生成测试用例时,先将软件功能需求转化为文本形式的因果图,然后让SoftTest读入,SoftTest会根据因果图自动生成测试用例。在这个过程中,工具的使用者只需要完成由功能需求到因果图的转化,至于如何使用因果图来生成测试用例,则完全由Softtest完成。
所有测试用例设计工具都依赖于生成测试用例的算法,工具比使用相同算法的测试人员设计的测试用例更彻底、更精确,这方面工具有优势。但人工设计测试用例时,可以考虑附加测试,可以对遗漏的需求进行补充,这些是工具无法做到的。所以,测试用例设计工具并不能完全代替测试工程师来设计测试用例。使用这些工具的同时,再人工的检查、补充一部分测试用例,会取得比较好的效果。
3.2静态分析工具
一提到软件测试,人们的第一印象就是填入数据、点击按钮等这些功能操作。这些测试工作确实是重要的,但它们不是软件测试的全部。与这种动态运行程序的测试相对应,还有一种测试被称为静态测试,也叫做静态分析。
进行静态分析时,不需要运行所测试的程序,而是通过检查程序代码,对程序的数据流和控制流信息进行分析,找出系统的缺陷,得出测试报告。
进行静态分析能切实提高软件的质量,但由于需要分析人员阅读程序代码,使得这项工作进行起来工作量又很大。对软件进行静态分析的测试工具在这种需求下也就产生了。现在的静态分析工具一般提供以下两个功能:分析软件的复杂性、检查代码的规范性。
软件质量标准化组织制定了一个ISO/IEC9126质量模型,用来量化的衡量一个软件产品的质量。该软件质量模型是一个分层结构,包括质量因素、质量标准、质量度量元三层。质量度量元处于质量模型分层结构中的最底层,它直接面向程序的代码,记录的是程序代码的特征信息,比如函数中包含的语句数量、代码中注释的数量。质量标准是一个概括性的信息,它比质量度量元高一级,一个质量标准由若干个质量度量元组成的。质量因素由所有的质量标准共同组成,处于软件质量模型的最高层,是对软件产品的一个总体评价。具有分析软件复杂性功能的静态分析工具,除了在其内部包含上述的质量模型外,通常还会从其它的质量方法学中吸收一些元素,比如Halstend质量方法学、McCabe质量方法学。这些静态分析工具允许用户调整质量模型中的一些数值,以更加符合实际情况的要求。
在用这类工具对软件产品进行分析时,以软件的代码文件作为输入,静态分析工具对代码进行分析,然后与用户定制的质量模型进行比较,根据实际情况与模型之间的差距,得出对软件产品的质量评价。
下图是一个商业静态分析工具得出的软件质量与质量模型之间的比较结果。

图3-1静态分析工具得出的软件质量与质量模型之间的比较结果
下图是一个商业的静态分析工具得出的程序中某一个函数的流程图。

图3-2静态分析工具得出的程序中某函数的流程图
具有检查代码规范性功能的静态分析工具,其内部包含了得到公认的编码规范,比如函数、变量、对象的命名规范,函数语句数的限制等等,工具支持对这些规范的设置。工具的使用者根据情况,裁减出适合自己的编码规范,然后通过工具对代码进行分析,定位代码中违反编码规范的地方。
以上就是静态分析工具所具有的功能。与人工进行静态分析的方式相比,通过使用静态分析工具,一方面能提高静态分析工作的效率,另一方面也能保证分析的全面性。
3.3单元测试工具
单元测试是软件测试过程中一个重要的测试阶段。与集成测试、确认测试相比,在编码完成后对程序进行有效的单元测试,能更直接、更有效的改善代码质量。
进行单元测试不是一件轻松的事。一般来讲,进行一个完整的单元测试所需的时间,与编码阶段所花费的时间相当。进行单元测试时,根据被测单元(可能是一个函数,或是一个类)的规格说明,设计测试用例,然后通过执行测试用例,验证被测单元的功能是否正常实现。除此之外,在单元测试阶段,我们还需要找出那些短时间不会马上表现出来的问题(比如C++代码中的内存泄露),还需要查找代码中的性能瓶颈,并且为了验证单元测试的全面性,我们还想了解单元测试结束后,我们的测试所达到的覆盖率。
针对这些在单元测试阶段需要做的工作,各种用于单元测试的工具就产生了。典型的单元测试工具有以下几类:动态错误检测工具、性能分析工具、覆盖率统计工具。
动态错误检测工具,用来检查代码中类似于内存泄露、数组访问越界这样的程序错误。程序功能上的错误比较容易发现,因为它们很容易表现出来。但类似于内存泄露这样的问题,因为在程序短时间运行时不会表现出来,所以不易发现。遗留有这样问题的单元被集成到系统后,会使系统表现的极不稳定。
性能分析工具,记录被测程序的执行时间。小到一行代码、一个函数的运行时间,大到一个exe或dll文件的运行时间,性能分析工具都能清晰的记录下来。通过分析这些数据,能够帮助我们定位代码中的性能瓶颈。
覆盖率统计工具,统计出我们当前执行的测试用例对代码的覆盖率。覆盖率统计工具提供的信息,可以帮助我们根据代码的覆盖情况,进一步完善测试用例,使所有的代码都被测试到,保证单元测试的全面性。
动态错误检测工具、性能分析工具、覆盖率统计工具的运行机理是:用测试工具对被测程序进行编译、连接,生成可执行程序。在这个过程中,工具会向被测代码中插入检测代码。然后运行生成的可执行程序,执行测试用例,在程序运行的过程中,工具会在后台通过插入被测程序的检测代码收集程序中的动态错误、代码执行时间、覆盖率信息。在退出程序后,工具将收集到的各种数据显示出来,供我们分析。
目前被普遍使用的单元测试工具中有Compuware公司的NuMega DevPartner Studio,Rational公司的Rational Suite Enterprise。这些软件产品都是一个工具套件,其中包含了我们前面所讨论的动态错误检测工具、性能分析工具、覆盖率统计工具等。
3.4功能测试工具
在软件产品的各个测试阶段,通过测试发现了问题,开发人员就要对问题进行修正,修正后的软件版本需要再次进行测试,以验证问题是否得到解决,是否引发了新的问题,这个再次进行测试的过程,称为回归测试。
由于软件本身的特殊性,每次回归测试都要对软件进行全面的测试,以防止由于修改缺陷而引发新的缺陷。进行过回归测试人都会深有体会,回归测试的工作量是很大的,而且也很乏味,因为要将上一轮执行过的测试原封不动的再执行一遍。设想一下,如果能有一个机器人,就象播放录影带一样,忠实的将上一轮执行过的测试原封不动的在软件新版本上重新执行一遍,那就太好了。这样做,一方面,能保证回归测试的完整、全面性,测试人员也能有更多的时间来设计新的测试用例,从而提高测试质量;另一方面,能缩短回归测试所需要的时间,缩短软件产品的面市时间。功能测试自动化工具就是一个能完成这项任务的软件测试工具。
功能测试自动化工具理论上可以应用在各个测试阶段,但大多数情况下是在确认测试阶段中使用。功能测试自动化工具的测试对象是那些拥有图形用户界面的应用程序。
一个成熟的功能测试自动化工具要包括以下几个基本功能:录制和回放、检验、可编程。
录制,就是记录下对软件的操作过程,回放,就是象播放电影一样重放录制的操作。启动功能测试自动化工具,打开录制功能,依照测试用例中的描述一步一步的操作被测软件,功能测试自动化工具会以脚本语言的形式记录下你操作的全过程。依照此方法,可以将所有的测试用例进行录制。在需要重新执行测试用例时,回放录制的脚本,功能测试自动化工具依照脚本中的内容,操作被测软件。除了速度非常快之外,通过功能测试自动化工具执行测试用例与人工执行测试用例的效果是完全一样的。
录制只是实现了测试输入的自动化。一个完整的测试用例,由输入和预期输出共同组成。所以,光是录制回放还不是真正的功能测试自动化。测试自动化工具中有一个检验功能,通过检验功能,在测试脚本中设置检验点,使得功能测试自动化工具能够对操作结果的正确性进行检验,这样,就实现了完整的测试用例执行自动化。软件界面上的一切界面元素,都可以作为检验点来对其进行检验,比如文本、图片、各类控件的状态等。
脚本录制好了,也加入了检验点,一个完整的测试用例已经被自动化了。但我们还想对脚本的执行过程进行更多的控制,比如依据执行情况进行判断,从而执行不同的路径,或者是对某一段脚本重复执行多次。通过对录制的脚本进行编程,可以实现上述的要求。现在的主流功能测试自动化工具都支持对脚本的编程。象传统的程序语言一样,在功能测试自动化工具录制的脚本中,可加入分支,循环,函数调用这样的控制语句。通过对脚本进行编程,能够使脚本更加灵活,功能更加强大,脚本的组织更富有逻辑性。在传统的编程语言中适用的那些编程思想,在组织测试自动化脚本时同样适用。
在测试过程中,使用功能测试自动化工具的大体过程是这样的:
●准备录制
保证所有要自动化的测试用例已经设计完毕,并形成文档。
●进行录制
打开功能测试自动化工具,启动录制功能,按测试用例中的输入描述,操作被测试应用程序。
●编辑测试脚本
通过加入检测点、参数化测试,以及添加分支、循环等控制语句,来增强测试脚本的功能,使将来的回归测试真正能够自动化。
●调试脚本
调试脚本,保证脚本的正确性。
●在回归测试中运行测试
在回归测试中,通过功能测试自动化工具运行脚本,检验软件正确性,实现测试的自动化进行。
●分析结果,报告问题
查看测试自动化工具记录的运行结果,记录问题,报告测试结果。
功能测试自动化工具是软件测试工具中非常活跃的一类工具,现在发展的已经较为成熟,象Mercury Interactive公司的WinRunner,Rational公司的Robot,都是被广泛使用的功能测试自动化工具。
3.5性能测试工具
通过性能测试,检验软件的性能是否达到预期要求,是软件产品测试过程中的一项重要任务。性能测试用来衡量系统的响应时间、事务处理速度和其它时间敏感的需求,并能测试出与性能相关的工作负载和硬件配置条件。通常所说的压力测试和容量测试,也都属于性能测试的范畴,只是执行测试时的软、硬件环境和处理的数据量不同。
对系统经常会进行的性能测试包括:系统能承受多少用户的并发操作;系统在网络较为拥挤的情况下能否继续工作;系统在内存、处理器等资源紧张的情况下是会否发生错误,等等。由于性能测试自身的特点,完全依靠人工执行测试具有一定的难度。比如,我们要检验一个基于Web的系统,在10000个用户并发访问的情况下,是否能正常工作。如果通过人工测试的方式,很难模拟出这种环境。在这种情况下,就需要使用性能测试工具。
使用性能测试工具对软件系统的性能进行测试时,大体分为以下几个步骤:
首先,录制下软件产品中要对其进行性能测试的功能部分的操作过程。这一步与前面我们讨论过的功能测试自动化工具中的那个录制过程很相似。功能录制结束后,会形成与操作相对应的测试脚本。
然后,根据具体的测试要求,对脚本进行修改,对脚本运行的过程进行设置,如设置并发的用户数量、网络的带宽,使脚本运行的环境与我们实际要模拟的测试环境一致。
最后,运行测试脚本。性能测试工具会在模拟的环境下执行我们所录制的操作,并实时的为我们显示与被测软件系统相关的各项性能数据。
性能测试工具实际上是一种模拟软件运行环境的工具,它能帮助我们在实验室里搭建出我们需要的测试环境。现在,基于Web是软件系统发展的一个趋势,性能测试也就变的比以往更加重要了,性能测试工具也自然会在软件测试过程中被更多的使用。
3.6测试过程管理工具
软件测试贯穿于整个软件开发过程,按照工作进行的先后顺序,测试过程可分为制定计划、测试设计、测试执行、跟踪缺陷这几个阶段。在每个阶段,都有一些数据需要保存,人员之间也需要进行交互。测试过程管理工具就是一种用于满足上述需求的软件工具,它管理整个测试过程,保存在测试不同阶段产生的文档、数据,协调技术人员之间的工作。
测试过程管理工具一般都会包括以下这些功能:管理软件需求、管理测试计划、管理测试用例、缺陷跟踪、测试过程中各类数据的统计和汇总。
市面上商用的测试管理工具有很多,基本上都是基于Web的系统,这样更利于跨地区团队之间的协作。
4正确认识测试工具的作用
如果一个现在正在从事软件测试工作,但在测试过程中还没有使用过测试工具的人看到以上的这些内容,可能会非常兴奋,因为他觉的只要在测试过程中引入相关的测试工具,那些一直困扰他们测试团队的问题就都能轻松解决了。
在业内经常会有这种想法,认为通过引入一种新的技术,就能解决面临的所有问题了。这种想法,忽视了除技术以外我们仍然需要做的工作。软件测试工具确实能提高测试的效率和质量,但它并不是能够解决一切问题的灵丹妙药。
软件测试工具能在测试过程中发挥多大的作用,取决于测试过程的管理水平和人员的技术水平。测试过程的管理水平和人员的技术水平都是人的因素,是一个开发组织不断改进,长期积累的结果。如果一个测试组织的测试过程管理很混乱,人员缺乏经验,那么不必忙于引入各种测试工具,这时首先应该做的是改进测试过程,提高测试人员的技术水平,待达到一定程度后,再根据情况逐步的引入测试工具,进一步的改善测试过程,提高测试效率和质
量。
5结束语
软件测试在整个软件开发过程中占据了将近一半的时间和资源。通过在测试过程中合理的引入软件测试工具,能够缩短软件开发时间,提高测试质量,从而更快、更好的为用户提供他们需要的软件产品。