测试中的默认选项 Default Options in Testing
基础选择 Base Choice
等价划分 Equivalence Partitioning
各输入变量的划分如下:
| 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|
| A1 | B1 | C1 | D1 |
| A2 | B2 | C2 | D2 |
| D3 |
每个变量的默认选项:
| 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|
| A1 | B2 | C2 | D3 |
生成的测试用例:
| 测试用例 | 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|---|
| 1(基础) | A1 | B2 | C2 | D3 |
| 2 | A2 | B2 | C2 | D3 |
| 3 | A1 | B1 | C2 | D3 |
| 4 | A1 | B2 | C1 | D3 |
| 5 | A1 | B2 | C2 | D1 |
| 6 | A1 | B2 | C2 | D2 |
❓ 测试用例的数量是多少?
多重基础选择 Multiple Base Choice
等价划分 Equivalence Partitioning 多重基础选择中
某些变量拥有多个默认选项(此处输入D有两个默认值:D1 和 D3):
| 输入A | 输入B | 输入C | 输入D(多默认) |
|---|---|---|---|
| A1 | B2 | C2 | D1 / D3 |
由此生成的测试用例(以D1为基础):
| 测试用例 | 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|---|
| 1 | A1 | B2 | C2 | D1 |
| 2 | A2 | B2 | C2 | D1 |
| 3 | A1 | B1 | C2 | D1 |
| 4 | A1 | B2 | C1 | D1 |
| 5 | A1 | B2 | C2 | D2 |
| 6 | A1 | B2 | C2 | D3 |
测试中的约束 Constraints in Testing
合并输入变量 Merge Input Variables
原始等价划分:
| 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|
| A1 | B1 | C1 | D1 |
| A2 | B2 | C2 | D2 |
| D3 |
约束条件:输入A = A1 时,输入B = B2(即 A1 与 B2 不能同时出现其他情况)
合并后,将 (输入A, 输入B) 作为一个组合变量:
| (输入A, 输入B) | 输入C | 输入D |
|---|---|---|
| (A1, B1) ❌ | C1 | D1 |
| (A2, B1) | C2 | D2 |
| (A2, B2) | D3 |
说明:(A1, B2) 是约束中唯一合法的 A1 组合,(A1, B1) 被排除。
细化输入域 Refine Input Domain
在约束 A1 → B2 的条件下,将输入域拆分为两个子情境:
当 输入A = A1 时:
| 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|
| A1 | B1 | C1 | D1 |
| C2 | D2 | ||
| D3 |
当 输入A = A2 时:
| 输入A | 输入B | 输入C | 输入D |
|---|---|---|---|
| A2 | B1 | C1 | D1 |
| B2 | C2 | D2 | |
| D3 |
修改测试用例 Modify Test Cases
在存在约束 A1 → B2 的情况下,对含有非法组合的测试用例进行修正:
| 原始测试用例 | 违反约束 | 修正后测试用例 |
|---|---|---|
| (-, B2, C1, D1) | A值未指定 | (A2, B2, C1, D1) |
| (A1, B2, C1, D1) | 合法,无需修改 | (A1, B2, C1, D1) |
| (A1, -, C1, D1) | B值未指定 | (A1, B1, C1, D1) |
约束要求:若 A = A1,则 B 必须 ≠ B2(或反之),需替换为合法值。
决策表 Decision Tables
决策表的定义
决策表用于表示条件(大致对应输入)与动作(大致对应输出)之间的逻辑关系。测试用例可以从中系统性地推导出来。——【SWEBOK v3.0】
阅读指南示例——决策表
| 条件 / 动作 | 规则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 | 规则2 | … | |
|---|---|---|---|
| 条件桩 | 条件项 | 条件项 | … |
| 动作桩 | 动作项 | 动作项 | … |
规则:任何一个条件组合的特定取值及其对应动作,构成一条规则。在决策表中,贯穿条件项和动作项的一列即为一条规则。
决策表的生成步骤
构造决策表的5个步骤:
- 确定规则的个数:有 n 个条件的决策表有 2ⁿ 条规则(每个条件取真/假值)
- 列出所有的条件桩和动作桩
- 填入条件项
- 填入动作项,得到初始决策表
- 简化决策表,合并相似规则:
- 若表中有两条以上规则具有相同的动作,且条件项之间存在极为相似的关系,可以合并
- 合并后的条件项用符号 "-" 表示,说明该动作与此条件的取值无关,称为无关条件
三角形问题的决策表
| 条件 / 动作 | 规则1~8 | 规则9 | 规则10 | 规则11 | 规则12 | 规则13 | 规则14 | 规则15 | 规则16 |
|---|---|---|---|---|---|---|---|---|---|
| c1: a,b,c 构成三角形? | N | Y | Y | Y | Y | Y | Y | Y | Y |
| c2: a = b? | - | Y | Y | Y | Y | N | N | N | N |
| c3: a = c? | - | Y | Y | N | N | Y | Y | N | N |
| c4: b = c? | - | Y | N | Y | N | Y | N | Y | N |
| a1: 非三角形 | √ | ||||||||
| a2: 一般三角形 | √ | √ | |||||||
| a3: 等腰三角形 | √ | √ | √ | √ | |||||
| a4: 等边三角形 | √ | ||||||||
| a5: 不可能 | √ |
练习——前一日函数
前一日函数 DPrevDate 是 NextDate 的逆函数,即给定一个月份、日期、年,返回前一天的日期。
- 年的取值范围:1812年 ~ 2017年
- 日的取值范围:1日 ~ 31日
- 月的取值范围:1月 ~ 12月
条件项划分
月份的等价类:
| 等价类 | 含义 |
|---|---|
| M1 | 月份:4、6、9、11月 |
| M2 | 月份:5、7、10、12月 |
| M3 | 月份:1月 |
| M4 | 月份:2月 |
| M5 | 月份:3月 |
| M6 | 月份:8月 |
日期的等价类:
| 等价类 | 含义 |
|---|---|
| D1 | 日期:1日 |
| D2 | 日期:2 ≤ 日 ≤ 27 |
| D3 | 日期:28日 |
| D4 | 日期:29日 |
| D5 | 日期:30日 |
| D6 | 日期:31日 |
年份的等价类:
| 等价类 | 含义 |
|---|---|
| Y1 | 是闰年 |
| Y2 | 不是闰年 |
