# 模块 13:历史代码治理、类型契约与测试补齐
Rule、Skill、Agent 和 MCP 解决的是“如何沉淀判断”。 回到真实项目,历史代码治理还需要回答:哪些结构可以调整、哪些行为必须保持、类型是否真的表达了接口契约,以及测试到底覆盖到哪里。
职责结构
行为基线
命令模型
类型契约
测试矩阵
断言边界
--- # 派车重构的候选职责结构
当前 `assign` 保持事务编排入口,候选拆分只调整内部职责,不改变 Controller、接口或写入顺序: ```text assign(vo) @Transactional |- 校验申请:存在、已审批、未重复派车 |- 校验车辆:存在、可用、时间不冲突 |- 校验司机:按 needDriver 决定必填、可用、时间不冲突 |- 创建派车任务:写入申请、车辆、司机、计划时间与状态 `- 预占车辆:AVAILABLE -> RESERVED ``` | 可调整的内部边界 | 不能借拆分改变的行为 | |---|---| | 私有校验方法、局部命名、组装对象的位置 | 事务边界、拒绝顺序、接口字段、派车与车辆的写入语义 |
--- # 用行为基线验收无损重构
`assign` 的当前源码可先整理为行为基线;重构后的代码和测试都应逐项回到这张表。 | 输入条件 | 预期结果 | 允许的写入 | |---|---|---| | 申请不存在、未完成或已派车 | 拒绝派车 | 无派车任务、无车辆状态变更 | | 车辆不存在、不可用或时间冲突 | 拒绝派车 | 无派车任务、无车辆状态变更 | | 需要司机但未提供,或司机不可用/冲突 | 拒绝派车 | 无派车任务、无车辆状态变更 | | 所有前置条件满足 | 创建 `DISPATCHED` 派车任务 | 车辆由 `AVAILABLE` 变为 `RESERVED` |
“无损”不是代码未报错,而是每个拒绝路径和成功副作用仍与基线一致。
--- # 类型治理要分开命令、实体与展示模型
派车模块已有一组可对照的模型边界: | 模型 | 当前字段范围 | 应承担的职责 | |---|---|---| | `OfficialVehicleDispatchVo` | `applyId`、`carId`、可选 `driverId`、`remark` | 派车命令的唯一输入 | | `OfficialVehicleDispatch` | ID、调度人、时间、状态、取消原因等 | 服务端持久化与列表展示结果 | | 前端 `OfficialVehicleDispatchVo` | 与派车命令相同的四类字段 | 提交时只发送用户可提供的内容 | | 前端 `OfficialVehicleDispatch` | 读取列表中的状态、时间和调度人等 | 展示与操作条件判断 |
命令类型不是实体类型的 `Partial`:状态、时间和操作人不应由派车表单决定。
--- # 类型差异必须形成可执行的核验用例
审批结果和申请状态的定义差异,不能只记录在问题单中,应转换为可验证的契约。 | 核验对象 | 输入或观察值 | 需要确认的结论 | |---|---|---| | 审批命令 | `pass`、`reject`、`PASS`、`REJECT` | 哪些值能被接口接受;拒绝时返回什么语义 | | 审批表单 | 单选组件实际提交的 `result` | 页面提交值是否与接口契约一致 | | 申请状态 | `1`、`"1"` 及接口返回值 | 前端渲染和状态判断使用的唯一表示 | | 类型定义 | 联合类型、表单选项、后端常量 | 三处是否指向同一组允许值 |
类型契约完成的标准是“能执行的接受与拒绝用例”,不是文档里多了一行枚举。
--- # 取消派车的测试用例应覆盖状态与副作用
| 场景 | 期望行为 | 当前证据状态 | |---|---|---| | `cancelReason` 全空白 | 立即拒绝,不访问后续依赖 | 已有 Service 单测 | | 派车任务不存在 | 拒绝,不更新派车或车辆 | 待补 | | 派车状态不是 `DISPATCHED` | 拒绝,不释放车辆 | 待补 | | 任务可取消且车辆存在 | 记录取消原因,派车变 `CANCELLED`,车辆变 `AVAILABLE` | 待补 | | 任务可取消但车辆记录缺失 | 派车仍完成取消,避免空指针 | 待补,当前源码有空值保护 |
测试用例的粒度应跟随状态与副作用,不以“覆盖了 cancel 方法”作为完成标准。
--- # 断言要与被测层级匹配
| 被测层级 | 当前可见证据 | 应断言什么 | 不能替代什么 | |---|---|---|---| | Controller | Mockito 验证 `cancel` 的委派与结果消息 | 接口是否交给正确的 Service 参数 | Service 内部状态和持久化行为 | | Service 拒绝路径 | 空白原因抛出异常 | 不满足条件时无后续写入或资源释放 | 正常取消的双对象更新 | | Service 成功路径 | 当前尚无定向单测 | 派车状态、取消原因、车辆状态及更新次数 | 前端实际请求载荷 | | API / 集成层 | 当前尚无契约验证记录 | 前后端值、权限、序列化与错误响应 | 未执行环境的全链路结论 |
Controller Mock 测试通过,不等于业务状态机已经被测试。
--- # 从案例到可执行资产
案例提供事实;资产保存判断;重构守住行为;类型表达契约;测试证明副作用;MCP 将外部能力纳入同一套边界。
事实
Rule
任务契约
Skill
Agent
MCP
类型
测试