测试中的默认选项 Default Options in Testing

基础选择 Base Choice

等价划分 Equivalence Partitioning

各输入变量的划分如下:

输入A输入B输入C输入D
A1B1C1D1
A2B2C2D2
D3

每个变量的默认选项:

输入A输入B输入C输入D
A1B2C2D3

生成的测试用例:

测试用例输入A输入B输入C输入D
1(基础)A1B2C2D3
2A2B2C2D3
3A1B1C2D3
4A1B2C1D3
5A1B2C2D1
6A1B2C2D2

❓ 测试用例的数量是多少?

多重基础选择 Multiple Base Choice

等价划分 Equivalence Partitioning 多重基础选择中

某些变量拥有多个默认选项(此处输入D有两个默认值:D1 和 D3):

输入A输入B输入C输入D(多默认)
A1B2C2D1 / D3

由此生成的测试用例(以D1为基础):

测试用例输入A输入B输入C输入D
1A1B2C2D1
2A2B2C2D1
3A1B1C2D1
4A1B2C1D1
5A1B2C2D2
6A1B2C2D3

测试中的约束 Constraints in Testing

合并输入变量 Merge Input Variables

原始等价划分:

输入A输入B输入C输入D
A1B1C1D1
A2B2C2D2
D3

约束条件:输入A = A1 时,输入B = B2(即 A1 与 B2 不能同时出现其他情况)

合并后,将 (输入A, 输入B) 作为一个组合变量:

(输入A, 输入B)输入C输入D
(A1, B1) ❌C1D1
(A2, B1)C2D2
(A2, B2)D3

说明:(A1, B2) 是约束中唯一合法的 A1 组合,(A1, B1) 被排除。

细化输入域 Refine Input Domain

在约束 A1 → B2 的条件下,将输入域拆分为两个子情境:

当 输入A = A1 时:

输入A输入B输入C输入D
A1B1C1D1
C2D2
D3

当 输入A = A2 时:

输入A输入B输入C输入D
A2B1C1D1
B2C2D2
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
觉得疲倦?YYYYNNNN
感兴趣吗?YYNNYYNN
糊涂吗?YNYNYNYN
建议:重读
建议:继续
建议:跳下一章
建议:休息

决策表的优点

决策表的优点在于:能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。因此,利用决策表能够设计出完整的测试用例集合。

在一些数据处理问题中,某些操作的实施依赖于多个逻辑条件的组合,即针对不同逻辑条件的组合值,分别执行不同的操作。决策表非常适合处理这类问题。

决策表的组成

决策表通常由以下4部分组成:

  • 条件桩——列出问题的所有条件
  • 条件项——针对条件桩中的条件,列出所有可能的取值
  • 动作桩——列出问题规定的可能采取的操作
  • 动作项——指出在各条件项取值情况下应采取的动作
规则1规则2
条件桩条件项条件项
动作桩动作项动作项

规则:任何一个条件组合的特定取值及其对应动作,构成一条规则。在决策表中,贯穿条件项和动作项的一列即为一条规则。

决策表的生成步骤

构造决策表的5个步骤:

  1. 确定规则的个数:有 n 个条件的决策表有 2ⁿ 条规则(每个条件取真/假值)
  2. 列出所有的条件桩和动作桩
  3. 填入条件项
  4. 填入动作项,得到初始决策表
  5. 简化决策表,合并相似规则:
    • 若表中有两条以上规则具有相同的动作,且条件项之间存在极为相似的关系,可以合并
    • 合并后的条件项用符号 "-" 表示,说明该动作与此条件的取值无关,称为无关条件

三角形问题的决策表

条件 / 动作规则1~8规则9规则10规则11规则12规则13规则14规则15规则16
c1: a,b,c 构成三角形?NYYYYYYYY
c2: a = b?-YYYYNNNN
c3: a = c?-YYNNYYNN
c4: b = c?-YNYNYNYN
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不是闰年