众所周知,试图对软件进行完全的测试并发现全部的问题是一件不可能的任务,对于测试而言,最有效的思想就是努力使测试尽可能完全。
在这个过程中,测试用例的设计至关重要。因为软件测试最关键的问题是:如何从所有可能的测试用例全集中寻找可能发现错误最多的子集。
1、白盒测试
白盒测试的重点在于测试用例的执行程度,或测试用例覆盖程序源码逻辑结构的程度。完整的白盒测试将走过程序运行路径的每一种可能,然而这是不可能的。因此需要设定一些准则来约束并不完善的测试用例子集,以求尽可能多的发现程序中的潜在错误。
(1)语句覆盖
语句覆盖要求将程序的每一行代码都执行过一次。这个准则通常并不完善,依照此准则设计的测试用例常常会遗漏许多的错误。
(2)判定覆盖
判定覆盖又称为分支覆盖,该准则比语句覆盖稍强。判定覆盖要求设计足够的测试用例,使得代码中的每一个判断都至少得到一个为真和一个为假的输出结果。需要注意的分支或判定语句包括switch、do-while和if-else等。判定覆盖包含语句覆盖,要求每个判断都有是非两种判定结果,并且每条语句都被执行一遍。然而,仅仅是判定覆盖依然是不完善的,存在很多遗漏错误的可能。
(3)条件覆盖
条件覆盖是比判定覆盖稍强的准则。条件覆盖于判定覆盖不同的一点在于,条件覆盖重点考察判断中每个条件的所有可能结果。如存在判断if(A & B),则条件覆盖要求测试用例实现A为真+B为假,和A为假+B为真的情况,而不关心选择的结果。显而易见,条件覆盖也并不完善。
(4)判定/条件覆盖
该准则要求将所有条件的所有可能至少执行一次,将每个判断的所有可能结果至少执行一次,将每个入口点都至少调用一次。然而该准则也不是尽善尽美,因为有些特定的条件会屏蔽其他条件,所以并非所有可能性都被执行到。
(5)多重条件覆盖
多重条件覆盖要求设计足够多的测试用例,将每个判定中给所有可能的条件结果的组合,以及所有的入口点都至少执行一次。
2、黑盒测试
黑盒测试又称功能测试,作用在于检测软件是否可以正常实现其设定的功能。
(1)等价划分
等价划分法的两种思想:①每个测试用例尽可能体现更多不同的输入情况,以最大限度减小全部测试用例规模;②尽量将程序输入范围进行划分为数量有限的等价类。
等价划分法设计测试用例的步骤:
确定等价类:每选取一个输入条件,将其划分为两个或更多个组,其中至少包括一个有效等价类和一个无效等价类。
生成测试用例:①首先编写新的测试用例,尽可能多的覆盖尚未被涵盖的有效等价类,直到所有有效等价类都被覆盖。②编写新的测试用例,仅仅覆盖一个尚未被包括的无效等价类。
(2)边界值分析
如果开发经验较为丰富,那么可以理解很多程序的错误都发生在边界条件上。因此选择处于有效等价类边缘的测试用例常常比选择典型的用例更加有效。
边界值分析法的原则:
- 如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
- 如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据。
- 根据规格说明的每个输出条件,使用前面的原则1)。
- 根据规格说明的每个输出条件,应用前面的原则2)。
- 如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例。
- 如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
- 分析规格说明,找出其它可能的边界条件。
(3)因果图
当输入条件之间产生相互关系和组合的时候,情况可能会变得比较复杂,此时可考虑因果图法。因果图方法最终生成的就是判定表,适合于检查程序输入条件的各种组合情况。
生成测试用例:
- 分析软件规格说明描述中,哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。
- 分析软件规格说明描述中的语义。找出原因与结果之间,原因与原因之间对应的关系. 根据这些关系,画出因果图。
- 由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现. 为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。
- 把因果图转换为判定表。
- 把判定表的每一列拿出来作为依据,设计测试用例。
从因果图生成的测试用例(局部,组合关系下的)包括了所有输入数据的取TRUE与取FALSE的情况,构成的测试用例数目达到最少,且测试用例数目随输入数据数目的增加而线性地增加。