一、开篇:从痛点说起
每个测试工程师都经历过这样的场景:拿到一个需求文档,面对复杂的业务逻辑的测试对象,脑海里一片混乱——到底该设计哪些测试用例?怎么才能保证覆盖率?是不是靠”感觉”在写用例?
我见过太多新手测试工程师,拿到需求后直接开始”拍脑袋”设计用例,结果要么用例冗余重复,要么关键场景遗漏。更糟糕的是,当被问到”你的用例覆盖率是多少”时,只能含糊其辞地回答”应该差不多吧”。
其实,测试用例设计不是玄学,而是一门有方法论支撑的技术。就像建筑师需要图纸,医生需要诊断流程一样,测试工程师也需要系统性的方法论来指导用例设计。本文将深入讲解七种核心的测试用例设计方法,每种方法都配有实战案例,帮你建立完整的测试设计思维体系。
无论你是刚入行的新手,还是有一定经验但想系统提升的测试工程师,这篇文章都能帮你建立起结构化的测试设计能力。让我们开始吧。
二、测试用例设计方法论全景图
图片引自微信公众号,扫码关注阅读原文方法一:等价类划分法
1. 是什么(定义)
等价类划分法是将无限多的输入数据按照”是否暴露缺陷”的可能性划分为若干个等价类,从每个等价类中选取少数代表性数据作为测试用例的方法。
2. 解决什么问题
解决”无法穷举所有输入”的问题。通过科学分类,用最少的用例覆盖最大的范围,避免冗余测试,提高测试效率。
3. 怎么用(步骤要点)
步骤:
-
识别输入条件 -
划分有效等价类(符合需求的输入) -
划分无效等价类(不符合需求的输入) -
设计用例:每个等价类至少设计一个用例
要点:
-
有效等价类通常有1个,无效等价类有多个 -
每条用例尽可能覆盖多个有效等价类 -
每条用例只能覆盖一个无效等价类(确保单独验证)
4. 实战案例:电商登录模块(用户名输入框)
需求:用户名长度为8-16位,只能包含字母和数字的组合。
等价类划分:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
测试用例设计:
-
用例1:输入”test1234″ → 预期:登录成功 -
用例2:输入”test12″ → 预期:提示”用户名长度必须为8-16位” -
用例3:输入”test1234567890123″ → 预期:提示”用户名长度必须为8-16位” -
用例4:输入”12345678″ → 预期:提示”用户名必须包含字母和数字” -
用例5:输入”abcdefgh” → 预期:提示”用户名必须包含字母和数字” -
用例6:输入”test@123″ → 预期:提示”用户名只能包含字母和数字”
方法二:边界值分析法
1. 是什么(定义)
边界值分析法是在等价类划分的基础上,选择等价类边界上的值(上点、离点、内点)作为测试用例的方法。经验表明,错误往往发生在边界附近。
2. 解决什么问题
解决”开发人员容易在边界条件上犯错”的问题。通过系统性地测试边界值,发现那些隐藏在边界附近的缺陷。
3. 怎么用(步骤要点)
核心概念:
- 上点:
边界上的点(如闭区间[1,10]的1和10) - 离点:
离边界最近的点(闭区间离点在边界外,开区间离点在边界内) - 内点:
等价类内部的点
取值规则:
-
如果区间是闭区间[a,b],取:a, a+1(或最小精度单位), b-1(或最小精度单位), b -
如果区间是开区间(a,b),取:a+1(或最小精度单位), b-1(或最小精度单位) -
通常每个边界取3-5个值
4. 实战案例:银行转账模块(转账金额)
需求:转账金额范围为0.01元-50000元(含边界)。
边界值分析:
下边界(0.01元):
-
离点(边界外):0元(无效) -
上点(边界上):0.01元(有效) -
内点(边界内):0.02元(有效)
上边界(50000元):
-
内点(边界内):49999.99元(有效) -
上点(边界上):50000元(有效) -
离点(边界外):50000.01元(无效)
测试用例设计:
-
用例1:转账金额=0元 → 预期:提示”转账金额必须大于0″ -
用例2:转账金额=0.01元 → 预期:转账成功 -
用例3:转账金额=0.02元 → 预期:转账成功 -
用例4:转账金额=49999.99元 → 预期:转账成功 -
用例5:转账金额=50000元 → 预期:转账成功 -
用例6:转账金额=50000.01元 → 预期:提示”转账金额不能超过50000元”
通用边界值概念(上点、离点、内点)
图片引自微信公众号,扫码关注阅读原文银行转账模块实战案例(转账金额:0.01元-50000元 闭区间)
图片引自微信公众号,扫码关注阅读原文方法三:场景法
1. 是什么(定义)
场景法是基于用户真实使用场景来设计测试用例的方法。通过描述用户与系统的交互流程,识别出基本流(正常流程)和备选流(异常或分支流程),为每个场景设计测试用例。
2. 解决什么问题
解决”单个功能测试通过,但端到端流程失败”的问题。场景法关注用户视角的完整业务流程,更容易发现集成缺陷和用户体验问题。
3. 怎么用(步骤要点)
步骤:
-
分析需求,识别基本流(正常流程) -
识别备选流(异常流程、分支流程) -
组合基本流和备选流,生成场景 -
为每个场景设计测试用例
要点:
-
每个场景必须有明确的预期结果 -
优先覆盖基本流,再覆盖备选流 -
场景数量可能很多,需要权衡优先级
4. 实战案例:OTA升级流程
需求:车主通过车机系统触发OTA升级,系统检测版本、下载升级包、安装并验证。
场景分析:
|
基本流(场景1:升级成功): 车主触发升级 → 系统检测网络(正常) → 检测版本(有新版本) → 下载升级包(成功) → 安装(成功) → 验证(通过) → 升级完成 预期结果:车机系统升级到最新版本,功能正常 |
|
备选流1(场景2:网络断开): 车主触发升级 → 系统检测网络(断开) → 提示”网络连接失败,请检查网络” 预期结果:升级中止,提示用户检查网络 |
|
备选流2(场景3:下载失败): 车主触发升级 → 系统检测网络(正常) → 检测版本(有新版本) → 下载升级包(失败,空间不足) → 提示”存储空间不足,请清理后重试” 预期结果:升级中止,提示用户清理存储空间 |
|
备选流3(场景4:安装失败): 车主触发升级 → 系统检测网络(正常) → 检测版本(有新版本) → 下载升级包(成功) → 安装(失败,断电) → 回滚到旧版本 预期结果:系统回滚到升级前版本,不影响正常使用 |
OTA升级状态转换图
📊 状态 → 事件 → 动作 → 新状态
图片引自微信公众号,扫码关注阅读原文📋 状态说明:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
方法四:判定表法
1. 是什么(定义)
判定表法是通过表格形式,列出所有条件组合及其对应的动作(结果),从而设计出覆盖所有条件组合的测试用例的方法。
2. 解决什么问题
解决”多条件组合逻辑复杂,容易遗漏某些组合”的问题。判定表能够系统地枚举所有条件组合,确保不遗漏任何逻辑分支。
3. 怎么用(步骤要点)
判定表结构:
- 条件桩:
列出所有条件 - 动作桩:
列出所有可能的动作(结果) - 条件项:
条件的取值(真/假,是/否) - 动作项:
在特定条件组合下执行的动作
步骤:
-
识别条件和动作 -
构建判定表(2^n行,n为条件数) -
合并相似规则(可选,减少用例数) -
将每条规则转换为测试用例
4. 实战案例:电商登录模块(账号状态处理)
需求:电商系统登录逻辑:
-
如果用户名正确且密码正确,且账号未被锁定 → 登录成功 -
如果用户名正确但密码错误 → 提示”密码错误”,错误次数+1 -
如果用户名不存在 → 提示”用户名不存在” -
如果账号已被锁定 → 提示”账号已锁定,请联系客服” -
如果密码错误次数≥5次 → 锁定账号
判定表:
|
|
|
|
|
|
|
|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
测试用例:
-
用例1:用户名=存在的用户,密码=正确密码,账号未锁定 → 预期:登录成功 -
用例2:用户名=存在的用户,密码=错误密码,账号未锁定 → 预期:提示”密码错误” -
用例3:用户名=存在的用户,密码=任意,账号已锁定 → 预期:提示”账号已锁定” -
用例4:用户名=不存在的用户 → 预期:提示”用户名不存在” -
用例5:用户名=存在的用户,密码=错误密码×5次 → 预期:账号被锁定
方法五:因果图法
1. 是什么(定义)
因果图法是通过图形化的方式(因果图)描述输入条件(因)和输出结果(果)之间的逻辑关系,然后转换为判定表来设计测试用例的方法。
2. 解决什么问题
解决”条件之间的约束关系复杂,判定表难以直接构建”的问题。因果图通过图形化表示,更直观地展现条件间的关系,特别适合有复杂业务规则的场景。
3. 怎么用(步骤要点)
基本关系:
- 恒等:
因为真,果必为真 - 与(AND):
多个因都为真,果才为真 - 或(OR):
多个因至少一个为真,果为真 - 非(NOT):
因为假,果为真
约束关系:
- 互斥(E):
多个因最多一个为真 - 包含(I):
多个因至少一个为真 - 唯一(O):
多个因有且仅有一个为真 - 要求(R):
一个因为真,另一个必为真
步骤:
-
分析需求,识别”因”和”果” -
绘制因果图,标注关系和约束 -
将因果图转换为判定表 -
生成测试用例
4. 实战案例:银行转账(转账成功条件)
需求:银行转账成功的 conditions:
-
因1:余额充足(转账金额 ≤ 余额) -
因2:收款银行在线 -
因3:转账金额在限额内(≤单日限额) -
果1:转账成功 -
果2:转账失败,提示原因
因果图逻辑关系:
转账成功 = 因1 AND 因2 AND 因3
(三个条件同时满足,转账才成功)
转换为判定表:
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
方法六:状态迁移法
1. 是什么(定义)
状态迁移法是通过描述系统状态之间的转换关系(状态→事件→动作→新状态)来设计测试用例的方法,确保覆盖所有状态转换路径。
2. 解决什么问题
解决”有状态的系统,状态转换逻辑复杂,容易遗漏某些转换路径”的问题。特别适合工作流、订单状态、设备状态等场景。
3. 怎么用(步骤要点)
步骤:
-
识别系统所有状态 -
识别触发状态转换的事件 -
绘制状态转换图 -
设计状态转换矩阵(表) -
为每条转换路径设计测试用例
要点:
-
需要覆盖所有可能的状态转换 -
特别关注异常状态转换(如从”已完成”回到”进行中”) -
可以通过状态转换矩阵来系统化设计
4. 实战案例:OTA升级状态流程
需求:OTA升级模块的状态转换。
状态识别:
-
S1:待机(Idle) -
S2:检测到新版本(Detected) -
S3:下载中(Downloading) -
S4:下载完成(Downloaded) -
S5:安装中(Installing) -
S6:升级成功(Success) -
S7:升级失败(Failed)
状态转换表:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
测试用例设计:
-
用例1:待机→检测版本→检测到新版本→用户确认→下载中→下载完成→开始安装→安装中→安装成功→升级成功→重启→待机 -
用例2:下载中→下载失败→升级失败→重试→下载中 -
用例3:安装中→安装失败→升级失败→重试→下载中
方法七:错误推测法
1. 是什么(定义)
错误推测法是基于测试人员的经验、直觉和历史数据,推测系统中可能出错的环节,从而有针对性地设计测试用例的方法。
2. 解决什么问题
解决”系统性方法无法覆盖所有隐性缺陷”的问题。错误推测法能够发现那些违反”常识”但系统未处理的异常场景,是对其他方法的补充。
3. 怎么用(步骤要点)
错误推测的来源:
- 历史Bug清单:
分析过去项目中高频出现的问题 - 同类产品问题:
参考竞品或同类型系统的已知缺陷 - 用户投诉高发场景:
生产环境中用户反馈最多的问题 - 开发人员的薄弱环节:
某些模块或某些类型的错误(如边界处理、并发问题) - 复杂业务逻辑:
那些”看起来就容易出错”的地方
要点:
-
需要经验积累,新手可以多参考老员工的Bug清单 -
不是随意猜测,而是有依据的推测 -
适合作为其他方法的补充,而不是替代
4. 实战案例:电商登录模块(基于经验的错误推测)
基于历史经验和常见问题的错误推测:
|
推测1:密码明文显示问题 历史Bug:某些浏览器或设备上,密码输入框会明文显示。测试用例:在不同浏览器/设备上检查密码是否密文显示。 |
|
推测2:复制粘贴失败 历史Bug:某些安全策略会禁止密码框的复制粘贴,但实现有bug导致无法输入。测试用例:尝试复制粘贴密码,检查是否正常工作。 |
|
推测3:切换输入法后密码丢失 历史Bug:在某些输入法切换时,密码框内容会被清空。测试用例:在输入密码过程中切换输入法,检查密码是否保留。 |
|
推测4:会话超时处理不当 历史Bug:用户登录后长时间不操作,会话超时后再次操作没有得到正确提示。测试用例:登录后等待会话超时,然后尝试操作,检查是否跳转到登录页。 |
|
推测5:并发登录强制下线逻辑错误 历史Bug:某些系统支持单点登录,但强制下线逻辑有bug,导致原用户未被正确踢出。测试用例:同一账号在不同设备登录,检查原会话是否被终止。 |
|
推测6:SQL注入等安全问题 常见问题:登录模块的SQL注入漏洞。测试用例:在用户名/密码框输入SQL注入字符(如’ OR ‘1’=’1),检查是否会被攻击。 |
七种方法横向对比
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
注:难度评级从★到★★★★★,★表示最简单。用例数量取决于具体场景,表中给出的是一般情况下的相对多少。
实战组合案例:电商订单模块
现在,让我们将七种方法串联起来,完整设计一个电商订单模块的测试用例。通过这个案例,你会看到如何在实际项目中组合运用这些方法。
需求描述
电商订单流程:用户提交订单 → 支付 → 发货 → 收货 → 完成
涉及的功能点:订单提交、支付、发货、确认收货、订单完成。
方法一:等价类划分(订单金额输入)
场景:用户提交订单时,输入购买数量。
等价类划分:
-
有效等价类:数量在1-99之间 -
无效等价类1:数量=0 -
无效等价类2:数量<0(负数) -
无效等价类3:数量>99(超过库存或限制) -
无效等价类4:非数字输入
测试用例:
-
用例1:数量=5 → 预期:提交成功 -
用例2:数量=0 → 预期:提示”购买数量必须大于0″ -
用例3:数量=-1 → 预期:提示”购买数量必须大于0″ -
用例4:数量=100 → 预期:提示”购买数量不能超过99″ -
用例5:数量=abc → 预期:提示”请输入有效的数字” -
方法二:边界值分析(支付金额边界)
场景:订单支付金额边界(假设最低支付0.01元,最高50000元)。
边界值:0, 0.01, 0.02, 49999.99, 50000, 50000.01
测试用例:
-
用例1:支付金额=0元 → 预期:支付失败 -
用例2:支付金额=0.01元 → 预期:支付成功 -
用例3:支付金额=50000元 → 预期:支付成功 -
用例4:支付金额=50000.01元 → 预期:支付失败(超限额) -
方法三:场景法(完整订单流程)
基本流(场景1):
用户提交订单 → 支付成功 → 商家发货 → 用户确认收货 → 订单完成
预期结果:订单状态变为”已完成”,交易完成
备选流1(场景2:支付失败):
用户提交订单 → 支付失败(余额不足) → 订单取消
预期结果:订单状态变为”已取消”
备选流2(场景3:退款):
用户提交订单 → 支付成功 → 商家发货 → 用户申请退款 → 退款成功 → 订单关闭
预期结果:订单状态变为”已关闭”,退款到账
方法四:判定表法(订单处理规则)
需求:订单处理规则:
-
如果订单已支付 AND 库存充足 → 可以发货 -
如果订单已支付 AND 库存不足 → 退款 -
如果订单未支付 → 等待支付
判定表(简化):
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
方法五:因果图法(优惠券使用规则)
需求:使用优惠券的条件:
-
因1:订单金额 ≥ 优惠券满减门槛 -
因2:优惠券在有效期内 -
因3:优惠券未被使用 -
果:可以使用优惠券
逻辑关系:可以使用优惠券 = 因1 AND 因2 AND 因3
测试用例:设计8条规则(2^3),覆盖所有条件组合。
方法六:状态迁移法(订单状态转换)
订单状态:待支付 → 已支付 → 发货中 → 已发货 → 已完成/已退款/已取消
状态转换表(部分):
-
待支付 + 用户支付 → 已支付 -
待支付 + 超时未支付 → 已取消 -
已支付 + 商家发货 → 发货中 -
已支付 + 用户退款 → 已退款 -
发货中 + 物流签收 → 已发货 -
已发货 + 用户确认收货 → 已完成
测试用例:为每条状态转换路径设计用例。
方法七:错误推测法(基于经验的推测)
推测可能的问题:
-
并发问题:同一订单同时支付多次 -
幂等性问题:网络超时后重试支付,导致重复扣款 -
库存超卖:高并发下库存扣减不准确 -
状态不一致:支付成功但订单状态未更新 -
退款计算错误:使用优惠券的订单退款金额计算错误
测试用例:针对上述问题设计专项测试用例。
总结:通过组合七种方法,我们可以系统地覆盖电商订单模块的各个测试维度:功能正确性(等价类、边界值、判定表、因果图)、业务流程(场景法、状态迁移法)、以及经验性缺陷(错误推测法)。这种组合运用能够最大化测试覆盖率,提高测试效率。
总结与进阶建议
核心要点回顾
1. 七种方法不是孤立的,组合使用效果最佳
在实际项目中,单一方法往往无法覆盖所有测试需求。组合使用多种方法,才能达到最佳测试效果。
2. 等价类+边界值是基础组合
这两种方法最简单,也最常用。几乎所有输入测试都可以从这两个方法入手。
3. 场景法贯穿始终
无论测试哪个模块,都要从用户场景出发。场景法是连接需求和测试用例的桥梁。
4. 状态迁移适合有状态的对象
订单、工单、流程审批等有明确状态的对象,用状态迁移法最合适。
5. 判定表/因果图适合复杂逻辑
当业务规则涉及多个条件组合时,这两种方法能帮你系统化地覆盖所有逻辑分支。
6. 错误推测法需要经验积累
新手可以多复盘历史Bug,建立自己的”错误模式库”,逐步提升错误推测的准确率。
给新手的进阶建议
第一步:从方法一(等价类划分)入手
这是最简单、最基础的方法。先学会如何科学地分类,这是所有测试方法的基础。
第二步:掌握方法二(边界值分析)
边界值是最容易发现缺陷的方法,性价比极高。学会识别边界,取对边界值。
第三步:学会方法三(场景法)
场景法能帮你建立”用户视角”,这是测试工程师最重要的思维之一。
第四步:挑战方法四和方法五(判定表和因果图)
这两种方法比较抽象,但非常强大。建议找一些复杂的业务规则来练习,比如权限系统、促销规则等。
第五步:掌握方法六(状态迁移法)
当你遇到有状态的系统时,这种方法会非常有用。建议找一个订单系统或工单系统来实践。
第六步:培养方法七(错误推测法)的直觉
这种方法需要经验积累。建议每次测试完成后,复盘一下”我为什么没想到这个缺陷”,逐步建立自己的错误模式库。
