-
1 电子教材
-
2 PPT
-
3 实训任务
10.4 使用因果图法和决策表设计测试用例实例
10.4.1 某航空系统食物供应与播放电影规定测试用例
假设中国某航空公司规定:中国去欧美的航线所有座位都有食物供应,每个座位都可以播放电影;中国去非欧美的国外航线都有食物供应,只有商务舱可以播放电影;中国国内的航班的商务舱有食物供应,但是不可以播放电影。
中国国内的航班的经济舱飞行时间大于2小时有食物供应,但是不可以播放电影,
这样,条件有:
(1)航线-一 国外欧美的,国外非欧美,国内;
(2)舱位——商务,经济;
(3)飞行时间 —— 小于 2 还是大于等于 2 。
行为有:
(1)播放电影;
(2)供应食物。
形成的判定表如表10-1所示。
表10-1 中国某航空公司决策表设计

这样可以写出 6 个测试用例来覆盖这些场景。注意,这些测试用例完全是根据需求定义而来的。对于测试用例 1 来说,需求说明认为商务舱还是经济舱是不能影响后面的行为的,但是对于测试人员来说,其实还是要验证的。所以可能需要加测试用例。
10.4.2 固定资产维修规则测试用例
需求要求:“… 对功率大于 50 马力的机器、维修记录不全或已运行 10 年以上的机器,应给予优先的维修处理 … … ”这里假定,“维修记录不全”和“优先维修处理”均已在别处有更严格的定义。
需求分析如下:
(1)确定规则的个数:这里有3个条件,每个条件有两个取值,故应有2X2X2=8种规则。
(2)列出所有的条件项和动作桩,如表10-2所示。
表10-2 条件项和动作桩
条件 | 功率大于50马力吗? | 动作 | 进行优先处理 |
维修记录不全吗? | 作其他处理 | ||
运行超过10年吗? |
(3)填入条件项。可从最后1行条件项开始,逐行向上填满。如第三行是Y N Y N Y N Y N,第二行是 Y Y N N Y Y N N,等等。
(4)填入动作桩和动作项。这样便得到形如表10-3的初始判定表。
表10-3 初始判定表
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
条件 | 功率大于50马力吗? | Y | Y | Y | Y | N | N | N | N |
维修记录不全吗? | Y | Y | N | N | Y | Y | N | N | |
运行超过10年吗? | Y | N | Y | N | Y | N | Y | N | |
动作 | 进行优先处理 | X | X | X | X | X | |||
作其他处理 | X | X | X | ||||||
(5)化简。合并相似规则后得到表10-4。
表10-4 化简后的判定表
1 | 2 | 3 | 4 | 5 | ||
条件 | 功率大于50马力吗? | Y | Y | Y | N | N |
维修记录不全吗? | Y | N | N | -- | -- | |
运行超过10年吗? | -- | Y | N | Y | N | |
动作 | 进行优先处理 | X | X | X | ||
作其他处理 | X | X | ||||
10.4.3 某项目中业务单据处理规则测试用例
假设业务单据的处理规则为:“对于处于提交审批状态的单据,数据完整率达到80%以上或已经过业务员确认,则进行处理”。对于这条业务规则,首先通过分析所有可能的输入和可能的输出,可以得到如下结果:
输入:处于提交状态、数据完整率达到 80 %以上、已经过业务员确认。
输出:处理、不处理。
然后,需要进行第二步,找出输入与输出之间的对应关系。通过分析,可以看出有以下的对应关系:
(1)单据处于提交审批状态且数据完整率达 80 %以上,则处理。
(2)如果单据不处于审批状态,则不处理;如果单据处于提交审批状态,且已经过业务员确认,则处理。
(3)如果单据处于提交审批状态,数据完整率未达到80% 以上,但经过了业务员的确认,则处理。
为了方便画出因果图和判定表,需要对所有输入和输出编号,现在编号如下:
1:处于提交状态。
2:数据完整率达到 80%以上。
3:已经过业务员确认。
所有输出项编号如下:
21:处理。
22:不处理。
对于输入和输出的对应关系,需要结合实际业务的逻辑要求进行分析,并画出如图10-3所示的因果图。把因果图转换成如表10-5所示的判定表。

图10-3 因果图
表10-5 判定表

