67837df8d0
- 新增全套考试卷、评估卷、参考答案与考试培训包模板 - 修正slidev培训课件:调整模块标题、链路图缩放,替换工单示例为通用业务对象 - 修正课堂红线表述为证据红线,将小组作业调整为个人作业要求 - 新增权限、状态流转、审计日志、看板指标四类可复用业务规则块 - 整理AI工程技能交付包,迁移旧资产至客户专属交付包并统一术语 - 新增考试输出模板与TRAE使用记录文档
12 KiB
12 KiB
模块 13:历史代码治理、类型契约与测试补齐
Rule、Skill、Agent 和 MCP 解决的是“如何沉淀判断”。
回到真实项目,历史代码治理还需要回答:哪些结构可以调整、哪些行为必须保持、类型是否真的表达了接口契约,以及测试到底覆盖到哪里。
职责结构
行为基线
命令模型
类型契约
测试矩阵
断言边界
派车重构的候选职责结构
当前 assign 保持事务编排入口,候选拆分只调整内部职责,不改变 Controller、接口或写入顺序:
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
类型
测试