4. 测试用例设计方法(上):等价类划分法、边界值分析法、因果图法、判定表驱动法

大家好,我是老张。今天咱们聊聊测试用例设计。

说实话,我见过太多测试新手,一上来就凭感觉写用例。结果呢?要么漏测,要么重复。其实,设计测试用例是有章可循的。今天这四种方法,是我个人最常用的基本功。

核心思想:用最少的用例,覆盖最多的场景。别想着穷举,你测不完的。

测试用例设计方法 等价类划分法 边界值分析法 因果图法 判定表驱动法 四种方法各有侧重,组合使用效果最佳

4.1 等价类划分法

这个方法,说白了就是「分门别类」。把输入数据分成几个组,每个组里挑一个代表来测。

我记得刚入行时,测一个登录框。用户名要求6-18位字母数字。我傻乎乎地测了「abc123」、「testuser2024」、「admin」...测了十几种。后来师傅告诉我:你其实只需要测三类——有效等价类、无效等价类。

我的经验:有效等价类测一个就够了,无效等价类要尽量覆盖全。因为用户总爱乱输入。

具体怎么分?

  • 有效等价类:符合需求的数据。比如6-18位字母数字,那「test123」就是一个有效代表。
  • 无效等价类:不符合需求的数据。比如小于6位、大于18位、包含特殊字符、空值等等。

举个例子,一个年龄输入框(1-120岁):

输入条件 有效等价类 无效等价类
年龄范围 1-120之间的整数 0、负数、121、小数、字母、空值

注意:我曾经踩过一个坑——只分了有效和无效两类,但没考虑「边界」。比如年龄输入「0」和「121」虽然都是无效,但它们的处理逻辑可能完全不同。所以,等价类划分后,一定要配合边界值分析。

4.2 边界值分析法

你想想看,程序最容易在哪儿出问题?边界!

我做过一个统计,大概70%的缺陷都集中在边界附近。为什么?因为开发写代码时,最容易搞错的就是「大于等于」和「大于」的区别。

边界值分析的核心:取边界点、边界内一点、边界外一点。

比如输入范围是1-100:

  • 上点:1 和 100(边界本身)
  • 离点:0 和 101(边界外紧邻的点)
  • 内点:50(边界内的任意点)

实战技巧:我一般会取「最小值、最小值-1、最小值+1、最大值、最大值-1、最大值+1」这6个值。如果涉及多个边界,比如字符串长度,还要考虑空字符串和超长字符串。

举个代码例子,一个判断成绩等级的函数:

def get_grade(score):
    if score >= 90:
        return '优秀'
    elif score >= 80:
        return '良好'
    elif score >= 70:
        return '中等'
    elif score >= 60:
        return '及格'
    else:
        return '不及格'

边界值测试用例:

输入 预期输出 说明
59不及格60的离点
60及格边界点
61及格边界内点
89良好90的离点
90优秀边界点
91优秀边界内点

小提示:边界值分析不要只盯着数字。字符串长度、列表大小、文件大小,这些都有边界。我曾经测过一个上传功能,文件大小限制10MB,结果用户传了个9.99MB的文件,程序直接崩溃了——因为开发写的是「if size > 10MB」,没考虑浮点数精度。

4.3 因果图法

这个方法,适合处理「条件组合」的场景。说白了,就是多个输入条件互相影响,导致不同的输出结果。

我刚开始学因果图时,觉得画图好麻烦。后来发现,不画图才麻烦——你根本理不清那些复杂的逻辑关系。

因果图的基本元素:

  • 原因(输入条件):用圆圈表示,比如「是否登录」、「是否VIP」
  • 结果(输出动作):用方框表示,比如「显示折扣价」、「显示原价」
  • 关系:与、或、非等逻辑关系

举个例子,一个电商优惠规则:

  • 原因1:用户是VIP
  • 原因2:商品是促销品
  • 结果:享受折扣价

逻辑关系:VIP 或 促销品 → 享受折扣价

我的做法:先画因果图,理清逻辑关系。然后根据因果图生成判定表。这样不容易漏掉组合情况。

4.4 判定表驱动法

判定表,其实就是把因果图「翻译」成表格。它特别适合处理「多个条件、多个结果」的场景。

我记得有一次测一个审批流程,条件有5个,结果有3种。我一开始凭感觉写了20多个用例,结果还是漏了一种组合。后来用判定表,一查——原来有32种组合,我只覆盖了不到一半。

判定表的组成:

条件/动作 规则1 规则2 规则3 规则4
条件1:是否VIP Y Y N N
条件2:是否促销 Y N Y N
动作:折扣价
动作:原价

避坑指南:我曾经犯过一个错误——判定表里条件太多,导致规则数量爆炸(2的n次方)。后来我学会了「合并规则」:如果某些条件不影响结果,就把它们合并。比如上面的例子,只要满足VIP或促销,结果都是折扣价,那就可以合并规则1、2、3。

判定表的使用步骤:

  1. 列出所有条件(输入)
  2. 列出所有动作(输出)
  3. 计算规则数量(2的n次方,n为条件数)
  4. 填充条件组合
  5. 确定每个组合对应的动作
  6. 合并冗余规则

实用建议:条件超过4个时,判定表会变得很大。这时候可以考虑「扩展条目判定表」或者「条件分割」。我一般会把条件控制在4个以内,超过就拆分成多个小判定表。

好了,这四种方法讲完了。它们不是孤立的,实际工作中经常组合使用。比如先用等价类划分缩小范围,再用边界值分析补充边界用例,遇到复杂逻辑就用因果图+判定表。嗯,多练练,你也能写出高质量的测试用例。