一、概念
1.决策表的组成
决策表:用于表述和分析复杂逻辑关系,适用于描述在不同条件下多种可执行动作的组合问题。 决策表由四个部分组成。
条件桩:列出了问题得所有条件。
动作桩:列出了问题规定可能采取的操作。
条件项:针对所有条件的取值列出不同条件取值的组合。
动作项:列出在条件项的各种取值情况下应该采取的动作。
规则:任何一个条件组合的特定取值及其相应要执行的操作,在决策表中对应为纵向贯穿条件项和动作项的一列。
例子如下:下表是一张“读书指南”决策表。其中:Y为真值,N为假值。
2.决策表的分类
根据条件取值的个数,决策表可以分为有限项决策表和扩展项决策表。
有限项决策表:每个条件只有两个取值:真或假。
扩展项决策表:条件项的取值可以有很多个。
二、决策表的构建
1.列出所有的条件桩和动作桩,确定规则的条数
例如:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
问题 | 你觉得疲倦吗? | ||||||||
你对书中内容感兴趣吗? | |||||||||
书中内容使你胡涂吗? | |||||||||
建议 | 请回到本章开头重读 | ||||||||
继续读下去 | |||||||||
跳到下一章去读 | |||||||||
停止阅读,请休息 |
2、填入条件的不同取值组合;
3、填入具体动作,得到初始判定表;
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
问题 | 你觉得疲倦吗? | Y | Y | Y | Y | N | N | N | N |
你对书中内容感兴趣吗? | Y | Y | N | N | Y | Y | N | N | |
书中内容使你胡涂吗? | Y | N | Y | N | Y | N | Y | N | |
建议 | 请回到本章开头重读 | √ | √ | ||||||
继续读下去 | √ | √ | |||||||
跳到下一章去读 | √ | √ | |||||||
停止阅读,请休息 | √ | √ |
4、化简,合并一些具有相同动作的相似规则。
化简就是将规则合并。如果有两条或多条规则具有相同的动作,并且它们的条件项很相似,则可以考虑能否把这些规则合并为1条规则,从而使得判定表得到简化。
例下图,可以把这两条规则合并成 1条规则,无关的条件其取值可用 横线填充。
三、决策表的好处
决策表对我们的软件测试有什么用呢?
判定表中每一条规则就是程序的一种处理逻辑,为每一条规则设计一个测试用例来对程序进行测试,相当于测试了程序的各种处理逻辑。
条件对应程序的输入或输入的等价类
动作对应程序的输出或程序的主要功能处理部分
规则对应测试用例
四、例题
假设某程序规格要求如下:“……对功率大于50马力并且维修记录不全,或者已运行10年以上的机器,应给予优先的维修处理……”,假定,“维修记录不全”和“优先维修处理”均已在别处有更严格的定义。
1、确定规则的条数、列出所有的条件桩和动作桩:
填入条件项和动作顶,得到初始决策表:
合并相似规则: 规则1、2可以合并;5、7可以合并;6、8可以合并。
根据最终决策表的5条规则,设计5个测试用例。
五、决策表小结
判定表能将复杂的问题按照各种可能的情况进行分解并全部列举出来,然后给出应当执行的操作,做到既简洁明了又避免遗漏。
适用于以下特征的程序:
1、if-then-else逻辑
2、输入变量之间存在逻辑关系
3、输入与输出之间存在因果关系
4、很高的圈复杂度
六、因果图法做决策表
因果图是一种将多个原因和不同结果之间的对应关系用图来表达的工具。
因果图的优点是可以用图解的形式,直观地表达输入条件的组合、约束关系和输出结果之间的因果关系,因果图一般和决策表结合起来使用。
在较为复杂的问题中,由程序规格说明不太容易直接得出决策表。 在输入条件比较多的情况下,直接使用决策表可能会产生过多的条件组合,从而导致决策表的列数太多。 条件之间可能会存在约束条件,所以很多条件的组合是无效的,也就是说,它们在决策表中完全是多余的。 可先画出因果图,根据因果图导出决策表,并利用因果图排除掉一些无效的条件组合,从而会使决策表的列数大幅度减少。
步骤:从用自然语言描述的程序规格说明描述中找出因和果,用因果图来表达它们的逻辑关系,因是输入条件,果是输出或程序状态的改变,也就是表达当输入是什么的情况下,结果会是什么? 然后根据因果图写出决策表,再由决策表来设计测试用例的方法。
在因果图中,通常: 用 Ci 表示原因,置于图的左部; 用 Ei 表示结果,置于图的右部。Ci和Ei均可取值0或1,0 表示某状态不出现,1表示某状态出现。原因和结果之间以直线连接。
关系有:恒等、与、或、非
约束: 各个输入条件相互之间还可能存在某种关系,称为约束。例如:某些输入条件不可能同时出现。 输出状态之间也往往存在约束。
七、因果图法测试用例设计实例
例1:一个文件管理系统的一段规格说明:“文件第一列字符必须A或B,第二列字符必须是数字,在此情况下文件被更新。如果第一列字符不正确,则提示错误信息“ERR1”;如果第二列字符不正确,则提示错误信息“ERR2”。
原因:1——第一个字符是A 2——第一个字符是B 3——第二个字符是数字
结果: 70——文件进行更新 71——提示信息ERR1 72——提示信息ERR2
添加约束后:
例2:有一个处理单价为5角钱的饮料自动售货机软件。其规格说明如下: 若投入5角钱,按下〖橙汁〗或〖啤酒〗的按钮,则相应的饮料就送出来。 若投入1元钱的硬币,按下〖橙汁〗或〖啤酒〗的按钮: 若售货机没有零钱找,则一个显示〖零钱找完〗的红灯亮,这时在投入1元硬币并按下按钮后,饮料不送出来而且1元硬币也退出来; 若有零钱找,则显示〖零钱找完〗的红灯灭,在送出饮料的同时退还5角硬币。
(1)分析这一自动售货机软件的规格说明,列出原因和结果。
原因: 1.售货机有零钱找 2.投入1元硬币 3.投入5角硬币 4.按下橙汁按钮 5.按下啤酒按钮
结果: 1.售货机〖零钱找完〗灯亮 2.退还1元硬币 3.退还5角硬币 4.送出橙汁饮料 5.送出啤酒饮料
(2)画出因果图。 当因果图规模较大时,可以引入一些中间节点,表示处理的中间状态。
本题的中间结点如下: 1. 投入1元硬币且按下饮料按钮 2. 已按下按钮(〖橙汁〗或〖啤酒〗) 3. 应当找5角零钱并且售货机有零钱找 4. 钱已付清
(3)在因果图中加上约束条件
(4) 把因果图转换成判定表
(5)根据判定表设计测试用例
在判定表中,阴影部分表示因违反约束条件的不可能出现的情况,应删去。第16列与第32列因什么动作也没做,也应删去。最后可根据剩下的16列,来设计测试用例。