4、测试用例设计方法:等价类划分、边界值分析、因果图法、场景法、正交实验法在集成测试中的应用
集成测试和单元测试最大的区别在哪?我个人觉得,不是测的模块变多了,而是输入组合爆炸了。你想想看,两个模块一对接,A模块的3个输出参数,配上B模块的4个状态,瞬间就是12种组合。要是全靠直觉去点,漏掉关键场景是迟早的事。
所以这一章,咱们就聊聊怎么用工程化的方法去设计集成测试用例。说白了,就是给你几把趁手的工具,让你在面对复杂接口时,心里有谱。
4.1 等价类划分:把无穷变成有限
等价类划分的核心思想很简单:把输入数据按“效果相同”分组,每组只测一个代表值。这样就能用最少的用例,覆盖最广的范围。
我在项目中遇到过最典型的例子,是一个温控设备的温度输入接口。文档上写“支持-40℃ 到 +85℃”。如果每个整数都测一遍,得测126个用例,太傻了。
用等价类划分,我们只需要分三类:
| 等价类 | 范围 | 代表值 |
|---|---|---|
| 有效等价类 | -40 ≤ 输入 ≤ 85 | 0 |
| 无效等价类(下限) | 输入 < -40 | -50 |
| 无效等价类(上限) | 输入 > 85 | 100 |
三个用例,搞定。但这里有个坑——等价类划分只关注“输入”,不关注“输入之间的关系”。比如两个参数互相制约,它就管不了了。这时候,得请出下一把工具。
4.2 边界值分析:Bug最喜欢扎堆的地方
为什么边界值分析这么重要?因为程序员的逻辑判断,99%的Bug都出在“等于”、“大于”、“小于”这些边界判断上。你想想看,写 if (temp >= 0) 和 if (temp > 0) 的区别,就差一个等号,但结果天差地别。
边界值分析的原则是:取每个等价类的边界值,以及边界两侧紧邻的值。
还是刚才那个温度接口的例子,边界值要测的点是:
- 下边界: -41(无效)、-40(有效)、-39(有效)
- 上边界: 84(有效)、85(有效)、86(无效)
一共6个用例。加上等价类的代表值0,总共7个用例,就能把整个输入域覆盖得死死的。
if (temp < -40),浮点数精度问题导致-40.1被判定为等于-40。从那以后,我每次都会把边界两侧的值也加上。
4.3 因果图法:理清输入之间的“爱恨情仇”
当多个输入条件互相影响时,等价类和边界值就有点力不从心了。这时候,因果图法就派上了用场。
因果图法的核心是:画出“因”(输入条件)和“果”(输出结果)之间的逻辑关系,然后根据这个关系生成测试用例。
举个例子,一个智能门禁系统:
- 因1: 指纹验证通过
- 因2: 密码验证通过
- 因3: 管理员强制开门
- 果: 门打开
逻辑关系是:(因1 且 因2)或 因3 → 果
根据这个因果图,我们可以生成以下测试用例:
| 用例编号 | 指纹 | 密码 | 管理员 | 预期结果 |
|---|---|---|---|---|
| 1 | 通过 | 通过 | 否 | 开门 |
| 2 | 通过 | 失败 | 否 | 不开门 |
| 3 | 失败 | 通过 | 否 | 不开门 |
| 4 | 失败 | 失败 | 否 | 不开门 |
| 5 | 任意 | 任意 | 是 | 开门 |
你看,5个用例就把所有逻辑分支覆盖了。因果图法的好处是,它强迫你去思考“如果A成立但B不成立,结果会怎样?”——这种思考方式,是发现逻辑漏洞的关键。
4.4 场景法:从用户视角出发
前面几种方法都是从“输入”角度出发的。但集成测试最终要验证的是“业务流程”是否走得通。这时候,场景法就登场了。
场景法的核心是:模拟用户在实际使用中的操作路径。它分为基本流和备选流。
- 基本流: 用户最常用的、最顺利的路径。比如“刷卡 → 验证通过 → 开门 → 进入”。
- 备选流: 用户可能遇到的异常或分支路径。比如“刷卡 → 验证失败 → 提示错误 → 重试”。
我记得有一次测试一个支付系统,基本流测了20遍都没问题。但当我用场景法去模拟“支付过程中网络中断,然后恢复”的场景时,系统直接卡死了。为什么?因为支付模块和网络模块之间的超时机制没处理好。
场景法的价值就在于此——它不关心单个接口的输入输出,而是关心多个模块串联起来后,业务流程是否健壮。
4.5 正交实验法:用最少的组合覆盖最多的场景
当输入参数很多,每个参数又有多个取值时,组合数会爆炸。比如3个参数,每个有4个取值,全组合就是64种。测不完,根本测不完。
正交实验法就是用来解决这个问题的。它通过正交表,从全组合中挑选出“最具代表性”的用例,保证任意两个参数的所有组合都被覆盖到。
举个例子,一个设备有3个配置参数:
- 波特率: 9600、19200、38400
- 校验位: 无、奇、偶
- 数据位: 7、8
全组合是 3×3×2 = 18种。但用正交表 L9(3^4),只需要9个用例。
| 用例 | 波特率 | 校验位 | 数据位 |
|---|---|---|---|
| 1 | 9600 | 无 | 7 |
| 2 | 9600 | 奇 | 8 |
| 3 | 9600 | 偶 | 7 |
| 4 | 19200 | 无 | 8 |
| 5 | 19200 | 奇 | 7 |
| 6 | 19200 | 偶 | 8 |
| 7 | 38400 | 无 | 7 |
| 8 | 38400 | 奇 | 8 |
| 9 | 38400 | 偶 | 7 |
你看,9个用例就覆盖了所有“两两组合”。对于集成测试来说,这已经足够了。因为大部分Bug都是由两个参数的交互引起的,三个参数同时出问题的概率极低。