软件测试面试的解题框架:如何把一道题拆出 10 个测试点
测试面试中有一类经典题:「请设计一下 XXX 的测试用例」。测登录页、测购物车、测一个搜索框、测微信发红包……
大多数人想到什么说什么,东一榔头西一棒槌。面试官看到的是:思路零散、没有方法论、考虑不周全。
问题不在「你知道多少」,而在你没有一套拆解框架。本文给你一套我自用的六步解题法。
框架总览:六步解题法
1. 明确范围 → 2. 功能分解 → 3. 数据设计 → 4. 异常&边界
↓
5. 非功能维度 → 6. 回归关联
拿到题目后,按这六个步骤走,既能展示思维结构化,又不容易遗漏。
Step 1:明确范围 —— 先问边界,再做设计
面试官说「测一个登录页」,并不意味着你能开始列用例。
应该先用 30 秒反问澄清。问什么?我总结为 3W 原则:
| W | 问什么 | 示例 |
|---|---|---|
| Who | 用户是谁?角色有哪些? | 普通用户 vs 管理员 vs 未注册访客 |
| What | 功能范围是什么? | 只有账密登录,还是含手机验证码/扫码/SSO? |
| Where | 在什么环境? | Web 端?App 端?H5?小程序? |
示例话术:
「在开始设计用例之前,我想先确认几个前提。这个登录页面向哪些用户角色?支持的登录方式有哪些?是在什么终端上使用?有没有第三方登录集成?」
这一步本身就是加分项——不急着解题,先界定问题边界,说明你具备测试规划的意识。
Step 2:功能分解 —— 把大功能拆成可验证的小单元
拿到范围后,用「输入 → 处理 → 输出」的模型拆解。
以「手机验证码登录」为例:
输入层:
├── 手机号输入框 → 格式校验、长度限制
├── 验证码按钮 → 点击行为、倒计时、重发
├── 验证码输入框 → 位数限制、过期、错误
└── 登录按钮 → 可点击条件、loading 态
处理层:
├── 发送验证码 → 接口调用、频率限制、无效手机号
├── 校验验证码 → 正确/错误/过期/已使用
└── 登录态生成 → token 存储、会话超时
输出层:
├── 成功 → 跳转页面、记住登录、欢迎提示
├── 失败 → 错误提示、重试次数、账号锁定
└── 异常 → 网络断开、服务超时、验证码服务宕机
把你的思路在面试中讲出来:
「我把登录拆成三层来看:输入层测 UI 交互和前端校验,处理层测接口逻辑和异常处理,输出层测成功和失败的各种反馈。每层我再展开讲具体的点……」
面试官听到这个结构,心里已经在打勾了。
Step 3:数据设计 —— 告诉面试官你知道「测什么数据比测什么功能更重要」
这一步最容易被忽略,也最容易出彩。
账号状态维度:
| 状态 | 测试重点 |
|---|---|
| 正常用户 | 基准流程 |
| 未注册用户 | 提示注册 / 自动注册 |
| 密码错误 N-1 次 | 第 N 次是否锁定 |
| 账号已锁定 | 是否提示解锁方式 |
| 账号已注销 | 登录行为如何处理 |
| 同时在多个设备登录 | 互踢逻辑、会话管理 |
| 异地 / 新设备登录 | 是否需要二次验证 |
验证码数据维度:
| 数据场景 | 测试点 |
|---|---|
| 正确验证码 | 正常登录 |
| 错误验证码 | 提示错误 + 允许重试 |
| 过期验证码 | 提示过期 + 引导重新获取 |
| 已使用过的验证码 | 一次性生效 |
| 60s 内重复获取 | 倒计时机制 + 频率限制 |
| 换手机号重新获取 | 旧验证码失效 |
💡 面试中讲出「账号状态维度」这四个字,就已经超过 80% 的候选人了。
Step 4:异常 & 边界 —— 区分「功能没做」和「系统容错」
面试官爱问:「你觉得哪些边界情况需要关注?」很多人回答「输入 11 位手机号」「密码至少 6 位」就停了。
我用一个 三层异常模型:
L1 — 用户操作异常(人为输入错误)
├── 空格、特殊字符、emoji
├── 粘贴超长文本
├── 快速连续点击发送验证码
└── 切后台再回来(验证码倒计时是否继续)
L2 — 系统状态异常(环境条件变化)
├── 网络断开 → 恢复 → 重试机制
├── 切换 WiFi / 4G 时发送请求
├── 服务端返回 500 / 502 / 504
└── 验证码服务独立宕机
L3 — 并发 / 时序异常(多个操作交错)
├── 验证码未返回时点击登录
├── 发送验证码时切换手机号
├── 登录中杀进程重启 App
└── 在 A 页面发送验证码,去 B 页面输入
话术:
「我把异常分成三层:用户操作异常、系统状态异常、并发生时序异常。每层我举两个例子——比如用户快速连点发送验证码、或者验证码还没返回就点了登录……」
Step 5:非功能维度 —— 结尾的「保底分」
功能用例列完了,面试官大概率会问「还有其他要考虑的吗」。这是给你留的加分题。
| 维度 | 切入点 |
|---|---|
| 安全 | 密码是否明文传输、验证码有无频率限制、登录失败超过 N 次是否锁定、session 有效期、是否防 SQL 注入 / XSS、密码是否 log 到日志里 |
| 性能 | 登录接口的 P99 延迟、验证码下发耗时、高并发下短信成本是否可控 |
| 兼容性 | 不同浏览器、不同手机系统版本、不同屏幕分辨率下的 UI 表现 |
| 用户体验 | 键盘弹起时输入框是否被遮挡、密码可切换明文/密文、loading 态是否有反馈、报错信息是否清晰可理解 |
| 国际化 | 海外手机号、不同时区、多语言错误提示 |
💡 不需要每个维度都长篇大论,但要说出一两个具体的,证明你考虑过。
Step 6:回归关联 —— 展示全局视野
最后一个加分动作:告诉面试官你还会关注哪些关联模块。
「除了登录页本身,我还会关注:记住密码功能是否影响后续登录、登录后 token 是否在请求头正确传递、退出登录后 token 是否失效、修改密码后已登录的会话是否被踢出、以及新用户首次登录是否被正确引导到引导页。」
这一步的意义:展示你不是一个「只能测被分配的那个页面」的执行者,而是能从系统层面思考模块间依赖的测试工程师。
完整演示:用这套框架回答「测微信发红包」
面试官:请设计一下微信发红包的测试用例。
Step 1 — 明确范围:
我确认一下:是「发红包」还是「收发红包的全流程」?是普通红包还是包含拼手气红包?只测微信客户端还是包含支付系统?
Step 2 — 功能分解:
我把发红包拆成:选择金额类型(普通/拼手气)→ 填写金额和个数 → 输入支付密码 → 红包生成并发送到聊天 → 对方领取。每个环节我展开讲用例。
Step 3 — 数据设计:
| 数据维度 | 测试值 |
|---|---|
| 金额边界 | 0.00(拒绝)、0.01(最小)、200.00(单包上限)、200.01(拒绝)、20000.00(单日上限) |
| 个数边界 | 0(拒绝)、1(最小)、100(单次上限)、101(拒绝) |
| 金额个数交叉 | 0.01 元 × 100 个 = 1 元(恰好够分) |
| 余额校验 | 余额 199,发 200(拒绝)、余额 200,发 200(允许,发完余额归零) |
| 拼手气 | 总金额能否被人数整除、所有人金额总和是否等于总金额、是否有 0.00 出现 |
Step 4 — 异常:
支付密码错误、指纹/面容识别失败、发红包过程中网络断开、对方在领取前删除聊天记录、红包 24 小时过期退款。(如果再细化:并发——同一红包被多人同时抢时的金额一致性)
Step 5 — 非功能:
安全性:支付密码的加密传输、防止红包金额被中间人篡改。性能:除夕夜高并发下红包生成延迟。体验:发红包后的动效和音效。
Step 6 — 回归关联:
红包退款后钱包余额是否恢复、群红包的领取记录是否准确、删除好友后未领取的红包是否退款、红包记录在账单中是否可追溯。
面试前一天的复习清单
| 你要会的东西 | 准备到能脱口而出的程度 |
|---|---|
| 一篇「测登录页」的标准回答 | 按六步法口述一遍,计时 5 分钟 |
| 等价类 + 边界值的 2 个案例 | 比如邮箱验证、优惠券满减 |
| 一个状态迁移图 | 订单状态机 or 登录会话状态 |
| 一个判定表 | 审批规则 or 登录条件组合 |
| 一个正交实验案例 | 报表筛选 or 配置项组合 |
| 「安全方面你会关注什么」 | 准备 3 个点:XSS/SQL注入/加密传输 |
| 「你怎么保证覆盖充分」 | 等价类缩减冗余 + 边界值捉边缘 + 状态图防遗漏 |
这套框架来自前两篇文章的知识积累,真正面试时按顺序走一遍,你的回答会比其他候选人结构清晰不止一个档次。
三篇文章构成了一个完整的测试知识体系,配合食用效果最佳: