审查总报告真实 E2E模拟接口回归

后端增量 Code Review

日期:2026-09-05。仓库:unreal_tran_api;基线:3307c23 → b683bb7,57 个文件。审查开始时后端工作树干净;审查完成后按用户授权提交为 53d860b

资料 → 原型 → 设计 → 开发 → 测试

资料和原型追溯见同目录 reference-review.md。本轮沿用既有“三渠道共享训练定义、失败可以重试、全过程留痕”的设计,未扩展评分、提前提交或渠道分类。

后端对照以下正式设计审查:wiki/19-训练定义渠道合同.mdwiki/20-教学命令幂等.mdwiki/21-教学步骤运行事实.md,并交叉核对 wiki/14-教学实施模块.md、接口总览、033/034 增量和完整 DDL。审查覆盖多渠道发布预检与固定快照、教员内容写权限、三个登录身份、四类命令回执、逐步推进/失败/重试/提交门槛、历史无事实兼容、正式考核和学员访问隔离。

已修复:旧尝试的迟到证据错误完成重试

严重度:P2。位置:TeachingStepRunService.validateEvidenceTime

重现顺序:步骤首次开始时间为 100,失败时间为 110,重新开始时间为 120;重试后补报发生于 115 的成功事件。旧实现只与首次 startedAt 和最近 failedAt 比较,因此把重试开始前的证据计入第二次尝试,错误将步骤变为 COMPLETED。同类迟到失败事件也可错误增加当前尝试失败次数。

先添加回归用例并在旧实现运行,测试失败,错误为“预期抛出 BusinessException,但没有抛出”。证据:backend-repro.log

修复使用已有 last_event_id 指向的重试激活事件,比较其发生时间;旧尝试的 MATCHED/UNMATCHED 返回 HTTP 400。首次开始时间仍保留,同秒或重试之后的有效事件仍可推进。缺失或跨运行的激活证据拒绝处理。没有新增字段、接口或训练步骤,也没有回填历史事实。

新增测试同时验证迟到成功、迟到失败都不改变当前状态/尝试数/失败数/最近证据;重试同秒的有效成功可以完成,并保留首次开始时间。另更新四个服务测试中的依赖装配,并同步 wiki 01/14/21。

其他审查结论

实际验证

环境为 Temurin Java 17.0.20、Maven 3.9.14。

验证 结果 证据
修改前 mvn test -B -ntp 401 项通过:Gateway 1、Auth 86、Tran 314 Maven 退出码 0,完成时间 11:19:45
新增回归用例运行于旧实现 1 项失败,成功复现缺陷 backend-repro.log
四个相关服务类定向测试 23 项通过 backend-targeted.log
修改后全量 mvn test -B -ntp 402 项通过:Gateway 1、Auth 86、Tran 315;0 失败、0 错误、0 跳过 backend-mvn-test.log,11:24:52 完成
mvn -DskipTests package -B -ntp 三个服务打包成功,退出码 0 backend-package.log,11:25:19 完成
git diff --check 通过,无空白错误 仅出现既有 CRLF 归一化提示

测试为本地单元/服务装配验证。名称含 IntegrationTest 的相关测试仍使用 Mockito mapper;不能把它们作为真实数据库并发、设备接入或浏览器 E2E 已通过的证据。带截图的浏览器验证和真实 API/数据库检查由同目录主报告汇总。

已观察到的非阻断警告:JVM 类共享提示、现有弃用/unchecked 编译警告、测试刻意模拟 Redis 失败后的数据库回源警告。没有据此修改依赖版本。

功能确认边界

本后端修复没有功能扩展;资料与现有产品的四项差异统一列于 reference-review.md,随主测试报告交用户确认。未放宽“全部步骤完成才可提交”,未引入自动评分或新渠道。