信息技术的飞速发展,使软件产品应用到社会的各个领域,软件产品的质量自然成为人们共同关注的焦点。不论软件的生产者还是软件的使用者,均生存在竞争的环境中,软件开发商为了占有市场,必须把产品质量作为企业的重要目标之一,以免在激烈的竞争中被淘汰出局。
用户为了保证自己业务的顺利完成,当然希望选用优质的软件。事实上,对于软件来讲,还没有象银弹那样的东西。不论采用什么技术和什么方法,软件中仍然会有错。采用新的语言、先进的开发方式、完善的开发过程,可以减少错误的引入,但是不可能完全杜绝软件中的错误,这些引入的错误需要测试来找出,软件中的错误密度也需要测试来进行估计。测试是所有工程学科的基本组成单元,同样也是软件开发的重要部分。自从有程序设计的那天起测试就一直伴随着。统计表明,在典型的软件开发项目中,软件测试工作量往往占软件开发总工作量的40%以上。因此,测试对于软件生产来说是必需的。一直以来,软件的测试主要是以手工测试为主,但是随着现代软件的复杂程度的加深,人们对使用手工方式来完成软件测试感到的越来越力不从心,同时因为在软件测试中存在着大量的重复性工作,而这种工作是比较适合机器而不是人类来完成的。因此,自动化测试成为最佳的解决方案。而所谓自动化测试,实际上是将大量的重复性的测试工作交给计算机去完成,一个优秀的自动化测试方案,不但可以满足科学测试的基本要求,而且可以节约大量的时间、成本、人员和资源,这样不仅会大大减少软件工作人员的工作强度,而且会极大的提高企业效益。由于自动化测试在我国开展的时间还不是很长,所以容易有人对它产生误解。
特别是有些软件企业的领导,有些人认为自动化测试代价太高,很难实施;而有些人却认为自动化测试可以容纳一切,可以很容易的替换手工测试。其实这些看法都是很片面的。本文通过对软件测试活动的实施过程的各个步骤的展开的顺序来对手工测试和自动化测试做一个简单的比较,以达到澄清测试误区目的,为我们在软件测试项目中对测试方法的选择做一点参考。
对于软件测试活动本身而言,也是一个工程化的过程,要经历测试项目立项,测试计划的编制,测试的设计,测试的实施,测试的执行,测试的评估几个阶段。这一过程对手工测试也好,自动化测试也好都是一样。软件测试活动实施过程图如下所示:
测试的实施 |
---|
测试的评估 |
得到测试用例 |
对整个测试项目做出估计,评价 |
测试项目立项 |
确定测试项目负责人并做出一定的测试分析 |
设计测试计划的编制 |
测试的设计 |
形成测试需求报告 |
主要解决如何执行测试问题 |
测试的执行 |
执行测试用例 |
在这一个图表中,我们清楚的知道软件的测试流程的展开也是一个顺序的过程,同时也是一个层进的过程,是按照顺序依次展开的,当然在实施的过程中,每一步内部可能会发生多次迭代的情况,这是是允许的。在下面我们就按照这个模型所展示的流程来对手工测试和自动化测试进行简单的比较。
(1)测试项目立项
对任何一个软件开发项目而言,测试本身也是一个工程化的过程,它同样需要经过项目的立项这一个步骤,这一个步骤所要解决的问题主要是解决测试组织的框架的问题,主要是根据测试任务的规模大小来做出相应的先期准备工作;主要是确定项目负责人。测试项目立项对手工测试而言,比较自由,主要是测试项目负责人的问题,以后的测试工作就是由测试项目负责人和整个项目的项目经理来进行沟通完成。对自动测试而言,项目立项中不但要解决前面所提及的问题,还有一个重要的问题的是自动测试工具的选择的问题。对于自动化测试工具的选择往往要取决于所测试项目的性质。若是测试项目的内容主要是在于测试软件产品的UI的话,那么就应该选用GUI测试工具如IBM公司的Rational Robot;若是偏重于测试系统性能的话,可以选用LoadRunner;若是想实现单元测试的自动化则可以选用Junit等等。但是无论选择什么样的工具,请一定要给使用人员以专业的培训,这样可以收到事半功倍的效果。在此,我以IBM公司的Rational Test Suite为例来加以说明。
(2)测试计划的编制
测试计划是根据用户需求报告中关于功能要求和性能指标的规格说明书,通过定义相应的测试需求报告,同时,还要适当选择测试内容,合理安排测试人员、测试时间及测试资源等。测试计划活动包含对下面问题的回答:
●什么和在哪里?―告诉我们要测试什么和在哪里执行这些测试。
● 为什么?―测试输入告诉我们为什么要做这种测试。
● 什么时候?―告诉我们什么时候测试必须执行和必须通过。
● 谁?―由谁来执行这些测试活动。
测试计划编制的第一步是去确定测试输入。测试输入是测试的依靠或是测试需要的验证。测试输入帮助你决定你需要测试的内容。他们是帮助我们确定基于开发过程中可能需要的变化。在你确定了你的测试输入,比较容易的形成一个测试计划。测试计划为项目中其他的测试集合提供一个组织结构。我们需要注意的是在一个测试项目中可能包含多样的测试计划。我们可以为测试的每一个阶段编制一个计划。不同的测试工作组可以有他们自己的测试计划。一般地,每一个计划应当有一个确定且唯一的高水平的测试目标。
在软件测试计划编制这一点上,手工测试的重点在于测试进度的安排,测试人员的分配上,以及测试资源的调配上。通常是要生成出软件测试计划说明书。后面的测试活动都是按照测试计划说明书进行逐步展开的。
而对自动化测试则是在上一步选定的测试自动化工具的基础上进行展开的,利用自动化测试工具自身附带的管理工具,或者与自动化测试工具配合使用的测试管理工具,直接在工具中生成实际的测试计划。例如Rational Test Suite 中的Rational TestManager就是一个很好的测试计划生成工具。自动化测试中的资源调配也可以在其中进行分配。但是这些管理工具的缺点是无法应付短时间突发事件,有些缺乏灵活性。
(3) 测试的设计
测试的设计主要解决“我们将如何执行测试?”。一个完整的测试设计会告知我们有关需要与系统被获得的活动和他们应该期待观察的行为和特性,当然,如果系统正在适当地运行的话。
测试的设计是一个迭代的和行进中的过程。你应当能够在任何系统执行之前开始测试的设计,他们是基于用例(use cases),需求,原型和其他的资源尔产生的。当系统被描述的更加清晰时,测试的设计应当与系统一起更加细节化。我们需要注意一个测试的设计不同于软件的设计工作,它应当被用来作为建立你的测试用例的指导说明书的。
手工测试中的测试的设计多是利用了因果图,等价类划分方法,边界值分析方法 ,错误推测方法 ,因果图方法,判定表驱动等这些方便人工分析的方法来完成测试用例的设计,使用这些方法来完成测试的设计对测试人员的要求比较高,在正式的测试中,这些工作都是测试项目负责人或者有相当经验的高级测试工程师来完成的。这是因为在这一分析的过程中,更多的需要的是工作的经验,人的智慧,人的责任心和耐性。这一过程同样是比较繁琐和关键的,它直接决定了最后我们得到的测试用例的质量。
而在自动化测试中,测试工具多是使用了类似于软件开发过程中的那种迭代的方法来完成测试的设计的,它是一个逐步求精的过程。而且对测试的分析过程中出现的遗漏的条件很容易在下一次迭代过程中加入。相对手工测试而言,这是自动化测试在测试的设计过程中的最大的优点。例如,在Rational Test Suite的TestManager中,我们可以通过下列步骤完成测试的设计:
● 指明基本步骤需要与应用和系统交互,以便执行测试。就是测试项目中测试用例在未来得测试脚本中的安排顺序的考虑。
● 指明如何有效的使特征恰当地工作。就是解决如何安排测试得校验点的问题
● 说明测试的前置条件和后置条件。解释测试的先导条件和后续的现场回复工作。
● 说明测试的可接受标准。说明清楚测试所要达到得精度。尤其是在测试那些与数据处理程序相关得项目中,这一点尤其重要。
所以在自动化测试中,测试的设计比一个手工测试的设计要更抽象,但是它可以容易地发展成一个测试的执行,但是自动化测试方法中测试的设计会受机器配置的制约。如机器系统硬件系统,软件系统的配置,网路系统的配置等等,这些在自动化测试过程中必须考虑进去,但是手工测试则不一样,它比较灵活,我们人工可以很容易的改变机器的配置,而后再次进行测试。
(4)测试的实施
测试的实施其实在这里对手工测试而言是要得到真正可用的测试用例,以形成测试执行人员在进行测试执行时的依据。这一步骤对手工测试尤其简单,因为在手工测试过程中一旦完成了测试设计,那么测试用例的生成就是一件极为容易的事情了。在大多数的手工测试项目中,测试主管往往是将这一步骤和上面的测试的设计是混合在一起来执行的,最终是要形成可是的文档的。
对自动测试而言,测试实施的活动包括了可复用测试脚本的设计和开发,测试脚本用来实施我们的测试用例。在我们使用了迭代的方法完成了测试的设计后,就可以得到了实际上可以使用的测试用例,这时我们可以将测试用例和根据测试用例开发出来的测试脚本进行结合,将它们联系在一起。在这种联系的过程中,脚本和测试用例之间的关系并不一定是一一对应的,大多数的情况下,都是一个测试用例对应了一个或者一个以上的测试脚本。
在每一个测试的项目中,测试的实施都是不相同的。我们需要注意的是,自动化测试中往往要求我们将测试用例和开发出来的测试脚本组合进行顺序,优先级,执行次数上进行安排。如在Rational Test Suite的TestManager中,它提供了一种称为Suite的组合方式,就是将许多的测试用例和脚本进行组合编排,形成一个测试Suite,在Suite中我们可以添加同步点,时间延迟命令,场景等等,使得在一个测试Suite中可以在多台不同测测试机器上同时执行。这种Suite还支持嵌套使用。
相对手工测试而言,自动化测试在这一步骤中要花费比手工测试更多的时间。但是测试脚本的质量的好坏直接影响了整个测试项目的进行。所以这一个步骤对自动化测试项目而言是其关键。
(5)测试的执行
测试执行对手工测试而言,就是一个启动机器和被测试的程序,按照测试用例规定的步骤一步步执行测试的过程。在这个过程中,我们输入的数据的值及类型均已经在测试用例中有了明确的规定,预期的输出在测试用例中也做出了清楚的说明。测试人员只是一个被动的执行测试用例过程。这个过程对测试人员而言是一个比较枯燥且乏味的阶段。只是到了测试输出后,测试人员需要将测试的实际输出和预期输出进行人工的比较来确定软件中是否有BUG存在。
但是对自动化测试而言,我们的测试执行活动包含了要求自测试的实施的执行就应该确保系统功能的正确性。通过自动化测试工具,我们可以做到:
● 一个单独的测试脚本
● 一个或更多的测试用例
● 一个测试的集合(如TestManager中Suite),执行一些测试用例和测试脚本的混合体,这一过程是通过一台或更多的测试用机和虚拟测试者来完成的。
例如在Rational TestManager就提供了如下的几种测试:
GUI测试-图形界面测试
VU测试-虚拟用户测试,多用于性能测试中
VB测试-针对VB的测试
Java测试-针对Java系统的测试
Manual测试-手动和自动的结合测试
CommandLine测试-命令行的测试
需要注意的是,自动测试一旦启动执行后,只要测试脚本是正确的,一般情况下,它的执行是不会轻易被终止的,除非是脚本执行结束或者测试人员人工干预终止。由于这种特性,所以,自动测试大多利用的是测试人员的非工作时间来执行的。这样能大大提高人工效益。但是,相对手工测试而言,自动化测试的执行对脚本的依赖程度极高,一旦测试的对象发生改变或者测试环境发生了改变,就会导致测试脚本出错,使得整个测试无法顺利执行。而手工测试不一样,手工测试最大的特点是灵活性极高。一旦测试的对象或者测试环境发生了改变的话,测试执行人员也能很容易的发现错误,即使是测试用例没有改变。所以在测试执行的灵活程度上,手工测试的程度要好。但是自动化测试的费效比比较高。
(6)测试的评估
测试的评估活动包括:
● 确定实际测试执行的有效性。执行的是否完全?执行失败是否因为不符合前置条件?
● 分析测试输出以确定结果。在执行测试过程中,你查看报告上已产生的数据来检验该执行是否是可接受的。
● 查看合计的结果以检查对测试计划,测试输入,配置等的覆盖程度。这也可以被用来衡量测试的进展和对分析的趋向。
● 评价本次测试的有效性等等。若是有需要还要向上司给出相应的评价报告。
对手工测试而言,这个一任务是通过统计过程来完成的。测试人员完成测试后,需要将相关的测试结果记录下来,同时还要统计执行失败的测试用例,从这些数据中形成本次测试报告,上交给测试项目负责人后,由测试项目负责人来完成整个测试项目情况的汇总,并在汇总的基础上完成对测试项目的分析。手工测试中往往要使用到将统计到的大量数据进行公式化的计算才能得出最终的结论和形成最后的报表。所以相对而言比较麻烦,工作量大。
对自动化测试而言,这一切操作起来相对比较简单,一般情况先可以借助自动化测试工具中带有的报告生成机制完成这个任务。在Rational TestManager中,它里面的TestLog清晰的记录了测试执行,测试过程中发生的问题,测试用例成功和失败的比例,测试过程Log信息,同时在这些信息的基础上,运用提供的工具就可以很容易的生成在这个项目中包含的测试对象的情况汇总。但是,需要我们注意的是,自动化测试工具能对给定的预期的输入(脚本中设定或者取自于测试脚本得数据池)和产生的输出进行比较,但是工具本身并不能告诉测试者软件是通过了测试还是没有通过——它只能说明实际输出结果和与预期结果是否相符。这也是自动化测试和手工测试的一个很重要的区别。所以对于采用自动化测试方式执行失败的用例往往需要还是需要我们使用手工的方式来检查分析,所以从这个程度上来说,手工测试是自动化测试的一个必要的补充。
在上面的几个步骤中,我们按照测试过程展开的顺序依次比较了手工测试方法和自动化测试方法的区别,我们可以看出来,手工测试最大的优点是灵活,最大的缺点是费效比太低。但是自动测试最大的优点是它处理的快捷,但是不灵活。下面的部分我们就结合手工测试和自动化测试各自的特点谈谈他们各自适合的场合。
手工测试特点:
● 测试人员要负责大量文档、报表的制订和整理工作,会变得力不从心。
● 受软件分发日期、开发成本及人员、资源等诸多方面因素的限制,难以进行全面的测试。
● 如果修正缺陷所需时间稍长,那么想将手工测试应用于回归测试将变得异常困难。这是因为需要测试的测试用例太多。
● 对测试过程中发现的大量缺陷缺乏科学、有效的管理手段,责任变得含混不清,没有人能向决策层提供精确的数据以度量当前的工作进度及工作效率。这样往往会导致最后的汇总报表数据不准确。
● 反复测试带来的倦怠情绪及其他人为因素使得测试标准前后不一,测试花费的时间越长,测试的严格性也就越低。
● 难以对不可视对象或对象的不可视属性进行测试。
自动化测试的特点:
● 可以运行更多更频繁的测试用例。
● 可以执行一些手工测试困难或者不可能做的测试。如对不可视对象的测试,利用面向对象的自动化测试脚本就很容易实现。
● 可以更好的利用资源。在夜间执行自动测试用例。
● 测试具有移植性和可重复性。好的测试脚本往往具有较好的平台移植性。
● 可以更快地将软件推向市场。因为自动测试节省了大量的时间。
但是自动化测试要求的先期投入比较大,而且要求人员必须经过严格的培训。
所以手工测试和自动化测试各自适用的场合如下:
● 测试很少执行的项目中。当测试用例执行频度太小时(一年一次),我们可以直接使用手工测试就可以了。
● 软件运行仍然不稳定时,适合使用手工测试。
● 测试结果很容易通过人验证的测试项目适合手工测试。
● 测试项目中涉及物理交互比较多的时候适合手工测试。如需要经常查看打印机,绘图仪的输出时。
● 软件维护时使用的回归测试适合自动化测试。
● 执行压力测试时适合自动化测试。例如测试服务器的最大访问上限等。
● 配置和兼容性测试等项目适合自动化测试。
案例演示:
在一个实时的项目监控的系统中,客户通过手机或固定电话拨号完成数据的输入,当接受到的号码一旦与已知设定不符合的时候,触发报警系统,在打印该输入号码同时还要将它转存到磁带上。
测试分析:在该项目中,我们需要对客户号码;报警器,还有输出设备(打印机和磁带机)这三个方面进行测试。再进一步分析我们知道,对于电话号码而言可能有好多的形式,但是无论如何,它们的值一定是数字组成的,对接收方来说,只有两种情况,收到了合法的数据和收到和非法的数据。所以它适合使用程序来模拟输入数据和根据输入判断预期的输出结果。可以使用自动化的方式来实现。对报警器而言,它只有两种状态报警或不报警。所以同样可以用合法的数据来触发报警和使用非法数据来测试来判断其是不是不报警。所以同样可以实现自动化。再看第三个测试对象,输出设备的测试,如前面所述,对于这种物理设备的测试只能使用手工测试。
从上面的这个简单的例子中,我们可以看到,在任何一个项目中,完全的手工测试和自动化测试都是不可取的,我们可以将那些重复频度大,测试输入容易使用程序来模拟和测试结果可以预期的测试可以使用自动化的方式来实现。对于那些涉及物理交互的测试用例还是使用手工方式为好。总体而言,手工测试和自动化测试是相互补充的。在一个具体的项目中,到底谁占重要的部分,这个要根据实际的项目来确定,而不能人为主观限定。同时需要我们注意的是,在我们目前的实际应用中大多数的自动化测试所使用的测试用例大多是从手工测试提取而来的,所以一定要注意对那些手工测试用例的抽象化,否则会导致自动测试脚本中输入数据会有遗漏。造成测试输入不完全,这样就会导致测试项目的失败。如果对软件测试有兴趣,想了解更多的测试知识,解决测试问题,以及入门指导,帮你解决测试中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己测试方面学的不够精想要继续学习的,想转行怕学不会的,都可以加入我们644956177,群内可领取最新软件测试大厂面试资料和Python自动化、接口、框架搭建学习资料!
总而言之,在现代的软件开发项目的测试中,不存在一个项目完全是使用哪一种方法来独立完成整个项目的测试,这是不可能的。只可能是两种方法同时并重或者一个为主,一个为辅。
点个三连!!!