因果图(Cause-Effect Graphing)提供了一个把规格转化为判定表的系统化方法,从该图中可以产生测试数据。其中,原因表示输入条件,结果是对输入执行一系列计算后得到的输出。 因果图方法最终生成的是判定表。它适合于检查软件输入条件的各种组合情况。如果在测试时必须考虑输入条件的各种组合,可使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这时就需要利用因果图。
首先来看下因果中用到的符号和约束含义:
在因果图中,我们用“0” 来 表示“不出现”,用“1”来表示“出现”,用C1、C2、C3表示原因,E1表示结果。那么:
“恒等”:C1为1,则E1为1;否则C1为0,E1也为0。
“非”: C1为1,则E1为0;否则C1为0,则E1为1。
“或”: C1、C2、C3一个以上为1,则E1为1;C1、C2、C3都为0,则E1为0。
“与”: C1、C2、C3都为1,则E1为1;C1、C2、C3一个以上为0,则E1为0。
E 约束(异)— 排斥,即a、b不能同时为1。
I 约束(或)— 包容,a、b 不能同时为0。
O 约束(惟一)— 选一,a、b中仅有一个为1。
R 约束(要求)— 需要,a为1时,b必须为1。
M 约束(强制)— 屏蔽,若a为1时,则b强制为0。
在前面我们知道因果图的使用范围,符号及约束说明后,下面介绍一下因果图判定表生成测试用例的基本步骤:
(1)分析软件规格说明描述中,哪些是原因 (即输入条件或输入条件的等价类),哪些是结果 (即输出条件),并给每个原因和结果赋予一个标识符。
(2)分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系? 根据这些关系,画出因果图。
(3)由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。
(4)把因果图转换成判定表。
(5)把判定表的每一列拿出来作为依据,设计测试用例。
下面根据上面的步骤,还是用网上自动售货机购买啤酒和橙汁举例说明测试步骤。具体的需求是:有一个处理单价为5角钱的饮料自动售货机软件,若投入5角钱或1元钱的硬币,押下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并押下按钮后,饮料不送出来而且1元硬币也退出来;若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。”
首先分析这一段说明,列出原因和结果:
分析原因(条件):
1.售货机有零钱找
2.投入1元硬币
3. 投入5角硬币
4. 押下橙汁按钮
5. 押下啤酒按钮
建立中间结点,表示处理中间状态
11. 投入1元硬币且押下饮料按钮
12. 押下〖橙汁〗或〖啤酒〗的按钮
13. 应当找5角零钱并且售货机有零钱找
14. 钱已付清
分析结果:
21. 售货机〖零钱找完〗灯亮
22. 退还1元硬币
23. 退还5角硬币
24. 送出橙汁饮料
25. 送出啤酒饮料
(2) 画出因果图。所有原因结点列在左边,所有结果结点列在右边。
(3) 由于 2 与 3 ,4 与 5 不能同时发生,分别加上约束条件E。
(4) 生成完整的因果图。
(5) 转换成判定表,并设计测试用例。
上面实例的因果图为:
转为为判定表(判定表是一个表格,分为四个部分,其左部是条件或数组元素的名称,右上部是所有条件的组合,左下部是处理中活动的名称,右下部标明条件组合和相应的活动的对应关系)为:
判定表说明:
- 网上提供的判定表有误,如果你看过,仔细点肯定能发现。上表为我修改后的正确判定表。
- 上面有5个条件,则共有2的5次方种组合。
- 注意利用二分法把所有可能组合的情况列出来,请仔细观察上面1和0的组合规律。
- 判定表中灰色表示的是不可能出现的情况。
以上判定表已经出来了,那相信你可以根据它很好的编写测试用例了。
4、场景分析法
当软件中用户操作步骤较多,而用户的不同操作导致程序的不同处理结果,因果图/判定表法就不能有效进行用例设计。这时可以用到场景法,即基于用户对事件的触发,对事件流进行分析。场景法包括了基本流,描述用户操作的成功场景;备选流,描述用户操作的其它可能结果,常常是非期望结果。所以我们的用例场景应该是描述开始到结束的所有基本流和备选流。
5、错误猜想法
人们也可以靠经验和直觉推测程序中可能存在的各种错误,从而针对性地编写检查这些错误的例子,这就是错误猜想法。 错误猜想法的基本想法是,列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。错误猜想法只能作为测试设计的补充而不能单独用来设计测试用例,否则可能会造成测试的不充分。
要做好错误猜想法,必须要有较深的测试经验积累,较强的第六感,对问题的敏锐性、以及直觉性,就如侦探判案,根据经验做大胆的假设,最后去求证线索。
四、测试用例设计方法的选择
测试用例设计方法繁多,除了上面提到的常用用例设计方法外,还有状态分解法、流程分析法、正交实验法、输入域测试法、输出域覆盖法等。而每个公司因为所测项目业务不同,情况不同,需要选择不同的用例设计方法集。
在这里我要强调一点,测试用例应该带入自己的思想,这样能使你在做测试时有一个清晰的思路,也能让别人更清楚你用例设计的思路。这样在进行用例评审时也不用一一做检查,只要大家了解你的测试用例设计思路,那评审时的主要工作就只检查你是否有遗漏测试点。