# 个人理财系统 - 测试用例 > 本文档定义个人理财系统的测试用例,覆盖前后端各类型接口 --- ## 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` | 返回200,success: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