测试指南
各组员完成模块后,按本文档整合、编译、测试。
一、整合代码
二、编译
编译错误常见原因:
- 函数声明与实现签名不一致(检查
.h 和 .cpp 参数类型是否匹配)
- 忘记
#include 对应头文件
- 全局变量重复定义(
trainList 等在各自的 .cpp 中定义,在 .h 中 extern 声明)
三、运行
四、测试检查项
按菜单路径逐项测试,每组测完打勾。
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 正确切分 |
六、快速冒烟测试
如果时间紧,至少测这 6 个场景:
- 管理员新增 → 列表查看 → 删除(验证增删改基础)
- 乘客购票 → 查看订单 → 退票(验证订单流)
- 无余票购票 → 加入候补 → 退票触发自动补票(验证队列联动)
- 换乘查询:北京 → 杭州(验证 Dijkstra)
- 购票后撤销(验证栈)
- 退出 → 重启 → 数据仍在(验证持久化)