第4章 等价类与边界值联合设计:组合策略、覆盖矩阵、示例演练
适用场景
当被测输入包含多个字段或变量,且每个字段既有等价类划分又有明确边界时,单独测试任一字段的边界无法暴露字段间组合引起的缺陷。本方法适用于:
- 表单输入(注册、筛选、金额录入)
- API 请求参数多字段校验
- 配置项组合边界校验
- 跨字段逻辑规则(如“年龄≥18且金额≤10000”)
前置条件
| 编号 | 条件 | 说明 |
|---|---|---|
| 1 | 已完成单字段等价类划分 | 各字段的有效/无效等价类已明确 |
| 2 | 已识别各字段边界值 | 上点、离点、内点已标注(见第3章) |
| 3 | 确定字段间逻辑约束 | 如条件互斥、依赖关系、取值范围联动 |
| 4 | 工具或模板就绪 | 覆盖矩阵模板(Excel/表格)、缺陷管理工具 |
操作步骤
- 罗列所有字段及其等价类/边界值
为每个字段建立“字段-等价类-边界点”映射表。例如:字段A: 年龄 有效等价类: 18~60 无效等价类: <18, >60 边界值: 17,18,19,59,60,61 字段B: 单笔金额(元) 有效等价类: 0.01~50000 无效等价类: 0, <0.01, >50000 边界值: 0,0.01,0.02,49999.99,50000,50000.01 - 确定组合策略
根据测试资源与风险等级选择策略:策略 做法 适用 全组合(All-Pairs) 每字段取一个值,穷举所有笛卡尔积 字段≤3,每个字段值少 正交表(Orthogonal Array) 用正交表裁剪组合数 字段≥3,中等资源 单因素轮换 每次只变一个字段,其他固定 回归验证、单个边界验证 约束感知组合 只保留满足业务规则的组合 强逻辑依赖场景 - 构建覆盖矩阵
行=测试用例编号,列=每个字段的取值,末尾列=预期结果。示例(部分矩阵):| TC_ID | 年龄 | 金额(元) | 预期结果 | |-------|------|----------|----------| | TC01 | 17 | 0.01 | 拒绝 | | TC02 | 18 | 0 | 拒绝 | | TC03 | 18 | 0.01 | 成功 | | TC04 | 18 | 50000 | 成功 | | TC05 | 18 | 50000.01 | 拒绝 | | TC06 | 60 | 50000 | 成功 | | TC07 | 61 | 50000 | 拒绝 | - 验收条件设计
针对每一条用例,将“预期结果”展开为可测量的验收条件。例如TC03的验收条件:- 年龄=18,金额=0.01 → 系统返回状态码200
- 数据库该订单创建成功
- 响应体包含“success:true”
- 执行与修正
按矩阵逐条执行,记录实际结果。若发现组合漏洞,补充矩阵并回归。
输入输出物
| 类型 | 输入物 | 输出物 |
|---|---|---|
| 必须 | 字段等价类划分表、边界值清单 | 覆盖矩阵(Excel/CSV) |
| 可选 | 历史缺陷库、业务规则文档 | 组合策略选择记录、验收条件清单 |
| 衍生 | 正交表L9/L16等模板 | 测试执行报告(含通过/失败标记) |
责任边界
- 测试分析员:完成第1步字段映射表,选择组合策略,构造覆盖矩阵。
- 测试执行员:按矩阵执行测试,记录缺陷。
- 领域专家/产品经理:确认组合策略中的业务约束(如“当年龄<18时金额必≤100”)。
- 测试组长:评审覆盖矩阵的完备性与冗余度。
记录材料
- 覆盖矩阵源文件(带版本号与变更日期)
- 组合策略评审纪要(若使用正交表需附正交表编号)
- 每轮执行的测试日志(至少包含TC_ID、实际结果、截图或接口响应)
异常处理
| 异常 | 处理方式 |
|---|---|
| 字段数过多(≥8)导致矩阵膨胀 | 改用正交表+单因素轮换混合;或使用PICT工具自动生成pairwise组合 |
| 业务规则临时变更 | 标记受影响的行/列,重新按步骤1~3更新矩阵,并追加回归用例 |
| 某个边界值在组合中无法触发预期逻辑 | 检查该边界是否正确映射到等价类,必要时补充更多内点测试 |
| 测试环境返回结果不稳定 | 记录为“待重试”,并添加环境快照;排除环境因素后再判断缺陷 |
验收标准
- 覆盖矩阵中至少包含每个字段的每个等价类边界值点(上点/离点)被覆盖一次。
- 所有违反业务规则的组合(如年龄17+金额50000)必须被包含且预期为拒绝。
- 矩阵行数不超过全组合数(笛卡尔积)的50%,除非资源充足并通过评审。
- 每一条验收条件可与对应TC_ID逐一关联,无歧义。
💡 组合技巧:先用“单边界轮换”快速覆盖全部边界点,再用“约束感知组合”补齐跨字段的关键交叉场景,最后用PICT自动补充遗漏对,可大幅减少人工重复劳动。
示例演练:
场景:用户注册时填写“年龄”(整数,1~120)与“推荐码”(6位字母数字,可选)。
字段映射:
年龄边界: 0,1,2,119,120,121(无效:0,121;边界:1,2,119,120)
推荐码: 有效格式(^[A-Za-z0-9]{6}$)、无效格式(空、5位、7位、含特殊字符)
组合策略: 单因素轮换+约束感知(年龄无效时推荐码不必穷举所有无效值,只取1个代表)
覆盖矩阵片段:
TC-A01: 年龄=0(无效), 推荐码=空 → 拒绝(年龄无效)
TC-A02: 年龄=0(无效), 推荐码=ABC123 → 拒绝(年龄无效)
TC-A03: 年龄=1(有效内点), 推荐码=空 → 拒绝(推荐码为空)
TC-A04: 年龄=1(有效内点), 推荐码=ABC123 → 成功
TC-A05: 年龄=120(有效边界上点), 推荐码=ABC123 → 成功
TC-A06: 年龄=121(无效上点), 推荐码=ABC123 → 拒绝(年龄无效)
TC-A07: 年龄=18(有效内点), 推荐码=aa1(5位) → 拒绝(推荐码格式错误)
...
执行结果填入矩阵,若TC-A05实际被拒绝,则可能是边界值偏移,需提交缺陷。
⚠️ 常见错误
- 只测试了每字段的独立边界,没有组合测试,导致跨字段缺陷泄露到生产。
- 覆盖矩阵中混入大量冗余组合(如全是有效值重复),浪费执行时间。
- 验收条件写成“系统正常”等模糊描述,应具体到状态码、数据库记录数、响应字段等。