如何编写测试用例
项目测试的流程应该是什么样的?
flowchart TD
A[需求评审] --> B[测试策略制定]
B --> C{测试类型}
C --> D[单元测试]
C --> E[接口测试]
C --> F[UI测试]
C --> G[性能测试]
D & E & F & G --> H[持续集成]
H --> I[缺陷管理]
I --> J[回归测试]
J --> K[质量报告]
K --> L[上线决策]
测试用例的编写是软件测试的核心工作,需要系统化的方法保证完整性和有效性。以下从用例结构、设计方法和实践模式三个维度进行系统阐述:
一、测试用例结构化框架
flowchart TB
start[需求分析] --> define[确定测试目标]
define --> design{选择测试方法}
design --> |功能测试| EQ[等价类划分]
design --> |异常测试| BV[边界值分析]
design --> |流程测试| ST[状态转换法]
design --> |接口测试| CT[组合测试法]
design --> |性能测试| SP[场景分析法]
style define fill:#f9ddff,stroke:#333
style design fill:#cbe4f9,stroke:#333
EQ --> generate[生成用例]
BV --> generate
ST --> generate
CT --> generate
SP --> generate
generate --> validate[验证标准]
validate --> |是| output[输出用例]
validate --> |否| refine[重新设计]
二、用例组成要素
classDiagram
class TestCase {
+String 用例ID
+String 模块路径
+Enum 测试类型
+String 前置条件
+TestStep[] 操作步骤
+String 预期结果
+Enum 优先级
+String 数据准备
+String 关联需求
+String 实际结果
+Attach 附件信息
}
class TestStep {
+int 步骤序号
+String 操作描述
+String 输入数据
+String 检查点
}
TestCase "1" *-- "1..*" TestStep
三、典型用例模板
TC-APP-LOGIN-001
所属模块:用户认证/登录功能
测试类型:功能性测试
前置条件:已注册用户且账号未锁定
步骤 | 操作描述 | 输入数据 | 预期结果 |
---|---|---|---|
1 | 打开登录页面 | - | 显示用户名和密码输入框 |
2 | 输入合法用户名 | [email protected] | 输入框显示明文 |
3 | 输入正确密码 | P@ssw0rd! | 密码显示为密文 |
4 | 点击登录按钮 | - | 跳转至用户仪表盘页面 |
四、进阶用例设计
1. 参数化用例(适用于数据驱动测试)
pie
title 登录失败场景分布
"错误密码" : 38
"无效账号" : 24
"格式错误" : 18
"空输入" : 15
"验证码错误" : 5
2. 状态迁移用例设计
stateDiagram-v2
[*] --> 初始态
初始态 --> 输入态 : 点击输入框
输入态 --> 验证态 : 提交表单
验证态 --> 成功态 : 验证通过
验证态 --> 失败态 : 验证失败
失败态 --> 锁定态 : 连续5次失败
锁定态 --> 初始态 : 超时30分钟
note right of 失败态
对应测试用例:
1. TC-LOGIN-ATTEMPT-004
2. TC-LOGIN-LOCK-001
end note
五、用例编写实践原则
原则分类 | 实施要点 |
---|---|
可追溯性 | 每个用例需关联需求ID,建议使用traceability matrix |
原子性 | 单个用例验证单一功能点,禁止出现”And”型复合条件 |
可自动化性 | 步骤描述需符合机器可读规范(如使用CSS Selector/XPath标识元素) |
异常覆盖 | 确保正向路径与负向路径用例比例达到1:3 |
数据独立性 | 测试数据与用例解耦,单独维护在测试数据池中 |
六、用例管理策略
gantt
title 用例生命周期管理
dateFormat YYYY-MM-DD
section 需求分析
用例设计 :a1, 2024-03-01, 7d
评审完善 :a2, after a1, 3d
section 测试执行
基线化发布 :a3, 2024-03-11, 1d
按需执行 :a4, 2024-03-12, 14d
结果分析 :a5, 2024-03-26, 3d
section 维护优化
失败用例修复 :a6, after a5, 5d
回归验证 :a7, after a6, 5d
版本归档 :a8, after a7, 2d
七、智能用例生成(AI辅助)
graph LR
A[原始需求] --> B{需求解析引擎}
B --> C[功能点拆解]
B --> D[业务规则提取]
C --> E[生成基础用例]
D --> F[生成异常用例]
E --> G[用例优化器]
F --> G
G --> H((完整用例集))
style H fill:#90EE90,stroke:#228B22
建议:
- 对支付功能验证可结合以下维度:
mindmap
root(支付验证)
正常流
余额充足
第三方支付成功
异常流
余额不足
支付超时
重复支付
容错处理
断网恢复续付
支付金额篡改检测
对账异常处理
多条件规则的测试设计
以”跨店满减+店铺券+品类折扣”叠加场景为例:
业务规则描述
- 满减规则: 订单满200减50(可跨店累计)
- 店铺券: 满150减30(限当前店铺商品)
- 品类折扣: 美妆类商品额外9折
- 叠加规则:
- 店铺券与满减可叠加
- 品类折扣优先于其他优惠
- 最终结算金额不低于商品成本价(100元)
测试设计可视化
flowchart TB
A[商品分组] --> B{符合满减条件?}
B -->|是| C[计算满减]
B -->|否| D[跳过满减]
C --> E{使用店铺券?}
D --> E
E -->|是| F[计算店铺券]
E -->|否| G[跳过店铺券]
F --> H{含美妆商品?}
G --> H
H -->|是| I[应用品类折扣]
H -->|否| J[保持原价]
I --> K[校验成本价]
J --> K
K --> L{价格≥100?}
L -->|是| M[确认支付]
L -->|否| N[触发异常]
关键测试用例示例
场景1:完美叠加
测试数据:
- 跨店商品总额:210元(含美妆商品150元)
- 当前店铺商品:80元
- 使用店铺券:是
执行路径:
graph LR
A[满210元] --> B[减50满减]
B --> C[减30店铺券]
C --> D[美妆150元打9折=135元]
D --> E[总金额=135+80-50-30=135]
E --> F[135>100 ✔]
场景2:互斥条件
测试数据:
- 跨店总额:180元(含美妆商品50元)
- 当前店铺商品:20元
- 强制使用店铺券
执行路径:
graph LR
A[总额200元?] --> B{否}
B --> C[无法使用满减]
C --> D[尝试用店铺券]
D --> E{店铺商品不足150}
E --> F[拒绝使用店铺券]
F --> G[总金额=50*0.9+20+130=199]
G --> H[199>100 ✔]
场景3:价格保护
测试数据:
- 美妆商品成本价100元,促销价95元
- 强制应用品类折扣
执行路径:
graph LR
A[95元打9折=85.5] --> B{低于成本价?}
B -->|是| C[触发价格保护]
C --> D[自动恢复为100元]
测试点设计速查表
测试类型 | 测试点示例 | 预期结果 |
---|---|---|
正向流程 | 同时满足满减+店铺券+品类折扣 | 叠加后价格正确 |
边界条件 | 订单总额199/200/201元 | 触发/不触发满减 |
异常场景 | 券后价格<成本价 | 触发价格保护机制 |
互斥验证 | 美妆商品不使用品类折扣 | 仅享受满减+店铺券 |
极端组合 | 10件美妆品+其他店铺商品 | 正确分级计算折扣 |
简化设计步骤
组合优先级:
- 第一优先级:满减触发边界(199/200/201)
- 第二优先级:店铺券与满减的叠加计算
- 第三优先级:品类折扣的特殊处理
必须覆盖的特殊值:
- 商品金额正好等于成本价
- 多优惠叠加后四舍五入
- 优惠券使用顺序错误时容错
用判定表(决策表)能更清晰地展现多条件组合与结果的对应关系。我们基于之前的电商活动案例构建简化判定表:
判定表设计步骤演示(满减+折扣+店铺券)
条件桩定义:
条件名称 | 取值说明 |
---|---|
C1: 订单总金额 | >=200 / <200 |
C2: 使用店铺券 | 是 / 否 |
C3: 含美妆商品 | 是 / 否 |
动作桩定义:
动作名称 | 触发条件 |
---|---|
A1: 应用满减 | C1=True |
A2: 应用店铺券 | C2=True 且店铺商品>=150 |
A3: 应用折扣 | C3=True |
A4: 价格修正 | 结算价<成本价时触发 |
精炼后判定表:
flowchart LR
subgraph 条件组合
C1[总金额>=200]
C2[使用店铺券]
C3[含美妆商品]
end
subgraph 动作结果
A1[满减-50]
A2[店铺券-30]
A3[折扣9折]
A4[价格保护]
end
条件组合 --组合规则--> 动作结果
完整判定矩阵:
用例 | C1 | C2 | C3 | 触发动作 | 金额计算示例 | 测试要点 |
---|---|---|---|---|---|---|
1 | T | T | T | A1+A2+A3->A4 | (300×0.9-50-30)=190 >100 ✔️ | 多重优惠叠加 |
2 | T | T | F | A1+A2 | (250-50-30)=170 ✔️ | 跨品类组合 |
3 | T | F | T | A1+A3 | (220×0.9-50)=148 >100 ✔️ | 仅基础优惠 |
4 | T | F | F | A1 | (200-50)=150 ✔️ | 最低满减条件 |
5 | F | T | T | A2(+检查失败→A3) | (180×0.9)=162,券不可用 ❌→162 ✔️ | 店铺券使用限制 |
6 | F | F | T | A3 | (150×0.9)=135 ✔️ | 纯品类优惠 |
7 | F | F | F | 无优惠 | 原价支付 | 无优惠场景 |
8 | T | T | T | (极端值)A1+A2+A3触发A4 | (120×0.9-50-30)=88 →修正为100 ✔️ | 价格保护机制 |
精减后的核心测试用例:
用例 | 名称 | 验证重点 | 预期结果 |
---|---|---|---|
T1 | 三重优惠叠加 | 检查满减+店铺券+折扣计算顺序 | 最终价=原价×0.9-50-30 |
T2 | 临界满减200 | 验证满减触发边界 | 200→150,199→原价 |
T3 | 无效券使用 | 店铺商品<150时强制用券 | 提示”不符合用券条件” |
T4 | 价格保护触发 | 优惠后95→打折后85.5→触发保护 | 自动修正为100元 |
T5 | 纯美妆订单 | 仅应用品类折扣 | 原价×90% |
异常场景补充:
stateDiagram-v2
[*] --> 正常流程
正常流程 --> 异常1 : 重复叠加优惠券
正常流程 --> 异常2 : 优惠后负金额
异常1 --> 处理1 : 报错"优惠不可重复使用"
异常2 --> 处理2 : 修正为成本价100元
处理1 --> [*]
处理2 --> [*]
用例执行
一、执行流程标准化(流程图)
flowchart TD
A[执行准备] --> B[环境检查]
B --> C{环境正常?}
C -->|是| D[按优先级执行用例]
C -->|否| E[终止并报障]
D --> F[详细记录结果]
F --> G{发现缺陷?}
G -->|是| H[提交缺陷报告]
G -->|否| I[标记用例状态]
H --> J[跟踪缺陷修复]
J --> K[回归测试]
I --> L[生成报告]
K --> L
二、关键环节规范说明
必须文档化:
- 环境信息表(含数据库/IP/账户)
- 数据准备清单(测试账号+测试订单ID示例)
- 紧急回滚方案(遇到严重问题时的处置流程)
2. 执行过程控制
stateDiagram-v2
用例状态 --> 未执行
未执行 --> 执行中: 开始测试
执行中 --> 通过: 结果符合预期
执行中 --> 失败: 结果不符
执行中 --> 阻塞: 环境问题
失败 --> 已修复: 开发修复
已修复 --> 待验证
阻塞 --> 待处理
执行记录表示例:
用例ID | 执行人 | 执行时间 | 实际结果 | 附件证据 | 状态 | 关联缺陷ID |
---|---|---|---|---|---|---|
TC_101 | 张三 | 2023-08-01 | 错误提示”优惠码过期” | 截图 | 失败 | BUG_0045 |
TC_102 | 李四 | 2023-08-01 | 成功减价50元 | 无 | 通过 | / |
3. 缺陷管理规范
sequenceDiagram
测试人员->>缺陷系统: 提交新建缺陷
缺陷系统->>开发人员: 自动分配责任人
开发人员->>缺陷系统: 标记"修复中"
开发人员->>缺陷系统: 标记"已修复"
测试人员->>缺陷系统: 执行验证
alt 验证通过
测试人员->>缺陷系统: 关闭缺陷
else 验证失败
测试人员->>缺陷系统: 重新激活缺陷
end
优质缺陷报告要素:
mindmap
root((缺陷报告))
必填项
标题
严重等级
复现步骤
预期结果
实际结果
增强项
环境信息
日志片段
网络抓包
前后端版本
关联测试用例
三、执行效率技巧
1. 智能执行策略
gantt
title 测试执行排期优化
dateFormat YYYY-MM-DD
section 核心路径
冒烟测试 :done, des1, 2023-08-01, 1d
关键功能验证 :active, des2, 2023-08-02, 2d
section 次要路径
兼容性测试 : des3, 2023-08-04, 3d
异常场景覆盖 : des4, 2023-08-07, 2d
2. 证据留存标准
graph LR
基本证据 --> 截图
基本证据 --> 日志
进阶证据 --> 视频录制
进阶证据 --> 接口响应
特殊证据 --> 数据库快照
特殊证据 --> 网络抓包
四、执行后闭环动作
质量分析报告
xychart-beta
title "执行结果分布"
x-axis ["通过", "失败", "阻塞"]
y-axis "数量" 0 --> 40
bar [35, 8, 2]
缺陷跟踪流程
一、核心流程框架(状态机视图)
stateDiagram-v2
[*] --> 新建 : 测试提Bug
新建 --> 已确认 : 开发初审
已确认 --> 已分配 : 指定责任人
已分配 --> 修复中 : 开始编码
修复中 --> 已修复 : 提交代码
已修复 --> 已验证 : 测试验证
已验证 --> 已关闭 : 确认通过
已验证 --> 重新打开 : 验证失败
已关闭 --> 重新打开 : 复现问题
新建 --> 驳回 : 无效报告
已分配 --> 挂起 : 暂不处理
挂起 --> 已分配 : 恢复处理
二、分阶段规范说明
1. 提交阶段
mindmap
root((缺陷提交))
必填字段
标题
严重等级
优先级
复现步骤
预期结果
实际结果
增强信息
环境快照
错误日志
测试数据
关联用例
重现频率
示例提交规范:
flowchart LR
低优先级 --1天内响应--> 开发
中优先级 --4小时内响应--> 开发主管
高优先级 --立即响应--> 技术总监
2. 分析分配
sequenceDiagram
测试人员->>缺陷系统: 提交缺陷
缺陷系统->>开发主管: 提醒邮件
开发主管->>缺陷系统: 指派责任人
开发主管->>测试人员: 询问补充信息
测试人员->>缺陷系统: 更新详情
3. 修复阶段
gantt
title 缺陷修复时间线
dateFormat YYYY-MM-DD
section 严重缺陷
需求理解 :done, des1, 2023-08-01, 1d
代码修改 :active, des2, 2023-08-02, 2d
unit test : des3, after des2, 1d
section 普通缺陷
代码调整 : des4, 2023-08-03, 3d
4. 验证阶段
pie
title 验证失败原因
"修复不完整" : 45
"引入新缺陷" : 30
"环境差异" : 15
"误判问题" : 10
三、关键控制机制
graph TD
deploy[版本发布] --> check{致命缺陷=0?}
check -->|是| next1{严重缺陷≤2?}
check -->|否| stop1[禁止发布]
next1 -->|是| next2{普通缺陷≤5?}
next1 -->|否| stop2[需审批]
next2 -->|是| pass[允许发布]
next2 -->|否| stop3[走加急流程]
四、特殊场景处理
1. 争议处理流程
sequenceDiagram
测试->>产品: 争议提审
产品->>三方会议: 召集会议
三方会议->>结论: 判断是否缺陷
结论->>缺陷系统: 更新状态
2. 暂挂缺陷管理
erDiagram
DEFECT ||--o{ HOLD_REASON : has
DEFECT {
string id
string title
date hold_date
}
HOLD_REASON {
string defect_id
enum reason_type
string description
}
五、持续改进
1. 根因分析
graph TD
现象 --> 直接原因
直接原因 --> 系统原因
系统原因 --> 流程缺陷
流程缺陷 --> 管理改进
2. 知识沉淀
gitGraph
commit id: "典型缺陷入库"
commit id: "编写避坑指南"
branch fix-process
commit id: "优化验证脚本"
checkout main
merge fix-process
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 听故事的人!