12 KiB
12 KiB
团课预约场景测试数据文档
概述
本文档描述了团课预约功能的测试数据,覆盖了各种预约场景,用于验证系统在不同业务条件下的正确性和健壮性。
一、测试数据概览
| 数据类别 | 数量 | 说明 |
|---|---|---|
| 测试会员 | 5个 | 覆盖不同会员卡状态 |
| 会员卡类型 | 8种 | 次卡/时长卡/储值卡 |
| 会员卡记录 | 5条 | 会员持有的实际卡 |
| 团课预约记录 | 4条 | 不同状态的预约 |
| 交易流水 | 27条 | 完整的消费记录 |
二、会员测试数据
2.1 会员列表
| 会员ID | 会员编号 | 昵称 | 手机号 | 性别 | 会员卡状态 |
|---|---|---|---|---|---|
| 1001 | MEM202606001 | 新用户小张 | 13800138001 | 男 | 无会员卡 |
| 1002 | MEM202606002 | 额度耗尽用户 | 13800138002 | 女 | 次卡已用完 |
| 1003 | MEM202606003 | 额度充足用户 | 13800138003 | 男 | 次卡剩余8次 |
| 1004 | MEM202606004 | 过期卡用户 | 13800138004 | 女 | 月卡已过期 |
| 1005 | MEM202606005 | 多卡用户小李 | 13800138005 | 男 | 次卡+储值卡 |
2.2 会员详情
会员1001 - 新用户小张
- 状态:新注册用户,尚未购买任何会员卡
- 用途:测试无会员卡情况下的预约行为
会员1002 - 额度耗尽用户
- 状态:持有10次团课卡,已全部用完
- 用途:测试会员卡额度耗尽时的预约行为
会员1003 - 额度充足用户
- 状态:持有20次团课卡,剩余8次
- 用途:测试正常预约流程
会员1004 - 过期卡用户
- 状态:持有月卡,已于2026-05-31过期
- 用途:测试过期会员卡的预约行为
会员1005 - 多卡用户小李
- 状态:持有50次团课卡(剩余45次) + 500元储值卡(剩余350元)
- 用途:测试多会员卡用户选择支付方式的场景
三、会员卡类型数据
3.1 次卡类型
| 卡类型ID | 卡名称 | 类型 | 价格 | 有效天数 | 总次数 | 状态 |
|---|---|---|---|---|---|---|
| 101 | 10次团课卡 | COUNT_CARD | 299.00 | 90 | 10 | 上架 |
| 102 | 20次团课卡 | COUNT_CARD | 499.00 | 180 | 20 | 上架 |
| 103 | 50次团课卡 | COUNT_CARD | 999.00 | 365 | 50 | 上架 |
3.2 时长卡类型
| 卡类型ID | 卡名称 | 类型 | 价格 | 有效天数 | 状态 |
|---|---|---|---|---|---|
| 201 | 月卡 | TIME_CARD | 399.00 | 30 | 上架 |
| 202 | 季卡 | TIME_CARD | 899.00 | 90 | 上架 |
| 203 | 年卡 | TIME_CARD | 2999.00 | 365 | 上架 |
3.3 储值卡类型
| 卡类型ID | 卡名称 | 类型 | 价格 | 面额 | 有效天数 | 状态 |
|---|---|---|---|---|---|---|
| 301 | 500元储值卡 | STORED_VALUE_CARD | 500.00 | 500.00 | 365 | 上架 |
| 302 | 1000元储值卡 | STORED_VALUE_CARD | 1000.00 | 1000.00 | 365 | 上架 |
四、会员卡记录数据(会员持有的卡)
| 记录ID | 会员ID | 卡类型ID | 状态 | 剩余次数 | 剩余金额 | 到期时间 | 购买时间 |
|---|---|---|---|---|---|---|---|
| 2001 | 1002 | 101 | USED_UP | 0 | 0.00 | 2026-09-01 | 2026-06-01 |
| 2002 | 1003 | 102 | ACTIVE | 8 | 0.00 | 2026-12-01 | 2026-06-01 |
| 2003 | 1004 | 201 | EXPIRED | 0 | 0.00 | 2026-05-31 | 2026-05-01 |
| 2004 | 1005 | 103 | ACTIVE | 45 | 0.00 | 2027-06-01 | 2026-06-01 |
| 2005 | 1005 | 301 | ACTIVE | 0 | 350.00 | 2027-06-01 | 2026-05-15 |
五、团课预约记录数据
| 预约ID | 课程ID | 会员ID | 会员卡记录ID | 预约时间 | 状态 | 课程名称 |
|---|---|---|---|---|---|---|
| 3001 | 1 | 1003 | 2002 | 2026-06-01 15:30 | 已预约(0) | 极速燃脂单车 |
| 3002 | 2 | 1003 | 2002 | 2026-06-01 10:00 | 已取消(1) | 清晨流瑜伽 |
| 3003 | 6 | 1003 | 2002 | 2026-05-28 19:00 | 已出席(2) | 蜜桃臀塑造 |
| 3004 | 7 | 1002 | 2001 | 2026-05-30 10:00 | 缺席(3) | 午间冥想放松 |
状态说明
| 状态码 | 状态名称 | 说明 |
|---|---|---|
| 0 | 已预约 | 用户已成功预约,等待上课 |
| 1 | 已取消 | 用户主动取消预约 |
| 2 | 已出席 | 用户已按时参加课程 |
| 3 | 缺席 | 用户预约后未出席 |
六、测试场景详解
场景1:新注册用户无会员卡预约
测试目标:验证系统对无会员卡用户的预约拦截
测试数据:
- 用户ID:1001(新用户小张)
- 目标课程:任意课程
预期结果:
- 返回错误信息:"未绑定会员卡,请先购买会员卡"
- HTTP状态码:400 Bad Request
场景2:会员卡额度耗尽预约
测试目标:验证系统对额度耗尽会员卡的预约拦截
测试数据:
- 用户ID:1002(额度耗尽用户)
- 会员卡记录ID:2001
- 剩余次数:0
预期结果:
- 返回错误信息:"会员卡余额不足"
- HTTP状态码:400 Bad Request
场景3:会员卡额度充足预约
测试目标:验证正常预约流程
测试数据:
- 用户ID:1003(额度充足用户)
- 会员卡记录ID:2002
- 剩余次数:8
- 目标课程:课程ID=1(极速燃脂单车)
预期结果:
- 预约成功
- 会员卡剩余次数减1(变为7次)
- 生成预约记录
- HTTP状态码:200 OK
场景4:会员卡已过期预约
测试目标:验证系统对过期会员卡的预约拦截
测试数据:
- 用户ID:1004(过期卡用户)
- 会员卡记录ID:2003
- 状态:EXPIRED
- 到期时间:2026-05-31
预期结果:
- 返回错误信息:"会员卡已过期"
- HTTP状态码:400 Bad Request
场景5:课程已满员预约---------------
测试目标:验证系统对满员课程的预约拦截
测试数据:
- 课程ID:3(燃脂搏击)
- 当前人数:20/20
预期结果:
- 返回错误信息:"课程已满员"
- HTTP状态码:400 Bad Request
场景6:课程已取消预约
测试目标:验证系统对已取消课程的预约拦截
测试数据:
- 课程ID:5(周末冥想修复)
- 状态:1(已取消)
预期结果:
- 返回错误信息:"课程已取消"
- HTTP状态码:400 Bad Request
场景7:课程已结束预约
测试目标:验证系统对已结束课程的预约拦截
测试数据:
- 课程ID:6(蜜桃臀塑造)或 7(午间冥想放松)
- 状态:2(已结束)
预期结果:
- 返回错误信息:"课程已结束"
- HTTP状态码:400 Bad Request
场景8:超出预约时间预约
测试目标:验证系统对预约时间窗口的控制
测试数据:
- 课程ID:4(哈他瑜伽)
- 开始时间:2026-06-01 15:20:00
- 测试时间:课程开始前30分钟内
预期结果:
- 返回错误信息:"已过预约时间"
- HTTP状态码:400 Bad Request
场景9:重复预约同一课程
测试目标:验证系统对重复预约的拦截
测试数据:
- 用户ID:1003(额度充足用户)
- 课程ID:1(极速燃脂单车)
- 已有预约记录:booking_id=3001
预期结果:
- 返回错误信息:"已预约该课程"
- HTTP状态码:400 Bad Request
场景10:多会员卡用户选择支付方式
测试目标:验证多卡用户的支付方式选择功能
测试数据:
- 用户ID:1005(多卡用户小李)
- 可用卡1:次卡(记录ID=2004,剩余45次)
- 可用卡2:储值卡(记录ID=2005,剩余350元)
预期结果:
- 系统列出用户所有可用会员卡
- 用户可选择使用次卡或储值卡支付
- 根据选择的卡类型扣减相应额度
七、交易流水说明
7.1 会员1002(额度耗尽用户)消费记录
| 操作顺序 | 操作类型 | 变动次数 | 剩余次数 | 备注 |
|---|---|---|---|---|
| 1 | PURCHASE | +10 | 10 | 购买10次团课卡 |
| 2-11 | DEDUCT | -1×10 | 0 | 10次课程消费 |
7.2 会员1003(额度充足用户)消费记录
| 操作顺序 | 操作类型 | 变动次数 | 剩余次数 | 备注 |
|---|---|---|---|---|
| 1 | PURCHASE | +20 | 20 | 购买20次团课卡 |
| 2-12 | DEDUCT | -12 | 8 | 12次课程消费 |
7.3 会员1005(多卡用户)消费记录
| 会员卡记录ID | 操作类型 | 变动次数 | 变动金额 | 备注 |
|---|---|---|---|---|
| 2004 | PURCHASE | +50 | 0 | 购买50次团课卡 |
| 2004 | DEDUCT | -5 | 0 | 预约5节课程 |
| 2005 | PURCHASE | 0 | +500 | 购买500元储值卡 |
| 2005 | DEDUCT | 0 | -150 | 私教课消费150元 |
八、API测试示例
8.1 预约接口
POST /api/group-course/bookings
Content-Type: application/json
{
"courseId": 1,
"memberCardRecordId": 2002
}
8.2 取消预约接口
PUT /api/group-course/bookings/{bookingId}/cancel
Content-Type: application/json
{
"reason": "临时有事无法参加"
}
8.3 查询用户预约列表
GET /api/group-course/bookings?memberId=1003
九、测试数据对应关系图
会员表 (member_user)
│
├── 1001 ──→ (无会员卡)
├── 1002 ──→ 会员卡记录 2001 (USED_UP)
├── 1003 ──→ 会员卡记录 2002 (ACTIVE, 8次)
├── 1004 ──→ 会员卡记录 2003 (EXPIRED)
└── 1005 ──→ 会员卡记录 2004 (ACTIVE, 45次)
└── 会员卡记录 2005 (ACTIVE, 350元)
│
↓
预约记录表 (group_course_booking)
│
├── 3001: 已预约
├── 3002: 已取消
├── 3003: 已出席
└── 3004: 缺席
十、数据初始化
测试数据通过 Flyway 迁移脚本 V10__Insert_Booking_Test_Data.sql 初始化,需在数据库初始化时执行。
执行顺序:
- V1__Create_all_tables.sql - 创建基础表结构
- V2__Insert_initial_data.sql - 插入初始数据
- V6__Create_GroupCourse_table.sql - 创建团课表
- V7__Insert_GroupCourse_test_data.sql - 插入团课测试数据
- V8__Create_Member_And_MemberCard.sql - 创建会员和会员卡表
- V9__Add_GroupCourse_Booking_Snapshot_Fields.sql - 添加冗余字段
- V10__Insert_Booking_Test_Data.sql - 插入预约测试数据(本文件)
文档版本: v1.1
创建时间: 2026-06-02
更新时间: 2026-06-02
适用场景: 团课预约功能测试
十一、重要说明
11.1 字段说明
member_card_record 表包含两个ID字段:
id- 数据库主键(BIGSERIAL PRIMARY KEY)member_card_record_id- 业务ID(BIGSERIAL),代码中使用此字段作为查询和更新条件
11.2 测试数据修复记录
v1.1 修复内容:
- 修复了
member_card_record表测试数据缺失member_card_record_id字段的问题 - 原问题:测试数据只插入了
id字段,导致member_card_record_id为 NULL - 影响:代码使用
member_card_record_id作为WHERE条件时无法匹配到记录,导致扣减权益失败 - 解决:在INSERT语句中添加
member_card_record_id字段,值与id相同
修复前:
INSERT INTO member_card_record (id, member_id, member_card_id, ...) VALUES
(2001, 1002, 101, ...);
修复后:
INSERT INTO member_card_record (id, member_card_record_id, member_id, member_card_id, ...) VALUES
(2001, 2001, 1002, 101, ...);