最后一个步骤就是把判定表中的8列转化成一个个测试用例。当然也可以先把判定表简化、合并后再转换成测试用例。
10.4.4 某厂发放工资测试用例
某厂发放工资,分析测试需求,列出输入和输出条件如下。
描述:
Ø 工资分为年薪制al,月薪制a2。
Ø 错误程度分为普通a3,严重a4。
Ø 工资为a1的员工犯普通错误的扣工资2%(b1),犯严重错误扣工资4%(b2)。
Ø 工资为a2的员工犯普通错误的扣工资4%(b3),犯严重错误扣工资8%(b4)。
其中,a1和a2为互斥;b1、b2和b3、b4是互斥; a3和a4可以同时具备。
由以上的输入输出条件得到表的判断表如表10-6所示。
表10-6 判定表
输入 | ||||||||
a1 | T | T | T | T | F | F | F | F |
a2 | F | F | F | F | T | T | T | T |
a3 | T | F | T | F | T | F | T | F |
a4 | F | T | T | F | F | T | T | F |
输出 | ||||||||
b1 | X | X | ||||||
b2 | X | X | ||||||
b3 | X | X | ||||||
b4 | X | X |
通过判定表得到测试用例如表10-7所示。
表10-7 测试用例
测试用例编号 | 输入数值 | 预期输出 |
1 | 工资为a1的员工,犯普通错误 | b1 |
2 | 工资为al的员工,犯严重错误 | b2 |
3 | 工资为al的员工,犯普通错误和严重错误 | b1+b2 |
4 | 工资为al的员工不犯错误 | 0 |
5 | 工资为a2的员工,犯普通错误 | b3 |
6 | 工资为a2的员工,犯严重错误 | b4 |
7 | 工资为a2的员工,犯普通错误和严重错误 | b3+b4 |
8 | 工资为a2的员工不犯错误 | 0 |
10.4.5 加法计数器测试用例
请看前面做过的两位数加法计算器的例子:
分析测试需求,根据需求确定输入条件和输出条件
输入:(条件桩)
Ø 条件1:0<=输入1,2<=99
Ø 条件2:-99<=输入1,2<0
Ø 条件3:-99>输入1,2
Ø 条件4:输入1,2>99
结果:(动作桩)
Ø 正确计算:程序显示加法计算结果。
Ø 错误提示:程序提示输入数据有误。
其中,条件1、2、3、4是互斥的,即输入1的取值若为条件1,就不可能为条件2、3、4。
这样,就可以得到8个输入条件和两个输出结果。根据输入输出条件,得到的判定表如表10-8所示。
表10-8 判定表
输入1 | ||||||||
条件1 | T | T | - | - | - | - | - | - |
条件2 | - | - | T | T | - | - | - | - |
条件3 | - | - | - | - | T | - | - | - |
条件4 | - | - | - | - | - | T | - | - |
输入2 | ||||||||
条件1 | T | - | T | - | - | - | - | - |
条件2 | - | T | - | T | - | - | - | - |
条件3 | - | - | - | - | - | - | T | - |
条件4 | - | - | - | - | - | - | - | T |
输出 | ||||||||
正确计算 | X | X | X | X | ||||
错误提示 | X | X | X | X |
通过判定表得到的测试用例如表10-9所示。
表10-9 测试用例
测试用例编号 | 输入数值 | 预期输出 |
1 | 98+98 | 正确输出: 196 |
2 | 99+ (-99) | 正确输出: 0 |
3 | -98+ (50) | 正确输出: -48 |
4 | -34+ (-45) | 正确输出: -79 |
5 | -100 | 错误信息 |
6 | 100 | 错误信息 |
7 | 20+ (-123) | 错误信息 |
8 | 20+(123) | 错误信息 |
10.4.6 中国象棋游戏中马的走法测试用例
需求说明如下:
1. 如果落点在棋盘外,则不移动棋子;
2. 如果落点与起点不构成日字型,则不移动棋子;
3. 如果落点处有自己方棋子,则不移动棋子;
4. 如果在落点方向的邻近交叉点有棋子(绊马腿),则不移动棋子;
5. 如果不属于1-4条,且落点处无棋子,则移动棋子;
6. 如果不属于1-4条,且落点处为对方棋子 (非老将) ,则移动棋子并除去对方棋子;
7. 如果不属于1-4条,且落点处为对方老将,则移动棋子,并提示战胜对方,游戏结束。
对说明进行分析,得到原因和结果:
原因:
Ø 落点在棋盘外;
Ø 不构成日字;
Ø 落点有自方棋子;
Ø 绊马腿;
Ø 落点无棋子;
Ø 落点为对方棋子;
Ø 落点为对方老将。
结果:
Ø 不移动;
Ø 移动;
Ø 移动己方棋子消除对方棋子;
Ø 移动并战胜对方。
根据分析出来的原因和结果,我们可以画出因果图,如图10-3所示。

