3.4.2 软件测试的基本方法
根据程序的功能说明书或程序逻辑结构,设计一组测试实例(test cases),在精心控制的环境下,按测试实例作为输入执行程序,然后对程序的行为进行检验,预定其是否和预期结果一致,如不一致,即可发现程序错误。
目前,软件测试的方法有三种:动态测试、静态测试和正确性证明。
动态测试是指通常的上机测试,这种方法是使程序有控制地运行,并从多种角度观察程序运行时的行为,以发现其中的错误。测试是否能够发现错误取决于测试实例的设计。
设计测试实例的方法一般有两类:黑盒测试方法和白盒测试方法。
在使用黑盒法设计测试实例时,测试人员将程序看成一个“黑盒”,也就是说,他不关心程序内部是如何实现的,而只是检查程序是否符合它的“功能说明”,所以使用黑盒法设计的测试完全是根据程序的功能说明来设计的。
如用白盒法,则需要了解程序内部的结构,此时的测试是根据程序的内部逻辑来设计的,如果想用白盒法发现程序中所有的错误,则必须使程序中每种可能的路径都执行一次。实际上这是不可能的,即使测遍所有的路径,仍不一定能保证程序符合相应的功能要求。关于黑盒测试和白盒测试下面还将详细介绍。
静态测试一般是指人工评审软件文档或程序,借以发现其中的错误,由于被评审的文档或程序不必运行,所以称为是静态的。人工评审的手段虽然比较简单,而事实证明这是一个相当有效的检验手段。但由于评审人的能力所限,静态测试显然不可能发现所有的错误。
动态测试和静态测试只能发现错误而不能证明程序中不存在错误,只有借助于程序正确性证明才有可能证明程序的正确性。程序证明最常用的方法是归纳断言法,它对程序提出一组命题,如能用数学方法证明这些命题成立,就可保证程序中不存在错误,即它对所有的输入都会产生预期的正确输出。但目前正确性证明尚处于理论研究阶段,其技术尚不成熟,并未达到实用化阶段。因此前两种测试手段仍然是有效的手段。
1.静态测试与动态测试
(1)静态测试
静态测试包括代码检查、静态结构分析、代码质量度量等。静态测试可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。经验表明,使用人工测试能够有效地发现30%到70%的逻辑设计和编码错误。
代码检查主要检查代码和设计的一致性,包括代码的逻辑表达的正确性,代码结构的合理性等方面。这项工作可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。代码检查包括代码审查、代码走查、桌面检查、静态分析等具体方式。
代码审查:小组成员集体阅读、讨论检查代码。
代码走查:小组成员通过用“脑”研究、执行程序来检查代码。
桌面检查:由程序员自己检查自己编写的程序。程序员在程序通过编译之后,进行单元测试之前,对源代码进行分析、检验,并补充相关文档,目的是发现程序的错误。
静态分析:对代码的机械性、程式化的特性分析方法,包括控制流分析、数据流分析、接口分析、表达式分析。
(2)动态测试
静态测试不实际运行软件,主要通过人工进行。动态测试是基于计算机的测试,是为了发现错误而执行程序的过程。或者说,是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误的过程。
设计高效、合理的测试用例是动态测试的关键。测试用例(Test Case)是为测试设计的数据。测试用例由测试输入数据和与之对应的预期输出结果两部分组成。测试用例的格式为:
[(输入值集),(输出值集)]
下面重点讨论动态的白盒测试方法和黑盒测试方法。
2.白盒测试方法
白盒测试方法也称结构测试或逻辑驱动测试。它是根据软件产品的内部工作过程,检查内部成分,以确认每种内部操作符合设计规格要求。白盒测试把测试对象看成一个打开的盒子,允许测试人员利用程序内部的逻辑结构及有关信息来设计或选择测试用例,对程序所有的逻辑路径进行测试。通过在不同点检查程序的状态来了解实际的运行状态是否与预期的一致。所以,白盒测试是在程序内部进行,主要用于完成软件内部操作的验证。
白盒测试的基本原则是:保证所测模块中每一独立路径至少执行一次;保证所测模块所有判断的每一分支至少执行一次;保证所测模块每一循环都在边界条件和一般条件下至少各执行一次;验证所有内部数据结构的有效性。
按照白盒测试的基本原则,“白盒法”是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字,但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序是否违反了设计规范,即程序本身是个错误的程序;第二,穷举路径测试不可能查出程序中因遗漏路径而出错;第三,穷举路径测试可能发现不了一些与数据相关的错误。
白盒测试的主要方法有逻辑覆盖、基本路径测试等。
(1)逻辑覆盖测试
逻辑覆盖是泛指一系列以程序内部的逻辑结构为基础的测试用例设计技术。通常所指的程序中的逻辑表示有判断、分支、条件等几种表示方式。
①语句覆盖。选择足够的测试用例,使得程序中每个语句至少都能被执行一次。
语句覆盖是逻辑覆盖中基本的覆盖,尤其对单元测试来说。但是语句覆盖往往没有关注判断中的条件有可能隐含的错误。
②路径覆盖。执行足够的测试用例,使程序中所有可能的路径都至少经历一次。
③判定覆盖。使设计的测试用例保证程序中每个判断的每个取值分支(T或F)至少经历一次。
④条件覆盖。设计的测试用例保证程序中每个判断的每个条件的可能取值至少执行一次。条件覆盖深入到判断中的每个条件,但是可能会忽略全面的判断覆盖的要求。有必要考虑判断—条件覆盖。
⑤判断—条件覆盖。设计足够的测试用例,使判断中每个条件的所有可能取值至少执行一次,同时每个判断的所有可能取值分支至少执行一次。
判断—条件覆盖也有缺陷,对质量要求高的软件单元,可根据情况提出多重条件组合覆盖以及其他更高的覆盖要求。
(2)基本路径测试
基本路径测试的思想和步骤是:根据软件过程性描述中的控制流程确定程序的环路复杂性度量,用此度量定义基本路径集合,并由此导出一组测试用例对每一条独立执行路径进行测试。
3.黑盒测试方法
黑盒测试,即功能测试户或数据驱动测试,测试时完全不考虑程序内部的逻辑结构和内部特征,仅检验程序结果与说明书一致性,即测试实例设计完全以说明书为准,程序结果与说明书的一致性。
黑盒测试不关心程序内部的逻辑,而只是根据程序的功能说明来设计测试用例。在使用黑盒法时,手头只需要有程序功能说明就可以了。黑盒分为以下几种:等价分类法、边缘值分析法、因果图法、错误推测法。
(1)等价分类法
由于输入所有可能的数据来测试某个程序是不可行的,实施时只能输入其中一个子集。怎样选择一个适当的子集,能使其尽可能多地发现错误。人们希望所选择的测试用例应尽可能地有代表性。
等价分类法就是将输入数据的可能值分成若干个等价类,每一类有一个代表性的值,在测试中的作用就等价于这一类数据中的其他值。即如果某一类的一个例子发现了错误,这一等价类中的其他例子也能发现同样的错误。反之,如果某一类中的一个例子没有错误,则认为这一类的其余例子也不会发现这样的错误。
划分等价类在很大程度上是试探性的,等价类通常划分为合理等价类和不合理等价类。以下是几条供参考的原则:
①如果某个输入条件说明了输入值的范围是1~100,则可划分为一个合理等价类(1~0)和两个不合理等价类(小于l和大于100)。
②如果某个输入条件说明了输入数据的个数是1到3,则可划分一个合理等价类(1~3)和两个不合理等价类(小于l和大于3)。
③如果一个输入条件说明了一个确定的要求,则可划分成一个合理等价类(满足要求的值)和一个不合理等价类(不满足要求的值)。
④如果某个输入条件说明了输入数据的一组可能的值,而且程序是用相同的方式来处理不同的值,则可将这组不同的值划分为相同的合理等价类,将这些值以外的值划分成不合理的等价类。
⑤如果认为程序将按不同的方式来处理某个等价类中的例子,则应将这个等价类再分成几个更小的等价类。
在设计测试用例时,分三步进行:
①为每个等价类编号。
②设计一个新的测试用例,使它能包括尽可能多的尚未被包括的合理等价类;重复做这一步,直至这些测试用例已包括所有的合理等价类。
③设计一个新的测试用例,使它包括一个尚未被包括的不合理等价类。重复这一步,直到测试用例已包括所有的不合理等价类。
(2)边缘值分析法
实践表明,程序往往在处理边缘情况时出错,因而检查边缘情况的测试实例查错率较高,边缘情况是指输入等价类或输出等价类的边界值。
在选择边缘值时,要注意:
①在选择测试实例时,不是从每个等价类中选一个值,而是选一个或几个例子,使得该类的边界情况成为测试的主要目标。
②边缘值分析不仅注意输入条件,它还要根据输出的情况,按输出等价类设计测试用例。使用边缘值分析法首先应仔细阅读程序的功能说明,以便找出输入条件。
(3)因果图法
等价分类法和边缘值分析法的弱点在于没有检查各种输入条件的组合。因果图法是着重检查条件的各种组合情况,其基本方法是,从用自然语言书写的功能说明中找出因—输入条件—输出结果。通过画因果图将功能说明转换成一张判定表,然后为每种输出条件的组合设计测试用例。
(4)错误推测法
测试人员也可以通过经验或直觉推测程序中可能存在的各种错误,从而有针对性地编写检查这些错误的例子。
错误推测法在很大程度上靠直觉和经验进行。它的基本想法足以列出程序中可能有的错误和容易发生错误的特殊情况,并且根据它们选择测试方案。经验说明,在一段程序中已经发现的错误数目往往与尚未发现的错误数成正比。
(5)测试策略
以上的各种基本测试方法都各有所长,在实际测试中应综合使用。总体来说,通常应用黑盒测试设计基本的测试方案,然后再用白盒测试做一些必要的补充。
在黑盒测试中,应首先使用边界值分析方法,经验表明,用这种方法设计出的测试实例暴露错误的能力最强,应该既包括输入数据的边界情况又包括输出数据边界情况,必要时使用等价划分法和错误推测法补充测试。然后对照程序的逻辑,根据程序可靠性要求采用不同的逻辑覆盖标准。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。