23066b20bc
docs: 添加测试指南 TEST.md 包含: - 代码整合流程 - 编译与运行方法 - 35 项测试检查项(管理员 / 乘客 / 换乘 / 持久化 / 边界) - 常见 Bug 排查表 - 5 分钟冒烟测试快速清单 Co-Authored-By: Claude <noreply@anthropic.com> @
6.7 KiB
6.7 KiB
测试指南
各组员完成模块后,按本文档整合、编译、测试。
一、整合代码
# 各组员先推送自己的分支到远程
git checkout feature/train
git add src/train.cpp src/train.h
git commit -m "feat: 完成车次顺序表模块"
git push origin feature/train
# === 全部推送后,由一人负责合并 ===
git checkout main
git pull origin main
git merge feature/train
git merge feature/order
git merge feature/graph
# 若有冲突,解决后:
git add .
git commit -m "merge: 整合三个模块"
git push origin main
二、编译
# Windows(Git Bash 或 MinGW)
mingw32-make
# Linux / Mac
make
# 清理后重新编译
mingw32-make clean && mingw32-make
编译错误常见原因:
- 函数声明与实现签名不一致(检查
.h和.cpp参数类型是否匹配) - 忘记
#include对应头文件 - 全局变量重复定义(
trainList等在各自的.cpp中定义,在.h中extern声明)
三、运行
mingw32-make run
# 或
./train_ticket.exe
四、测试检查项
按菜单路径逐项测试,每组测完打勾。
4.1 管理员功能(组员A + 组员C 统计)
| # | 测试项 | 菜单路径 | 操作步骤 | 预期结果 | ✓ |
|---|---|---|---|---|---|
| 1 | 新增车次 | 管理员→1 | 录入车次号 G9999,始发站 北京,终点站 天津,票价 55,余票 200 | 提示新增成功,车次列表可见 G9999 | |
| 2 | 车次号重复校验 | 管理员→1 | 再次新增车次号 G9999 | 提示车次号已存在,拒绝插入 | |
| 3 | 删除车次 | 管理员→2 | 输入 G9999 | 提示删除成功,车次列表不再有 G9999 | |
| 4 | 修改车次 | 管理员→3 | 输入 G101,修改票价为 600 | 提示修改成功,查看列表票价已变更 | |
| 5 | 查看车次列表 | 管理员→4 | 直接选择 | 显示所有车次(38条),格式化对齐 | |
| 6 | 按车次号查找 | 管理员→5→顺序 | 输入 G101 | 显示北京→上海,票价等字段正确 | |
| 7 | 二分查找 | 管理员→5→二分 | 输入 G101 | 结果与顺序查找一致 | |
| 8 | 按站名模糊查 | 管理员→5→站名 | 输入"北京" | 列出所有始发或终点含"北京"的车次 | |
| 9 | 按票价排序 | 管理员→6→票价 | 选择快速排序 | 列表按票价升序,最低在前 | |
| 10 | 按余票排序 | 管理员→6→余票 | 选择堆排序 | 列表按余票升序 | |
| 11 | 销售统计 | 管理员→7 | 输入车次号 G101 | 显示该车次已售出票数 | |
| 12 | 时段收入 | 管理员→7 | 输入起止时间 | 显示该时段总收入 |
4.2 乘客功能(组员B 订单 + 撤销栈)
| # | 测试项 | 菜单路径 | 操作步骤 | 预期结果 | ✓ |
|---|---|---|---|---|---|
| 13 | 查询车次 | 乘客→1 | 输入"上海" | 列出含"上海"的车次 | |
| 14 | 多条件查询 | 乘客→1 | 出发站=北京,票价区间 300-600 | 返回符合条件的车次 | |
| 15 | 购票 | 乘客→2 | 选 G101,输入姓名 张三,身份证 110101199001011234 | 生成订单号,车次 G101 余票-1 | |
| 16 | 余票不足候补 | 乘客→2 | 选余票为 0 的车次购票 | 提示无余票,询问是否候补 | |
| 17 | 加入候补 | 乘客→2 | 确认加入候补 | 订单状态为"候补中" | |
| 18 | 退票 | 乘客→3 | 输入订单号 | 状态变"已退票",余票+1 | |
| 19 | 候补自动转正 | 先退票 | 某车次有人退票→候补队首自动出票 | 候补订单变"已支付",余票不变 | |
| 20 | 改签 | 乘客→4 | 输入订单号 + 新车次号 | 原车次余票+1,新车次余票-1 | |
| 21 | 查看订单 | 乘客→5 | 输入身份证号 | 列出该乘客所有订单及状态 | |
| 22 | 撤销购票 | 乘客→7 | 确认撤销最近一次购票 | 订单退票,数据恢复 | |
| 23 | 撤销退票 | 乘客→7 | 确认撤销最近一次退票 | 订单恢复为已支付,余票-1 | |
| 24 | 撤销改签 | 乘客→7 | 确认撤销最近一次改签 | 车次恢复原样 |
4.3 换乘查询(组员C)
| # | 测试项 | 菜单路径 | 操作步骤 | 预期结果 | ✓ |
|---|---|---|---|---|---|
| 25 | 直达查询 | 乘客→6 | 起点=北京,终点=上海 | 输出 G101,1次直达 | |
| 26 | 一次换乘 | 乘客→6 | 起点=北京,终点=杭州 | 经上海换乘,2段 | |
| 27 | 多次换乘 | 乘客→6 | 起点=成都,终点=沈阳 | 输出换乘路径(如成都→西安→郑州→北京→沈阳) | |
| 28 | 无路径 | 乘客→6 | 起点=北京,终点=一个孤立站点 | 提示无法到达 |
4.4 数据持久化
| # | 测试项 | 操作步骤 | 预期结果 | ✓ |
|---|---|---|---|---|
| 29 | 退出保存 | 主菜单→0 | 提示"数据已保存" | |
| 30 | 重启加载 | 再次运行程序 | 上次修改的数据(新增车次、已购票等)全部保留 |
4.5 边界 & 异常
| # | 测试项 | 操作步骤 | 预期结果 | ✓ |
|---|---|---|---|---|
| 31 | 非法输入 | 菜单输入字母 | 提示"输入无效"而非崩溃 | |
| 32 | 车次满 | 新增 > MAX_TRAINS 条车次 | 提示表已满 | |
| 33 | 空列表排序 | 删除所有车次后排序 | 不崩溃,提示无数据 | |
| 34 | 退不存在的票 | 输入不存在的订单号 | 提示订单不存在 | |
| 35 | 负票价 | 管理员新增车次输入票价 -100 | 拒绝或提示非法 |
五、常见 Bug 排查
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
编译报错 undefined reference |
函数未实现或签名不匹配 | 检查 .cpp 中函数名/参数与 .h 一致 |
| 余票数对不上 | 购票/退票/候补逻辑顺序错误 | 加 printf/cout 打日志跟踪 |
| 排序后二分查找失败 | 二分查找前未按车次号排序 | 二分查找前调用 InsertSort |
| 候补不自动补票 | 退票时未检查队列 | RefundTicket 中加 DeQueue 逻辑 |
| 撤销后数据错乱 | 撤销的逆操作未同步更新余票 | ExecuteUndo 中检查余票联动 |
| Dijkstra 输出错误 | 松弛逻辑或 visited 标记有误 | 用简单图(3-4站)手算验证 |
| 文件加载乱码 | CSV 编码或解析不对 | 确保 UTF-8,用 getline 正确切分 |
六、快速冒烟测试(5分钟)
如果时间紧,至少测这 6 个场景:
- 管理员新增 → 列表查看 → 删除(验证增删改基础)
- 乘客购票 → 查看订单 → 退票(验证订单流)
- 无余票购票 → 加入候补 → 退票触发自动补票(验证队列联动)
- 换乘查询:北京 → 杭州(验证 Dijkstra)
- 购票后撤销(验证栈)
- 退出 → 重启 → 数据仍在(验证持久化)