图10-4 因果图
注:这里只加了些必要的约束条件。
11这个结点称做中间结点,是为了让因果图的结构更加明了,简化因果图导出的判定表。分析得出以下两个结论。
1、只有1、2、3、4都不成立时,产生11,跟5、6、7结合分别得出22、23、24三个结果;
2、不管5、6、7哪个成立,只要1、2、3、4有一个成立,就产生结果21;
再加上落点有自方棋子的状况。可以得到判定表如下:
条件 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
3 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
4 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | |
5 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | |
6 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | |
7 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | |
中间结果 | 11 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
结果 | 21 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | ||||||
22 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |||||||
23 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | |||||||
24 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
进一步分析,将各种不可能产生的组合情况,取消掉,用灰色表示出来了。这些都是之前没有写的一些约束条件导致的。比如落点在棋盘外,那么落点就不可能在对方棋子上了。最后将判定表内的规则转换成测试用例如下:
测试用例1
测试用例编号 | CHINESECHESS_ST_MOVE_MA_001 |
测试项目 | 象棋马的移动 |
测试标题 | 条件1-4不成立,移动马,落点是对方老将 |
重要级别 | 高 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方老将。 |
预期输出 | 移动棋子并提示战胜对方。 |
测试用例2
测试用例编号 | CHINESECHESS_ST_MOVE_MA_002 |
测试项目 | 象棋马的移动 |
测试标题 | 条件1-4不成立,移动马,落点是对方棋子(非老将) |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方棋子。 |
预期输出 | 移动棋子并除去对方棋子。 |
测试用例3
测试用例编号 | CHINESECHESS_ST_MOVE_MA_003 |
测试项目 | 象棋马的移动 |
测试标题 | 条件1-4不成立,移动马,落点无棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击无棋子的落点。 |
预期输出 | 移动棋子。 |
测试用例4
测试用例编号 | CHINESECHESS_ST_MOVE_MA_004 |
测试项目 | 象棋马的移动 |
测试标题 | 绊马腿,落点为对方老将 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方老将。 |
预期输出 | 不移动棋子。 |
测试用例5
测试用例编号 | CHINESECHESS_ST_MOVE_MA_005 |
测试项目 | 象棋马的移动 |
测试标题 | 绊马腿,落点为对方棋子(非老将) |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方棋子。 |
预期输出 | 不移动棋子。 |
测试用例6
测试用例编号 | CHINESECHESS_ST_MOVE_MA_006 |
测试项目 | 象棋马的移动 |
测试标题 | 绊马腿,落点无棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击无棋子落点。 |
预期输出 | 不移动棋子。 |
测试用例7
测试用例编号 | CHINESECHESS_ST_MOVE_MA_007 |
测试项目 | 象棋马的移动 |
测试标题 | 落点为自方棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击自方棋子。 |
预期输出 | 不移动棋子。 |
测试用例8
测试用例编号 | CHINESECHESS_ST_MOVE_MA_008 |
测试项目 | 象棋马的移动 |
测试标题 | 不构成日字,落点为对方老将 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方老将。 |
预期输出 | 不移动棋子。 |
测试用例9
测试用例编号 | CHINESECHESS_ST_MOVE_MA_009 |
测试项目 | 象棋马的移动 |
测试标题 | 不构成日字,落点为对方棋子(非老将) |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击对方棋子。 |
预期输出 | 不移动棋子。 |
测试用例10
测试用例编号 | CHINESECHESS_ST_MOVE_MA_010 |
测试项目 | 象棋马的移动 |
测试标题 | 不构成日字,落点无棋子 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击无棋子落点。 |
预期输出 | 不移动棋子。 |
测试用例11
测试用例编号 | CHINESECHESS_ST_MOVE_MA_011 |
测试项目 | 象棋马的移动 |
测试标题 | 落点在棋盘外 |
重要级别 | 中 |
预置条件 | 无 |
输入 | 点击马,点击棋子的落点 |
操作步骤 | 1、点击自方马; 2、点击棋盘外。 |
预期输出 | 不移动棋子。 |
小结
本节课对通用测试技术中的因果图和决策表进行了较为详细的阐述,大家要注意到因果图方法有其适用范围和一定的局限性。
附件1:

