Files
gerenjizhang/TEST_CASES.md
T

156 lines
9.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 个人理财系统 - 测试用例
> 本文档定义个人理财系统的测试用例,覆盖前后端各类型接口
---
## 1. 用户接口测试 (/api/users)
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| USR-001 | 创建用户-正常 | POST | `{name: "张三", email: "zhangsan@example.com"}` | 创建成功,返回用户ID |
| USR-002 | 创建用户-缺少name | POST | `{email: "test@example.com"}` | 返回400,提示name为必填 |
| USR-003 | 创建用户-缺少email | POST | `{name: "李四"}` | 返回400,提示email为必填 |
| USR-004 | 创建用户-邮箱重复 | POST | `{name: "王五", email: "test@example.com"}` | 返回400,提示邮箱已被注册 |
| USR-005 | 获取用户列表 | GET | 无 | 返回所有用户数组 |
---
## 2. 账户接口测试 (/api/accounts)
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| ACC-001 | 创建账户-正常 | POST | `{userId:1, name:"支付宝", type:"payment", balance:1000}` | 创建成功,返回账户ID |
| ACC-002 | 创建账户-缺少userId | POST | `{name:"微信", type:"payment"}` | 返回400,提示userId为必填 |
| ACC-003 | 创建账户-缺少必填字段 | POST | `{userId:1, name:"微信"}` | 返回400,提示type为必填 |
| ACC-004 | 创建账户-默认余额 | POST | `{userId:1, name:"现金", type:"cash"}` | 余额默认为0 |
| ACC-005 | 获取账户列表 | GET | `?userId=1` | 返回该用户所有账户 |
| ACC-006 | 获取单个账户 | GET | `/api/accounts/1` | 返回账户详情 |
| ACC-007 | 获取不存在的账户 | GET | `/api/accounts/999` | 返回404,账户不存在 |
| ACC-008 | 更新账户 | PUT | `/api/accounts/1` + `{name:"支付宝(已更新)", balance:2000}` | 更新成功 |
| ACC-009 | 删除账户 | DELETE | `/api/accounts/1` | 删除成功 |
---
## 3. 交易记录接口测试 (/api/records)
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| REC-001 | 创建收入记录-正常 | POST | `{userId:1, accountId:1, type:"income", amount:5000, category:"工资", description:"月薪"}` | 创建成功,账户余额增加 |
| REC-002 | 创建支出记录-正常 | POST | `{userId:1, accountId:1, type:"expense", amount:100, category:"餐饮", description:"午饭"}` | 创建成功,账户余额减少 |
| REC-003 | 创建记录-缺少必填字段 | POST | `{userId:1, amount:100}` | 返回400,提示必填字段缺失 |
| REC-004 | 创建记录-金额为0 | POST | `{userId:1, accountId:1, type:"expense", amount:0, category:"餐饮"}` | 返回400,金额必须大于0 |
| REC-005 | 创建记录-金额为负 | POST | `{userId:1, accountId:1, type:"expense", amount:-100, category:"餐饮"}` | 返回400,金额必须大于0 |
| REC-006 | 创建记录-日期格式YYYY-MM-DD | POST | `{userId:1, accountId:1, type:"income", amount:100, category:"奖金", date:"2026-04-25"}` | 日期按本地时区正确解析 |
| REC-007 | 创建记录-日期包含时间 | POST | `{userId:1, accountId:1, type:"income", amount:100, category:"奖金", date:"2026-04-25T10:30:00"}` | 日期正确解析 |
| REC-008 | 获取记录列表-按用户 | GET | `?userId=1` | 返回该用户所有记录,按时间倒序 |
| REC-009 | 获取记录列表-按账户 | GET | `?userId=1&accountId=1` | 返回该账户所有记录 |
| REC-010 | 获取记录列表-按类型 | GET | `?userId=1&type=expense` | 返回所有支出记录 |
| REC-011 | 获取记录列表-按分类 | GET | `?userId=1&category=餐饮` | 返回餐饮分类记录 |
| REC-012 | 获取记录列表-日期范围 | GET | `?userId=1&startDate=2026-04-01&endDate=2026-04-30` | 返回日期范围内的记录 |
| REC-013 | 更新记录-修改金额 | PUT | `/api/records/1` + `{amount:200}` | 记录更新,余额正确调整 |
| REC-014 | 更新记录-修改类型 | PUT | `/api/records/1` + `{type:"expense"}` | 类型更新,余额正确调整 |
| REC-015 | 删除记录 | DELETE | `/api/records/1` | 删除成功,账户余额恢复 |
| REC-016 | 删除不存在的记录 | DELETE | `/api/records/999` | 返回404 |
---
## 4. 预算接口测试 (/api/budgets)
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| BUD-001 | 创建预算-正常 | POST | `{userId:1, category:"餐饮", amount:1500, month:"2026-04"}` | 创建成功,返回预算ID |
| BUD-002 | 创建预算-缺少必填字段 | POST | `{userId:1, category:"餐饮"}` | 返回400,提示必填字段缺失 |
| BUD-003 | 创建预算-缺少月份 | POST | `{userId:1, category:"餐饮", amount:1000}` | 返回400,提示month为必填 |
| BUD-004 | 创建预算-同分类同月份 | POST | `{userId:1, category:"餐饮", amount:2000, month:"2026-04"}` | 可创建(未做唯一约束) |
| BUD-005 | 获取预算列表-按用户 | GET | `?userId=1` | 返回该用户所有预算 |
| BUD-006 | 获取预算列表-按月份 | GET | `?userId=1&month=2026-04` | 返回该月份预算 |
| BUD-007 | 获取单个预算 | GET | `/api/budgets/1` | 返回预算详情 |
| BUD-008 | 更新预算 | PUT | `/api/budgets/1` + `{amount:2000}` | 更新成功 |
| BUD-009 | 删除预算 | DELETE | `/api/budgets/1` | 删除成功 |
---
## 5. 统计接口测试 (/api/statistics)
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| STA-001 | 月度统计-正常 | GET | `?userId=1&month=2026-04` | 返回totalIncome、totalExpense、categoryStats |
| STA-002 | 月度统计-缺少userId | GET | `?month=2026-04` | 返回400,提示userId为必填 |
| STA-003 | 月度统计-缺少month | GET | `?userId=1` | 返回400,提示month为必填 |
| STA-004 | 月度统计-无数据月份 | GET | `?userId=1&month=2025-01` | 返回0统计 |
| STA-005 | 月度统计-支出分类聚合 | GET | `?userId=1&month=2026-04` | categoryStats正确聚合各分类支出 |
| STA-006 | 趋势统计-正常 | GET | `?userId=1` | 返回按日期聚合的每日收支数组 |
| STA-007 | 趋势统计-按日期范围 | GET | `?userId=1&startDate=2026-04-01&endDate=2026-04-30` | 返回日期范围内的趋势 |
| STA-008 | 趋势统计-缺少userId | GET | 无userId参数 | 返回400 |
---
## 6. 仪表盘接口测试 (/api/dashboard)
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| DASH-001 | 仪表盘汇总-正常 | GET | `?userId=1` | 返回totalBalance、monthIncome、monthExpense、budgetUsage |
| DASH-002 | 仪表盘汇总-缺少userId | GET | 无userId | 返回400 |
| DASH-003 | 仪表盘汇总-无账户用户 | GET | `?userId=999` | 返回空账户、零值统计 |
| DASH-004 | 仪表盘汇总-预算使用率 | GET | `?userId=1` | budgetUsage包含percentage字段 |
| DASH-005 | 仪表盘汇总-跨月份计算 | GET | `?userId=1` | 仅计算当月数据 |
---
## 7. 健康检查与系统接口
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| SYS-001 | 健康检查 | GET | `/health` | 返回200success:true |
| SYS-002 | API信息 | GET | `/api` | 返回版本号信息 |
| SYS-003 | 初始化测试数据-首次 | GET | `/api/init-test-data` | 创建完整的测试数据 |
| SYS-004 | 初始化测试数据-已有数据 | GET | `/api/init-test-data` | 返回已有数据提示,无需重复初始化 |
---
## 8. 边界值与异常测试
| 编号 | 测试用例 | 请求方式 | 测试数据 | 预期结果 |
|------|---------|---------|---------|---------|
| EDGE-001 | 账户余额-超大金额 | POST | `{userId:1, accountId:1, type:"income", amount:999999999, category:"工资"}` | 支持大金额 |
| EDGE-002 | 记录描述-特殊字符 | POST | `{userId:1, accountId:1, type:"expense", amount:10, category:"餐饮", description:"咖啡&蛋糕"}` | 正确保存 |
| EDGE-003 | 记录描述-中文 | POST | `{userId:1, accountId:1, type:"expense", amount:50, category:"餐饮", description:"重庆小面"}` | 正确保存中文 |
| EDGE-004 | 日期边界-月初 | POST | `{..., date:"2026-04-01"}` | 正确解析 |
| EDGE-005 | 日期边界-月末 | POST | `{..., date:"2026-04-30"}` | 正确解析 |
| EDGE-006 | 并发创建记录 | POST x10 | 相同账户连续创建10笔 | 余额正确累加/扣除 |
| EDGE-007 | 账户余额-精度 | POST | `{userId:1, accountId:1, type:"income", amount:0.01, category:"其他"}` | 支持分精度 |
---
## 9. 前后端集成测试
| 编号 | 测试场景 | 测试步骤 | 预期结果 |
|------|---------|---------|---------|
| INT-001 | 创建账单完整流程 | 1.创建账户 → 2.创建收入 → 3.创建支出 → 4.查看仪表盘 | 仪表盘数据与操作一致 |
| INT-002 | 更新后数据一致性 | 1.创建记录 → 2.更新金额 → 3.检查账户余额 | 余额正确反映更新 |
| INT-003 | 删除后数据一致性 | 1.创建记录 → 2.删除记录 → 3.检查账户余额 | 余额恢复到原始值 |
| INT-004 | 预算超额提醒 | 1.创建预算100 → 2.创建支出200 → 3.查看仪表盘budgetUsage | percentage显示100以上 |
| INT-005 | 统计准确性 | 1.创建多种类型记录 → 2.查看月度统计 → 3.验证分类聚合 | 统计结果与实际一致 |
---
## 10. 自动化测试命令
```bash
# 启动后端服务
cd personal-finance-budget-system/backend
npm run dev
# 运行 API 测试
node test-api.js
# 运行单元测试(需配置)
npm test
```
---
**文档版本**: v1.0.0
**更新日期**: 2026-04-26