red-task-investigation.md 5.9 KB

RED 任务真实现状核查与契约测试设计(2026-11-02)

生成方式:只读核查 + 本地状态修改(state.json 新增 investigation 证据字段,stage 维持 RED,未推送远端)。 范围说明:本环境无 mvn/mvnw(后端单测无法执行),且本次未授权联网装依赖 / 推送远端,故「实际测试工作」以契约测试设计 + 现状核查 + 状态修改形式交付;不谎报"已通过"。

一、执行范围与约束

项 状态 说明
后端 mvn test ✗ 不可执行 全机无 maven,且 188 个测试为 @SpringBootTest 需连库
Playwright e2e ◐ 需授权 CLI 在(v1.64.1)但浏览器未下载,真跑需 npx playwright install
langgraph pytest ◐ 需授权 有 test_*.py 但无 venv/依赖,需 pip install
本地状态修改 ✓ 已完成 state.json 已更新 investigation;侧车 951 条(16 通过/4 失败/931 未跟踪)
推送远端 ✗ 未授权 未 push origin/cfclub,closed-loop 证据暂不闭环

二、2 个 RED 任务真实现状核查(只读证据)

2.1 health.report.createReport

  • 实现存在:cfc-backend/src/main/java/com/etotem/cfc/controller/HealthReportController.java:219 @PostMapping("/report/create") → public Result<HealthReport> createReport(...)
  • 契约测试缺失:仓库内 2 个相关测试 HealthReportControllerProxyParseBindingTest、HealthReportControllerListPaginationTest 经 grep 确认均不覆盖 createReport//report/create。
  • 判定:RED 确证(实现在,目标端点无契约级单测)。

2.2 dan.assessment.getActiveMaterial

  • 实现存在:cfc-backend/src/main/java/com/etotem/cfc/controller/DanAssessmentController.java:65 @PostMapping("/material/active") → public Result<AssessmentMaterial> getActiveMaterial()
  • 契约测试缺失:src/test/java 下无任何 DanAssessmentController 测试文件(grep 命中 0)。
  • 判定:RED 确证(实现在,控制器零测试)。

结论:两个任务均处于「实现已完成、测试待写」的 RED 态,符合 TDD 状态机(RED=测试待写)。 二者不需要开发角色做 YELLOW(实现使绿),而需要测试角色补 RED 契约测试并验证。

三、状态修改记录(本地,未推送)

d:/cfc/.tdd/state.json 已为两任务新增 investigation 字段:

  • impl_exists: true / impl_ref(精确 file:line)
  • contract_test_exists: false / existing_tests_cover_target: false
  • verdict / next(后续动作)
  • stage 维持 RED,updated 刷新为 2026-11-02 11:48:00。

四、「实际测试工作」交付物:契约测试设计(可直接落码)

遵循项目约定:统一 @PostMapping、响应 Result<T>(code/message/data)、JwtInterceptor 鉴权(Authorization 头)、测试用 MockMvc(与现有 188 个测试一致)。

TC-R1 · POST /api/health/report/create

测试类:HealthReportControllerCreateReportTest(建议置于 cfc-backend/src/test/java/com/etotem/cfc/controller/)

用例 构造 断言
R1-1 正常创建 合法 HealthReport + 指标列表,带有效 JWT code==200、返回 data.id 非空、healthReportService.createReport 被调用 1 次
R1-2 参数缺失 report 为 null 或必填字段缺 全局异常拦截返回 400 + 具体字段提示(非裸 500)
R1-3 鉴权缺失 不带 Authorization 401,跳转登录(8 个公开路径之外)
R1-4 并发/幂等 同请求重复提交 依据业务是否要求幂等断言(创建成功或明确拒绝)

Mock 点:healthReportService.createReport(...) 用 Mockito.when(...).thenReturn(...) 隔离 DB。

TC-R2 · POST /api/dan-assessment/material/active

测试类:DanAssessmentControllerGetActiveMaterialTest

用例 构造 断言
R2-1 正常获取 带有效 JWT,存在活跃物料 code==200、返回 data 非空且为当前 active 物料
R2-2 无活跃物料 Mock assessmentService.getActiveMaterial() 返回 null/空 code==200 且 data 为空(或业务约定码),无 500
R2-3 鉴权缺失 不带 Authorization 401
R2-4 类型契约 返回体字段与 AssessmentMaterial 对齐 反序列化成功、关键字段一致

Mock 点:assessmentService.getActiveMaterial() 用 Mockito 隔离。

注意(rail):本环境无 maven,以上测试写完后无法在本机 run 验证。落码需在已授权 maven 的环境执行 mvn test 复跑,通过且 push 至 origin/cfclub 后,方可由测试角色 --mark-green 闭环。

五、缺口诊断(降级产出,不谎报通过)

  • 后端执行缺口(高):无 maven → 189 测试文件 / 1412 @Test 全部无法在本环境执行;270 个零测试控制器(AdminController 65、DanAssessmentController 29、AdminArticleController 22…)缺测试。
    • 建议测试设计:按高风险后台接口优先补 MockMvc 契约测试(参考第四节模板)。
  • e2e/pytest 执行缺口(中):Playwright 浏览器未装、langgraph 无 venv,需授权联网安装后方可实际执行。
  • CI 缺口(高):未发现 .github/workflows / .gitlab-ci.yml / Jenkinsfile,脚本级自动化未接入持续回归。

六、后续推进条件(需用户显式授权)

  1. 后端实测:授权安装 maven + 配置测试库 → 跑 mvn test,将 16 通过/4 失败 之外的 931 未跟踪转为真实执行态。
  2. e2e/pytest 实测:授权 npx playwright install + 建 langgraph venv pip install → 实际跑 70 spec / pytest。
  3. 闭环推送:授权 git push origin/cfclub → 使 RED/YELLOW/GREEN 证据成立,测试角色可 --mark-green。
  4. 落码契约测试:在已授权环境将第四节 TC-R1/TC-R2 写入 cfc-backend/src/test/java,run 通过并 push 后推进状态机。