上一篇我们谈到了边界值分析法。就边界值法而言,其实并不难,但是如何应用到实际测试活动当中,就会发现遇到一些问题后就束手无策了。
我们来看两个例子:
(1)一张3.5寸的软盘
一张软盘,标称容量是1.44MB;而实际存储容量为1.38MB。也就是说这个软盘的容量范围为
[0MB,1.38MB],要想用边界值法的话,测试数据的准备是很重要的。如何选取到比较合适的测试数据呢?我们知道一个空的TXT文本是0KB,但是只要在文本里敲几个字符,文本容量就变成1KB了,那么测试该软盘容量用边界值法进行设计的测试用例有:
1、0MB ---------不存任何数据
2、1KB ----------存一个TXT文本
3、1.37MB -----------用压缩软件WINRAR制作一个压缩包
4、1.38MB -----------用压缩软件WINRAR制作一个压缩包
5、1.3809765625MB----------在1.38MB之上加一个TXT文件,但是这种方法很笨;其实还是沿用以上用压缩软件的方法,压缩成1.4MB没问题吧?
(2)一块40GB的硬盘
对硬盘的容量测试也是用以上的思路,你想出来了吗?
这是一个移动式数码电影放映系统的例子。在硬盘里有一部DVD影片,容量为3GB,怎么去进行测试呢?跟上个软盘测试基本一样。
我们看一下这个硬盘的边界值:
(1)0GB
(2)40GB
用边界值法设计测试用例的话,就有如下:
(1)0GB
(2)3GB
(3)39GB 把3GB的影片复制粘贴12次
(4) 40GB 在39GB之上,再加上压缩成1GB的数据
(5)42GB 把3GB的影片复制粘贴13次
以上是用边界值法来进行测试用例的设计,只要合理的进行边界值的选取,用例的设计并不难。
还是以QQ登录界面为例,我们一开始只是关注到QQ帐号或QQ密码这两个输入框,是分别进行分析和测试用例设计的,但当我们突然发现,要是把两个输入框一起进行测试的话,那么该怎么测试呢?好象两个输入框之间要同时进行测试的话,要考虑的问题就不是只关注一个输入框那么简单了。
我们设想一下,要考虑全面的话,那么QQ登录界面上有两个输入框,把每个输入框的等价类拿过来:
(一)QQ帐号
有效的:(1)长度在6-10位之间
(2)类型是0-9自然数
无效的:(1)长度小于6
(2)长度大于10
(3)负数
(4)小数
(5)英文字母
(6)字符
(7)特殊字符
(8)中文
(9)编程语言中的转义字符
(10)空
(11)空格
(二)QQ密码
有效的:(1)6-16位
(2)空格
(3)负数
(4)小数
(5)英文字母
(6)字符
(7)特殊字符
(8) 编程语言中的转义字符
无效的:(1)<6位
(2)>16位
(3)空
(4)保留字
(5)功能键(ESC、ENTER、TAB、SHIFT、CTRL、Caps Lock、Backspace、Alt)
(6)汉字
如果把两个输入框的等价类进行组合的话,需要多少个测试用例呢? 13*14=182个,是不是很多啊?要知道,用最少的测试用例去进行最大的测试覆盖,这种组合就很多了,效率也低。
我们看看因果图的原理吧:
(一) 因果图法的来源
大家熟悉的等价类划分法和边界值分析法,都是着重考虑输入条件,但未考虑输入条件之间的联系、相互组合等;
但是,如考虑所输入条件之间的相互组合,会由于组合情况数目相当大,需要大量的测试用例; 因果图法,是一种帮助人们系统地选择一组高效率测试用例的方法。
(二) 因果图法的特点
考虑输入条件间的组合关系;
考虑输出条件对输入条件的信赖关系,即因果关系;
测试用例发现错误的效率高;
能检查出功能说明中的某些不一致或遗漏;
因果图方法最终生产的就是判定表,它适合于检查程序输入条件和各种组合情况。
(三) 因果图法基本步骤
1. 分割功能说明书对于规模比较大的程序来说,由于输入条件的组合数太大,所以很难整体上使用一个因果图。我们可以把它划分为若干部分,然后分别对每个部分使用因果图。例如,测试编译程序时,可以把每个语句作为一个部分。
2. 识别出“原因”和“结果”,并加以编号所谓原因,是指输入条件或输入条件的等价类;而结果则是指输出条件或输出条件的等价类。每个原因或结果都对应于因果图中的一个节点。当原因或结果成立(或出现)时,相应的节点取值为1,否则为0。
3. 根据功能说明书中规定的原因和结果之间的关系画出因果图因果图的基本符号如图1所示:
因果图的基本符号
图中左边的节点表示原因,右边的节点表示结果。恒等、非、或、与的含义:
恒等:若a=1,则b=1;若a=0,则b=0;
非:若a=1,则b=0,若a=0,则b=1;
或:若a=1或b=1或c=1,则d=1;若a= b= c=0,则d=0;
与:若a= b= c=1,则d=1;若a=0或b=0或c=0,则d=0。
画因果图时,原因在左,结果在右,由上而下排列,并根据功能说明书中规定的原因和结果之间的关系,用上述基本符号连接起来。在因果图中还可以引入一些中间节点。
4. 根据功能说明在因果图中加上约束条件由于语法或环境限制,有些原因与原因之间、原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号表明约束或限制条件。因果图的约束条件如图所示:
其中互斥、包含、唯一、要求时对原因的约束,屏蔽是对结果的约束。他们的含义如下:
互斥E:表示不同时为1,即a,b,c中至多只有一个1;
包含I:表示至少有一个1,即a,b,c中不同时为0;
唯一O:表示a,b,c中有且仅有一个1;
要求R:表示若a=1,则b必须为1。即不可能a=1且b=0;
屏蔽M:表示若a=1,则b必须为0
5. 根据因果图画出判定表画判定表的方法一般比较简单,可以把所有原因作为输入条件,每一项原因(输入条件)安排为一行,而所有的输入条件的组合一一列出(真值为1,假值为0),对于每一种条件组合安排为一列,并把各个条件的取值情况分别添入判定表中对应的每一个单元格中。 例如,如果因果图中的原因有4项,那么,判定表中的输入条件则共有4行,而列数则为24=16。确定好输入条件的取值之后,我们便可以很容易地根据判定表推算出各种结果的组合,也即输出,其中也包括中间节点的状态取值。上述方法考虑了所有条件的所有组合情况,在输入条件比较多的情况下,可能会产生过多的条件组合,从而导致判定表的行数太多,过于复杂。然而在实际情况中,由于这些条件之间可能会存在约束条件,所以很多条件的组合是无效的,也就是说,它们在判定表中也完全是多余的。因此根据因果图画出判定表时,我们可以有意识地排除掉这些无效的条件组合,从而使判定表的列数大幅度减少。例如,根据图所示的因果图,可以画出如表所示的判定表。
6. 为判定表的每一列设计一个测试用例即为从因果图中导出的判定表中的每一列设计一个测试用例。