test(运单资料文件包下载): 需求文档与 QE Fleet 全流程测试设计产物入库

- 需求 v1.0 定稿(md+docx)与 UI 原型入库;确认单判定 docx 为同文载体、安徽运八并行无冲突
- 全流程产物:分析 + 59 测试点 + 85 用例 + 测试数据 145 组;评审 3 阻断与覆盖缺口 GAP-001 已修复,裁决 PASS_WITH_FIX
- 导出 Excel(云效模型)+ XMind + 版本快照 v1;含 docx 生成脚本与转换校验产物
- .gitignore 排除 node_modules 与 Excel 锁文件
This commit is contained in:
xst
2026-09-09 09:31:55 +08:00
parent c7cc4d5648
commit 901b6741ff
48 changed files with 8183 additions and 0 deletions
@@ -0,0 +1,297 @@
# 运单资料文件包下载需求 测试数据
> 本文件由 data-builder Agent 自动生成,为测试用例提供精确数据支持。
> 生成时间:2026-09-08
> 数据依据:requirements/运单资料文件包下载需求.md(v1.0 定稿)、output/analysis/运单资料文件包下载需求_分析.md(REQ-001~026)、knowledge_base/00_project/project_profile.md、knowledge_base/01_standards/terminology.md、resources/prototypes/anhuibaba_file_package.html
> 来源标注说明:**需求提取**=可直接追溯至需求原文;**原型提取**=来自 UI 原型演示数据;**构造**=按需求示例风格构造的结构化数据;**需补充**=必须从测试环境获取/创建的真实数据,不得编造。
> 数据ID前缀:ACC-账号 / XLS-上传清单行 / BND-边界值 / STT-状态 / IDC-ID与命名 / ERR-异常 / CMB-组合 / CNC-并发。
---
## 自动提取数据
### 账号数据
| 数据ID | 角色 | 账号 | 权限 | 用途 | 来源 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| ACC-001 | 超级管理员(代行运营人员) | super_admin / 951260684NiAn.. | 全部权限(含"运单文件包"菜单) | 主流程上传/下载/审计日志操作人 | 项目画像 §1(测试环境真实账号) |
| ACC-002 | 运营人员(受控权限) | 需补充 | 仅授权"运单文件包"菜单 | 权限正向验证(REQ-002:菜单仅授权运营人员) | 需求提取(4.1/七章);账号需在平台管理-角色管理创建 |
| ACC-003 | 非授权角色(对照) | 需补充 | 未授权"运单文件包"菜单 | 菜单不可见/接口越权验证(敏感证件照片隔离) | 构造(需求 4.1 权限控制要求的反向场景) |
| ACC-004 | 车队长 | 13113113113 / 88888888 | 车队长端权限 | 后台造数:接单并分派运单,形成"车队长运单" | 项目画像 §1 |
| ACC-005 | 司机 | 15188888888 / 88888888 | 司机端权限 | 后台造数:司机接单/上传装卸货资料,形成可打款运单 | 项目画像 §1 |
| ACC-006 | 第二运营账号 | 需补充 | 与 ACC-001 等同 | 多账号并发上传、下载审计日志"操作人"字段区分验证 | 构造(需求 4.5 审计日志:操作人/时间/任务编号) |
### 上传清单数据(合法行)
> 模板 3 列:序号(正整数、全文件唯一)/ 货源单号 / 运单号(需求 4.2.1)。下表"系统内三要素"指该运单在系统中挂载的司机档案,用于批次划分(需求 4.4.1)。单号为需求示例风格格式,落地时须映射为测试环境真实运单(见数据缺口 #1)。
| 数据ID | 序号 | 货源单号 | 运单号 | 系统内三要素(司机/身份证/车牌) | 用途 | 来源 |
| :--- | :---: | :--- | :--- | :--- | :--- | :--- |
| XLS-001 | 1 | HY202609001 | YD20260901001 | 张三 / 340102199001011234 / 皖A12345 | 基准合法行(批次①成员) | 需求提取(五章示例);真实单号需补充 |
| XLS-002 | 2 | HY202609002 | YD20260901002 | 李四 / 340102199001015678 / 皖B67890 | 单运单批次(批次②) | 需求提取(五章示例);真实单号需补充 |
| XLS-003 | 3 | HY202609001 | YD20260901003 | 张三 / 340102199001011234 / 皖A12345 | 与 XLS-001 同批成员 | 需求提取(五章示例);真实单号需补充 |
| XLS-004 | 5 / 10 | HY202609001 | YD20260901004 / YD20260901005 | 张三 / 340102199001011234 / 皖A12345 | 非连续、乱序序号合法(最小序号判定与行顺序无关) | 构造(依据 4.4.1"非按上传行顺序") |
| XLS-005 | 50000 | HY202609001 | YD20260901006 | 张三 / 340102199001011234 / 皖A12345 | 大数值序号合法(序号不要求连续、不与行数挂钩) | 构造 |
| XLS-006 | 1~2000 | 真实货源单号 | 2000 个真实运单号 | 混合(多批次) | 行数上限合法文件(2000 行全有效) | 构造;运单号需补充 |
| XLS-007 | 1 | 真实货源单号 | 真实运单号 | 任意有效运单 | 最小合法清单(1 行) | 构造;运单号需补充 |
| XLS-008 | — | 序号 | 货源单号 | 运单号 | 模板下载产物(仅表头),作为后续所有清单的格式基准 | 需求提取(REQ-003);原型提取(运单清单模板.xlsx) |
### 上传清单数据(非法行——数据级校验,行级剔除)
> 预期处理:该行计入失败清单(xlsx,含序号/货源单号/运单号/失败原因),剔除后有效行继续处理,任务记"已完成·部分失败"(需求 4.2.2、确认决议 #7)。
| 数据ID | 构造行(序号/货源单号/运单号) | 预期失败原因 | 关联需求 | 来源 |
| :--- | :--- | :--- | :---: | :--- |
| XLS-101 | 0 / HY202609001 / YD20260901001 | 序号非正整数 | 4.2.2 | 构造 |
| XLS-102 | -1 / HY202609001 / YD20260901001 | 序号非正整数 | 4.2.2 | 构造 |
| XLS-103 | 1.5 / HY202609001 / YD20260901001 | 序号非正整数(小数) | 4.2.2 | 构造 |
| XLS-104 | abc / HY202609001 / YD20260901001 | 序号非正整数(非数字文本) | 4.2.2 | 构造 |
| XLS-105 | (空)/ HY202609001 / YD20260901001 | 序号非正整数(为空) | 4.2.2 | 构造 |
| XLS-106 | 两行序号均为 1(运单号不同) | 序号重复(重复行计入失败,首行有效性需验证) | 4.2.2、决议#13 | 构造 |
| XLS-107 | 1 / (空) / YD20260901001 | 货源单号为空 | 4.2.2 | 构造 |
| XLS-108 | 1 / HY202609001 / (空) | 运单号为空 | 4.2.2 | 构造 |
| XLS-109 | 1 / (空) / (空) | 货源单号、运单号均为空(验证失败原因提示合并或并列) | 4.2.2 | 构造 |
| XLS-110 | 1 / HY202609001 / YD20991231001 | 运单号在系统中不存在 | 4.2.2 | 构造 |
| XLS-111 | 1 / HY202609009 / 真实运单号 | 文件中货源单号与该运单实际所属货源不一致 | 4.2.2、决议#6 | 构造;真实运单号需补充 |
| XLS-112 | 两行同一运单号(序号 1、2 不同) | 同一运单号在文件中重复(重复行失败,首行保留) | 4.2.2 | 构造 |
| XLS-113 | 1 / 真实货源单号 / 系统内缺司机信息的运单号 | 运单缺少司机信息,无法归批 | 4.2.2、六#5 | 需补充(依赖环境运单) |
| XLS-114 | 1 / 真实货源单号 / 系统内缺车辆信息的运单号 | 运单缺少车辆信息,无法归批 | 4.2.2、六#5 | 需补充(依赖环境运单) |
| XLS-115 | 序号 4 与前文重复、且运单号与序号 2 行相同 | 单行多重非法(验证失败原因取值与优先级) | 4.2.2 | 构造 |
### 状态数据
#### 任务状态机(需求 4.3.1)
| 数据ID | 对象 | 状态值 | 驱动数据 | 来源 |
| :--- | :--- | :--- | :--- | :--- |
| STT-001 | 任务 | 待处理 | 上传成功但并发占满排队中(配合 CNC-003) | 需求提取(4.3.1) |
| STT-002 | 任务 | 处理中 | 有效行打包进行中,列表可见进度条(成功/失败条数,如原型 186/200) | 需求提取(4.3.1/七章);原型提取 |
| STT-003 | 任务 | 已完成 | 全部有效行成功(如 XLS-001~003 三行清单) | 需求提取(4.3.1) |
| STT-004 | 任务 | 已完成·部分失败 | 部分行数据级失败(如 5 行 3 成 2 败,同原型 RW20260907002) | 需求提取(4.3.1/决议#7);原型提取 |
| STT-005 | 任务 | 失败 | 系统级错误整体未生成文件包(如 OBS 不可用,见项目画像 §6.1) | 需求提取(4.3.1/六#10) |
| STT-006 | 任务 | 已过期(原型展示标签) | 文件包超 7 天保留期。注意:需求 4.3.1 状态机不含该状态,原型任务列表却显示"已过期"tag——状态字段值 vs 文件包生命周期标记的实现口径需澄清 | 原型提取(与需求差异标注) |
| STT-007 | 任务 | 已删除 | 失败任务支持删除后重新上传(原型"删除"按钮) | 需求提取(六#10);原型提取 |
#### 运单侧驱动状态(决定电子回单/合同数据的有无,术语以 terminology.md 为准)
| 数据ID | 对象 | 状态值 | 对文件包的影响 | 来源 |
| :--- | :--- | :--- | :--- | :--- |
| STT-011 | 运单 | 已结算/已打款 | 有支付记录 → 有银行电子回单(术语表:电子回单=运单产生支付记录后银行推送的回单) | 需求提取(4.4.3)+术语表 |
| STT-012 | 运单 | 运单关闭(司机取消) | 无支付记录 → 无电子回单,不阻断,记失败清单 | 需求提取(六#4)+术语表 |
| STT-013 | 运单 | 运输中(未产生支付) | 无电子回单,处理同 STT-012 | 构造(依据 4.4.3 回单口径推断) |
| STT-014 | 运单 | 含承运合同附件 | 合同目录导出该附件(含承运合同) | 需求提取(决议#5) |
| STT-015 | 运单 | 仅含委托合同/框架合同 | 合同目录不导出(不含委托合同/框架合同),原因记失败清单 | 需求提取(决议#5) |
#### 文件包生命周期
| 数据ID | 对象 | 状态值 | 说明 | 来源 |
| :--- | :--- | :--- | :--- | :--- |
| STT-021 | 文件包 | 已生成(≤7 天) | 可重复下载、幂等不重复生成;zip 不加密(决议#12),下载记审计日志 | 需求提取(4.5/七章/决议#12) |
| STT-022 | 文件包 | 过期已清理(>7 天) | 不可下载,提示重新上传(原型提示文案:"文件包已超过 7 天保留期,请重新上传清单生成") | 需求提取(七章);原型提取 |
### ID/编码数据
| 数据ID | 对象 | ID值/命名规则 | 说明 | 来源 |
| :--- | :--- | :--- | :--- | :--- |
| IDC-001 | 任务编号 | RW20260908001(原型格式:RW+日期+3位流水) | 系统生成;实际编码规则以实现为准,用例断言不得写死格式 | 原型提取;实现口径需补充 |
| IDC-002 | 运单号 | YD20260901001 | 需求示例格式;环境中真实运单号需补充 | 需求提取(五章示例) |
| IDC-003 | 货源单号 | HY202609001 | 需求示例格式;环境中真实货源单号需补充 | 需求提取(五章示例) |
| IDC-004 | 司机身份证号 | 340102199001011234(张三)、340102199001015678(李四) | 需求示例值(非真实档案);批次包名含完整身份证号(决议#3) | 需求提取(五章示例) |
| IDC-005 | 车牌号 | 皖A12345 / 皖B67890 | 需求示例值 | 需求提取(五章示例) |
| IDC-006 | 任务总包名 | `运单资料_【任务编号】.zip` | 一层目录 | 需求提取(4.4.2) |
| IDC-007 | 批次包名 | `【司机姓名】-【身份证号】-【车牌号】` | 二层目录,含完整 18 位身份证号 | 需求提取(4.4.2/决议#3) |
| IDC-008 | 运单包名 | `【序号】-【运单号】-【货源单号】`;最小序号追加 `-含司机及车辆证件` | 三层目录 | 需求提取(4.4.2) |
| IDC-009 | 子目录名 | 合同 / 电子回单 / 司机证件 / 车辆证件 | 四个固定子目录 | 需求提取(4.4.2/决议#4) |
| IDC-010 | 失败清单文件 | `失败清单_【任务编号】.xlsx`(原型:失败清单_RW20260907002.xlsx) | 含序号/货源单号/运单号/失败原因 4 列 | 需求提取(4.3.2);文件名原型提取 |
| IDC-011 | 模板文件名 | 运单清单模板.xlsx | 模板下载按钮产物 | 原型提取 |
| IDC-012 | 源文件名示例 | 运单清单_合肥仓0908.xlsx | 任务列表"源文件名"字段展示值 | 原型提取 |
### 边界值数据
#### 行数边界(数据行数,不含表头行;上限 2000 行,需求 4.2.1/决议#9)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-001 | 行数 | 最小值-1 | 0(仅表头) | 需求未明确:按文件级拒绝 or 0 行任务——见数据缺口 #15 | 构造(边界推导) |
| BND-002 | 行数 | 最小值 | 1 | 正常创建任务 | 需求提取(上限规则的合法侧) |
| BND-003 | 行数 | 最小值+1 | 2 | 正常创建任务 | 构造 |
| BND-004 | 行数 | 最大值-1 | 1999 | 正常创建任务 | 构造 |
| BND-005 | 行数 | 最大值 | 2000 | 正常创建任务(≤2000 合法) | 需求提取(4.2.1) |
| BND-006 | 行数 | 最大值+1 | 2001 | 文件级整体拒绝,提示行数超限,不创建任务 | 需求提取(4.2.2) |
| BND-007 | 行数 | 性能基准 | 1000 | 1000 单规模任务 30 分钟内完成(REQ-020) | 需求提取(七章) |
#### 文件大小边界(上限 10MB,需求 4.2.1/决议#9)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-011 | 文件大小 | 最大值-1 | 10MB-1B | 合法 | 构造(按上限推导);10MB=10^6 还是 2^20 字节需确认(缺口 #16) |
| BND-012 | 文件大小 | 最大值 | 10MB 整 | 合法("不超过 10MB"含等于) | 需求提取(原型 hintbox:"大小不超过 10MB") |
| BND-013 | 文件大小 | 最大值+1 | 10MB+1B | 文件级整体拒绝 | 需求提取(4.2.2"大小超上限") |
| BND-014 | 文件大小 | 下限 | 0 字节(空文件) | 文件级拒绝(损坏/空文件) | 构造 |
| BND-015 | 文件大小 | 典型值 | 12KB(3 行清单) | 合法 | 原型提取 |
#### 序号数值边界(正整数,需求 4.2.1)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-021 | 序号 | 最小值-1 | 0 | 行级失败(非正整数) | 需求提取(4.2.2) |
| BND-022 | 序号 | 最小值 | 1 | 合法,可被判定为批次最小序号 | 需求提取(4.2.1) |
| BND-023 | 序号 | 最小值+1 | 2 | 合法 | 构造 |
| BND-024 | 序号 | 无上限合法值 | 50000 | 合法(序号唯一即可,不要求连续) | 构造 |
| BND-025 | 序号 | int32 上限 | 2147483647 | 合法(若后端用 32 位整型存储则为存储上限) | 构造 |
| BND-026 | 序号 | int32 上限+1 | 2147483648 | 溢出风险验证:合法或明确报错,不得异常成功/静默截断 | 构造 |
| BND-027 | 序号 | 超 Excel 精度 | 12345678901234567890(20 位) | Excel 15 位精度截断风险:验证读取值与录入值一致性,溢出须失败 | 构造 |
#### 文件包保留期边界(7 天,需求七章/决议#10)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-031 | 保留期 | 最大值-1 | 完成后第 6 天 23:59 | 可下载 | 构造(按 7 天推导) |
| BND-032 | 保留期 | 最大值 | 完成后满 7 天整 | 临界:可下载/进入清理(以"完成时间+7天"为界的实现口径需确认) | 需求提取(七章) |
| BND-033 | 保留期 | 最大值+1 | 第 7 天+1(第 8 天) | 过期清理,不可下载,提示重新上传 | 需求提取(六#9);原型提示文案 |
#### 单文件下载重试边界(重试 3 次,需求 4.4.4)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-041 | 重试次数 | -/最小 | 第 1、2 次失败 | 自动重试,任务继续 | 需求提取(4.4.4) |
| BND-042 | 重试次数 | 最大值 | 第 3 次成功 | 不记失败清单,文件正常入包 | 需求提取(4.4.4) |
| BND-043 | 重试次数 | 最大值+1 | 3 次全失败后第 4 次 | 不再重试,记入失败清单,不阻断其余文件 | 需求提取(4.4.4) |
#### 并发上限边界(1~2,需求六#8)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-051 | 并发任务数 | 最小值 | 1 | 单任务直接处理 | 需求提取(六#8) |
| BND-052 | 并发任务数 | 最大值 | 2 | 两任务同时处理 | 需求提取(六#8) |
| BND-053 | 并发任务数 | 最大值+1 | 3 | 第 3 个任务排队"待处理",前序完成后自动开始 | 需求提取(六#8"后台排队") |
#### 电子回单数量边界(回单=全部支付记录对应回单,需求 4.4.3)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-061 | 支付记录数 | 最小值-1 | 0 笔(无支付/运单关闭) | 不阻断:无"电子回单"子目录,失败清单记原因(原型文案示例:"无电子回单:运单无支付记录") | 需求提取(4.4.4/六#4) |
| BND-062 | 支付记录数 | 最小值 | 1 笔 | 电子回单目录 1 份回单 | 术语表+需求 4.4.3 |
| BND-063 | 支付记录数 | 最大值+方向 | 2 笔及以上 | 多份回单;同名回单自动追加 (1)、(2) | 需求提取(4.4.3/4.4.2) |
#### 子目录内文件重名边界(原文件名保留、重名追加 (1)(2),需求 4.4.2)
| 数据ID | 字段 | 边界类型 | 边界值 | 预期行为 | 来源 |
| :--- | :--- | :--- | :---: | :--- | :--- |
| BND-071 | 证件文件重名 | 重名+1 | 同目录第 2 个同名文件(如 身份证.jpg ×2) | 第 2 个命名为 身份证(1).jpg | 需求提取(4.4.2) |
| BND-072 | 证件文件重名 | 重名+2 | 同目录第 3 个同名文件 | 命名为 身份证(2).jpg | 需求提取(4.4.2) |
| BND-073 | 证件文件重名 | 名字已含后缀 | 档案中同时存在 身份证.jpg 与 身份证(1).jpg,再导出一份 身份证.jpg | 追加规则不与既有文件冲突(去重基于实际文件集合) | 构造 |
---
## 构造数据
### 异常数据
#### 文件级异常(整体拒绝,不创建任务,需求 4.2.2)
| 数据ID | 字段/对象 | 测试值 | 预期行为 | 类型 | 来源 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| ERR-001 | 文件格式 | .xls(97-2003 老格式) | 上传即拒绝,提示仅支持 .xlsx | 参数非法 | 构造 |
| ERR-002 | 文件格式 | .csv / .docx / .jpg | 上传即拒绝 | 参数非法 | 构造 |
| ERR-003 | 文件格式 | 伪造 xlsx:zip/docx 改后缀名为 .xlsx | 拒绝(需魔数校验,防仅校验后缀) | 伪造格式 | 构造 |
| ERR-004 | 列名 | 缺失一列(仅"序号/运单号"两列) | 整体拒绝,提示列名缺失或不符 | 列名校验 | 需求提取(4.2.2) |
| ERR-005 | 列名 | 列名不符:`序号 `(尾空格)、`单号`、`序号(必填)`、`No.` | 整体拒绝 | 列名校验 | 构造(需求"列名缺失或不符") |
| ERR-006 | 列名 | 全半角/大小写变体:`序 号`、`货源单号` 全角空格分隔 | 整体拒绝(是否 trim 后匹配以实现为准,需验证) | 列名校验 | 构造 |
| ERR-007 | 列顺序 | 运单号列在货源单号列之前(列名均正确) | 需求未明确:按列名匹配应通过——预期口径需澄清(缺口 #15) | 边界探讨 | 构造 |
| ERR-008 | 文件完整性 | 截断的 xlsx / 伪 xlsx(zip 包无 workbook.xml) | 整体拒绝,提示文件损坏 | 文件损坏 | 需求提取(4.2.2) |
| ERR-009 | 多 Sheet | Sheet1 合法 + Sheet2 含额外数据 | 需求未明确(仅读 Sheet1 or 拒绝)——见缺口 #15 | 边界探讨 | 构造 |
| ERR-010 | 表头结构 | 表头行后含说明行/合并单元格/空行间隔 | 需求未明确;合并单元格读取行为需验证 | 边界探讨 | 构造 |
#### 数据级行异常(行级失败清单,需求 4.2.2——数据构造见 XLS-101~115,此处为校验维度汇总)
| 数据ID | 字段 | 测试值 | 预期行为 | 类型 | 来源 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| ERR-020 | 序号 | 0 / -1 / 1.5 / abc / 空(对应 XLS-101~105) | 行级失败:序号非正整数 | 参数非法 | 需求提取 |
| ERR-021 | 序号 | 全文件内重复(对应 XLS-106) | 重复行计入失败清单 | 重复 | 需求提取(决议#13:全文件唯一) |
| ERR-022 | 货源单号/运单号 | 空串、纯空格 ` `(对应 XLS-107~109) | 行级失败:单号为空;验证空格是否等同空值(trim 行为) | 参数非法 | 需求提取+构造 |
| ERR-023 | 运单号 | 系统中不存在的单号(对应 XLS-110) | 行级失败:运单号在系统中不存在 | 数据不存在 | 需求提取 |
| ERR-024 | 货源单号 | 与运单实际所属货源不一致(对应 XLS-111) | 行级失败:货源单号不一致 | 数据不一致 | 需求提取(决议#6) |
| ERR-025 | 运单号 | 文件内重复出现(对应 XLS-112) | 重复行计入失败清单 | 重复 | 需求提取 |
| ERR-026 | 归批条件 | 运单缺司机信息或车辆信息(对应 XLS-113/114) | 行级失败:无法归批 | 数据缺失 | 需求提取(六#5) |
| ERR-027 | 运单号 | 前后带空格 `YD20260901001 `(系统存在该运单) | 需求未明确:trim 后匹配 or 判不存在——预期需确认 | 边界探讨 | 构造 |
#### 安全异常数据(注入/超长/穿越——文件名类数据 Windows 本地选择文件时受系统限制,需通过接口层直传构造)
| 数据ID | 字段 | 测试值 | 预期行为 | 类型 | 来源 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| ERR-030 | 货源单号(SQL 注入) | `HY202609001' OR '1'='1` | 行级失败(查无此单),不得注入生效、不得 500 | SQL注入 | 构造 |
| ERR-031 | 运单号(SQL 注入) | `YD20260901001'; DROP TABLE waybill;--` | 行级失败,数据库无异常 | SQL注入 | 构造 |
| ERR-032 | 序号(SQL 注入) | `1 OR 1=1` | 行级失败:序号非正整数 | SQL注入 | 构造 |
| ERR-033 | 运单号(XSS) | `<script>alert('xss')</script>` | 行级失败;失败清单 xlsx 与页面回显转义,不执行脚本 | XSS | 构造 |
| ERR-034 | 源文件名(XSS) | `<img src=x onerror=alert(1)>.xlsx`(接口构造) | 任务列表"源文件名"展示转义,不触发弹窗 | XSS | 构造 |
| ERR-035 | 运单号(超长文本) | 256+ 字符连续字符串 | 行级失败,不崩溃、不截断误判为存在 | 超长文本 | 构造 |
| ERR-036 | 源文件名(超长) | 255 字节边界文件名 / 300 字符文件名 | 正常处理或明确拒绝;列表展示截断(原型 `.te` 省略样式),下载失败清单文件名不异常 | 超长文本 | 构造 |
| ERR-037 | 源文件名(路径穿越) | `..\..\etc\passwd.xlsx`、`../../webapps/evil.xlsx`(接口构造) | 不得逃逸上传/下载目录;总包/失败清单命名不受污染 | 路径穿越 | 构造 |
| ERR-038 | 源文件名(特殊字符) | 含 `# % & { } ~ $ ! ' " @ + = 空格 全角字符` 的合法 xlsx | 正常上传处理,任务列表/失败清单展示与下载不异常 | 特殊字符 | 构造 |
| ERR-039 | 源文件名(Unicode) | emoji 文件名(运单清单🚛.xlsx)、生僻字(𠮷)、繁体 | 编码/存储/展示正常(UTF-8 兼容) | 编码兼容 | 构造 |
| ERR-040 | 司机姓名(影响批次包目录名) | 系统档案司机姓名含 `.` `-` 空格 `·`(如 阿依古丽·买买提)、含 Windows 非法字符 `\/:*?"<>|` 的档案 | 批次包命名 `【司机姓名】-【身份证号】-【车牌号】` 在 Windows/zip 内合法可解压;非法字符需实现侧处理 | 命名兼容 | 构造;档案需补充 |
| ERR-041 | 身份证号(敏感数据合规) | 批次包名含完整 18 位身份证号(340102199001011234) | 按决议#3/#12:zip 不加密,依赖菜单权限+下载审计日志;验证越权不可达、日志完整 | 敏感合规 | 需求提取(决议#3、#12) |
### 组合数据
> 批次划分核心规则:系统内司机姓名+身份证号+车牌号三要素完全一致归一批(需求 4.4.1)。
| 数据ID | 组合场景 | 数据构成 | 预期行为 | 来源 |
| :--- | :--- | :--- | :--- | :--- |
| CMB-001 | 同司机同车多运单(基准示例) | 序号 1、3 均为 张三/340102199001011234/皖A12345 | 归 1 批;运单包 `1-…-含司机及车辆证件`(合同+回单+双方证件)、`3-…`(仅合同+回单) | 需求提取(五章示例) |
| CMB-002 | 单运单批次 | 序号 2:李四/340102199001015678/皖B67890 | 独立 1 批;运单包仍含司机及车辆证件 | 需求提取(五章/4.4.3) |
| CMB-003 | 同司机换车 | 序号 1:张三+皖A12345;序号 2:张三+皖C88888(身份证相同) | 拆分为 2 批 | 需求提取(4.4.1) |
| CMB-004 | 同车换司机 | 序号 1:张三+皖A12345;序号 2:王五+皖A12345 | 拆分为 2 批 | 需求提取(4.4.1) |
| CMB-005 | 同名同车不同身份证 | 序号 1:张三/340102199001011234/皖A12345;序号 2:张三/330102199201012345/皖A12345 | 拆分为 2 批(身份证号不同即不同批,验证三要素缺一不可) | 构造 |
| CMB-006 | 最小序号运单被剔除(校验失败) | 同批序号 1、3、5;序号 1 行运单号不存在 | 序号 1 记失败清单;重新计算最小序号,证件改挂序号 3,包名 `3-…-含司机及车辆证件` | 需求提取(4.4.4/六#6、决议#8) |
| CMB-007 | 跨货源归批 | 张三+皖A12345 的运单分属 HY202609001、HY202609002 两个货源 | 仍归 1 批(归批不看货源单号),两个运单包分属不同货源目录名 | 构造(依据 4.4.1) |
| CMB-008 | 乱序/非连续序号 | 同批序号 10、2、5 | 最小序号=2;序号 2 运单包含证件,命名按各自序号 | 需求提取(二章"最小序号运单"定义) |
| CMB-009 | 批次内混合成功失败 | 同批 3 行(序号 1、2、3),序号 1 运单不存在 | 有效 2 行成批,任务"已完成·部分失败";证件挂有效行最小序号 2 | 构造(组合 4.2.2+4.4.1) |
| CMB-010 | 最小序号运单全部文件下载失败 | 批次内序号 1 运单的合同/回单/证件 OBS 拉取均 3 次重试失败 | 需求 4.4.4 条款二"因文件缺失剔除、重算改挂"是否适用需澄清(缺口 #17);验证不阻断其余运单 | 需求提取(4.4.4)+构造 |
| CMB-011 | 最小序号运单无电子回单 | 批次内序号 1 运单无支付记录,序号 2 正常 | 解读一(不剔除):1 号包仍为最小序号、缺"电子回单"子目录、含证件;解读二(剔除改挂):证件改挂 2 号——两种解读需澄清(缺口 #17) | 需求提取(4.4.4 两条款并存)+构造 |
| CMB-012 | 多批次混合清单 | 张三批(2 运单)+李四批(1 运单)+王五批(1 运单),共 4 行 | 总包含 3 个批次包;每批各自最小序号含证件 | 需求提取(五章示例扩展) |
| CMB-013 | 同文件重复上传 | 同一 xlsx 上传 2 次 | 生成 2 个独立任务,各自打包、互不合并去重(REQ-023) | 需求提取(六#7) |
| CMB-014 | 多支付记录运单 | 1 个运单含 2 笔支付记录,2 份银行电子回单同名 | 电子回单目录 2 份回单,第 2 份追加 (1)(结合 BND-063/071) | 构造(术语表回单定义+4.4.2) |
| CMB-015 | 合同口径组合 | 运单 A 含承运合同;运单 B 仅委托合同;运单 C 含承运+框架合同 | A 导出;B 不导出并记失败清单;C 仅导出承运合同 | 需求提取(决议#5/REQ-013) |
| CMB-016 | 无合同运单 | 运单详情-合同附件为空 | 合同子目录不生成,不阻断,记失败清单 | 需求提取(4.4.4) |
| CMB-017 | 2000 行同司机单批次 | 2000 行全部为 张三/340102199001011234/皖A12345 的运单 | 归 1 批、1 个运单包层级树含 2000 个运单包(仅序号 1 含证件);验证打包性能与目录深度 | 构造 |
| CMB-018 | 全部行失败(0 有效行) | 2000 行全部非法(或 3 行全非法) | 需求未明确 0 有效行时任务终态(已完成·部分失败 or 失败 or 其他)与是否生成空文件包——见缺口 #14 | 构造(边界推导) |
### 并发数据
| 数据ID | 场景 | 账号数 | 并发量 | 数据构成与说明 | 来源 |
| :--- | :--- | :---: | :---: | :--- | :--- |
| CNC-001 | 单任务处理(并发下限) | 1 | 1 | 1 个 1000 行清单任务独占处理 | 需求提取(六#8) |
| CNC-002 | 双任务并发(并发上限) | 1~2 | 2 | 2 个合法清单(如 500 行+500 行)几乎同时上传,两任务同时"处理中" | 需求提取(六#8) |
| CNC-003 | 三任务排队(超上限) | 1 | 3 | 第 3 个任务保持"待处理",任一前序完成后自动开始(配合 STT-001/BND-053) | 需求提取(六#8) |
| CNC-004 | 大小任务混跑 | 1 | 2 | 2000 行任务(XLS-006)+3 行任务(XLS-001~003)并发,小任务不被大任务长时间阻塞 | 构造 |
| CNC-005 | 同一任务并发下载 | 1 | 2+ | 已完成任务并发双击/双会话同时点"下载文件包":幂等,不重复生成文件包,均返回合法 zip | 需求提取(4.5/七章幂等) |
| CNC-006 | 性能基准 | 1 | 1 | 1000 单规模清单(如 500 批×2 运单混合 CMB-001/002 结构)30 分钟内完成 | 需求提取(七章 REQ-020) |
| CNC-007 | 多账号并发上传 | 2 | 2 | ACC-001 与 ACC-006 同时上传不同清单,任务互不干扰,上传人字段各自正确 | 构造 |
| CNC-008 | 上传按钮防重复提交 | 1 | 2+ | 同一文件选中后快速重复点击"开始上传并创建任务":仅创建 1 个任务(项目画像 §8.2 必测幂等) | 项目画像提取+构造 |
---
## 数据缺口
| 序号 | 缺失数据 | 用途(关联数据ID) | 建议来源 |
| :--- | :--- | :--- | :--- |
| 1 | 测试环境真实运单号+货源单号映射(≥20 单:已完成且已打款、含 ≥1 笔支付记录与银行电子回单、运单详情含承运合同附件) | XLS-001~003/006/007、CMB-001/002/012 等全部合法行落地 | 测试环境运单管理/承运结算-电子回单查询现有数据;不足时用 ACC-004/005 走"发货源→接单→卸货→打款"完整流程造数 |
| 2 | 仅含委托合同的运单 1 单(合同附件仅委托合同) | CMB-015(合同口径排除验证)、STT-015 | 测试环境查找或通过合同管理-委托书合同造数 |
| 3 | 含框架合同(或仅框架合同)的运单 1 单 | CMB-015("不含框架合同"口径验证) | 测试环境合同管理模块查找 |
| 4 | 无支付记录的已关闭运单 1 单(司机取消终止流转) | BND-061、STT-012(无回单不阻断记失败清单) | 司机端接单后取消,或测试环境查找已关闭运单 |
| 5 | 系统内缺司机信息的运单 1 单、缺车辆信息的运单 1 单 | XLS-113/114、ERR-026(无法归批) | 承运管理后台造数清空关联字段,或查找历史脏数据 |
| 6 | 含 ≥2 笔支付记录的运单 1 单(多笔货主支付/分笔打款) | BND-063、CMB-014(多回单+回单重名 (1) 追加) | 对同一运单执行 2 次货主打款+财务打款流程 |
| 7 | 同名同车不同身份证号的司机档案 1 组(两个司机档案:姓名相同、车牌相同、身份证不同) | CMB-005(三要素缺一不可验证) | 承运管理-司机管理创建两个档案,车辆绑定同一辆车 |
| 8 | 同司机换车历史运单组、同车换司机历史运单组各 1 组 | CMB-003/004(拆批验证) | 司机档案换绑车辆后各跑 1 单;或两司机先后接同一车辆货源 |
| 9 | 运营人员专用账号(角色仅授权"运单文件包"菜单)+ 无该菜单权限的对照账号 | ACC-002/003(REQ-002 权限正向/反向、越权) | 平台管理-角色管理新建角色并配置菜单权限 |
| 10 | 第二运营账号(可与 #9 复用) | ACC-006、CNC-007(多账号并发上传、审计日志操作人区分) | 同 #9 |
| 11 | OBS 文件失效/证件照片缺失的运单(合同或回单或证件对象被删除、URL 失效) | BND-041~043、CMB-010(单文件下载失败重试 3 次场景) | 后台直接删除 OBS 对象或篡改档案文件 URL(需开发/运维配合) |
| 12 | 大文件构造物:2001 行 xlsx、10MB±1B xlsx、截断损坏 xlsx、伪装后缀 xlsx | BND-006/011~013/014、ERR-001/003/008 | 本地 Python(openpyxl) 脚本生成后存入测试数据目录,纳入版本管理之外的 fixtures |
| 13 | 司机/车辆档案中同名字件照片(同一档案上传 2~3 个同名附件) | BND-071~073、CMB-014(重名 (1)(2) 追加) | 司机管理-证件照片处重复上传同名文件 |
| 14 | "0 有效行"任务的预期终态(全部行数据级失败时:已完成·部分失败 / 失败 / 是否生成空包) | CMB-018、STT-004/005 边界 | 需求方/开发确认(需求 4.2.2 未覆盖全失败场景) |
| 15 | 文件级边界处理预期:0 行文件(仅表头)、多 Sheet、表头后附加行、列顺序颠倒 | BND-001、ERR-007/009/010 | 需求方/开发确认读取与拒绝口径 |
| 16 | 上限口径确认:10MB=10^6 还是 2^20 字节;2000 行是否含表头行;序号与运单号单元格为数值型 vs 文本型时的读取规则 | BND-005/011、XLS-006 | 开发确认实现口径后回填边界值定义 |
| 17 | "最小序号运单因文件缺失剔除改挂"的触发口径:无合同/无回单(4.4.4 条款一:不阻断仅记清单)是否也触发条款二的剔除改挂 | CMB-010/011(证件挂载预期直接冲突,影响 P0 断言) | 需求方/开发澄清 4.4.4 两条款关系 |
| 18 | 多机构部署形态确认 + B 机构运营账号与 B 机构有效运单(含证件回单资料) | ACC-B01(B 机构运营账号,行内临时记号)、YDB-001(B 机构运单,007/008 机构隔离断言) | 开发/运维确认部署形态;多机构环境由平台管理-机构管理造数;若为单机构部署或 super_admin 按设计跨机构可见,007/008 改用绑定 A 机构的非超管账号(ACC-002 补机构绑定)执行 |