PR #3:Q2-001 功能测试补齐 + B 层棘轮第 2 次上调(36/46 → 78/70)#3
按源仓库 anta-workshopdemo 方向 F 指令,关闭 CHECKPOINT §五 T-Q2-a 待办——功能测试补齐。
anta-workshopdemo
本 PR 让 B 层 CI 棘轮第 2 次上调(首次 PR #2 激活 36/46;本次跃升到 78/70)——跨越 42/24 个百分点。这不是因为"写了很多代码",而是因为测试层次升级(unit-only → unit+functional)。棘轮记录的不是代码质量,是测试对代码行为的覆盖广度。
同时首次将 testing-standards §3.1(禁 H2)+ §3.2 方案 A(显式 compose)落地——docker-compose.test.yml 启动真实 PostgreSQL,按 LESSONS B12 禁止 UI 推断数值,按 §1.3.1 阈值首次激活 5 步流程。
3 个 commits 分层推进
test(functional)
dc9d409
feat(ci)
2f042ab
docs(meta)
28ea564
改动 1:功能测试基础设施(commit 1)
docker-compose.test.yml
backend/src/test/resources/application-test.yml
backend/src/test/java/.../functional/AbstractFunctionalTest.java
functional-testing.md §3.3 方案 A
backend/src/test/java/.../functional/ReqQ2001ArticleCrudTest.java
改动 2:修 5 个真实 bug(功能测试暴露的,单元测试架构上不可能暴露)
create
createdAt/updatedAt
update
PSQLException: Cannot convert TIMESTAMPTZ to LocalDateTime
HttpMessageNotReadableException
改动 3:CI 流水线升级 14→15 stages(commit 2)
scripts/ci/backend/check-backend-functional.sh
scripts/ci/backend/check-backend-test.sh
mvn test
mvn -Dtest='...unit.**' test
scripts/ci/backend/check-backend-coverage.sh
backend/pom.xml
jacoco.line.min
jacoco.branch.min
.cnb.yml
biz-backend-functional
biz-backend-coverage
改动 4:CHECKPOINT 档案(commit 3)
本地 15/15 CI stages 全绿 + 0 lint
真实测试运行
mvn -B test
mvn -B verify
check-backend-coverage.sh
行覆盖: 79% 保底: 78% 分支覆盖: 71% 保底: 70% [OK] 后端覆盖率棘轮达标
棘轮实测证据链(两次激活对比)
遵循 testing-standards §1.3.1 阈值首次激活流程:
awk -F, 'NR>1 { lm+=$8; lc+=$9 } END { printf "%.4f", lc/(lm+lc) }'
yml 对称:verify-yml-consistency.sh push/MR 两段 81 行完全一致
verify-yml-consistency.sh
CI 流水线结构升级
测试金字塔首次在本项目完整落地
关闭的待办
新增候选待办
本轮最深刻的 insight(入 CHECKPOINT 轮次 3 学到的东西):
"覆盖率 100% 的单元测试 ≠ 代码正确" 本 PR 修的 5 个 bug 中有 3 个(#1/#2/#3)是 Mockito 单元测试架构上根本不可能暴露的——因为 mock 隔离掉了数据库真实行为。这证明 testing-standards §1.1 测试金字塔分层设计的必要性不是纸面约定。单元测试是必要但远不充分。
"覆盖率 100% 的单元测试 ≠ 代码正确"
本 PR 修的 5 个 bug 中有 3 个(#1/#2/#3)是 Mockito 单元测试架构上根本不可能暴露的——因为 mock 隔离掉了数据库真实行为。这证明 testing-standards §1.1 测试金字塔分层设计的必要性不是纸面约定。单元测试是必要但远不充分。
本 PR 不动的事
docs/requirements/Q2-001.md
testing-standards.md
LESSONS.md §二 B12
rules/git-conventions.md §四
cnb-*
动机(Why)
按源仓库
anta-workshopdemo方向 F 指令,关闭 CHECKPOINT §五 T-Q2-a 待办——功能测试补齐。本 PR 让 B 层 CI 棘轮第 2 次上调(首次 PR #2 激活 36/46;本次跃升到 78/70)——跨越 42/24 个百分点。这不是因为"写了很多代码",而是因为测试层次升级(unit-only → unit+functional)。棘轮记录的不是代码质量,是测试对代码行为的覆盖广度。
同时首次将 testing-standards §3.1(禁 H2)+ §3.2 方案 A(显式 compose)落地——docker-compose.test.yml 启动真实 PostgreSQL,按 LESSONS B12 禁止 UI 推断数值,按 §1.3.1 阈值首次激活 5 步流程。
变更清单(What)
3 个 commits 分层推进
test(functional)dc9d409:功能测试 + 5 个真实 bug 修正(8 文件 / +381 行)feat(ci)2f042ab:CI 升级 14→15 stages + 棘轮阈值上调(5 文件 / +206/-26 行)docs(meta)28ea564:CHECKPOINT §四 轮次 3 档案(1 文件 / +85/-12 行)改动 1:功能测试基础设施(commit 1)
docker-compose.test.yml(项目根):PostgreSQL 15-alpine + tmpfs + 5433 端口避让 + healthcheckbackend/src/test/resources/application-test.yml:从"排除 DataSource"改为"连真实 PG" + Flyway enabled + 环境变量注入backend/src/test/java/.../functional/AbstractFunctionalTest.java:按functional-testing.md §3.3 方案 A骨架backend/src/test/java/.../functional/ReqQ2001ArticleCrudTest.java:11 个用例覆盖 AC-1~AC-8 全部 P0 + 3 个补充边界改动 2:修 5 个真实 bug(功能测试暴露的,单元测试架构上不可能暴露)
create返回 VO 的createdAt/updatedAt为 nullupdate同样问题——返回 updatedAt 不是 DB 刷新后值PSQLException: Cannot convert TIMESTAMPTZ to LocalDateTimeHttpMessageNotReadableException改动 3:CI 流水线升级 14→15 stages(commit 2)
scripts/ci/backend/check-backend-functional.sh:独立 stage 跑功能测试;Docker 探测 + 幂等跳过scripts/ci/backend/check-backend-test.sh:mvn test→mvn -Dtest='...unit.**' test只跑单元层scripts/ci/backend/check-backend-coverage.sh:从 unit-only → unit+functional 合并度量;需 Docker 启动 composebackend/pom.xml:jacoco.line.min0.36→0.78;jacoco.branch.min0.46→0.70.cnb.yml:push + MR 两段对称新增biz-backend-functionalstage(maven + services:[docker])+biz-backend-coverage加 services:[docker]改动 4:CHECKPOINT 档案(commit 3)
验证证据(How verified)
本地 15/15 CI stages 全绿 + 0 lint
真实测试运行
mvn -B test:Tests run: 26(unit 15 + functional 11), Failures: 0, Errors: 0mvn -B verify:BUILD SUCCESScheck-backend-coverage.sh实测:棘轮实测证据链(两次激活对比)
遵循 testing-standards §1.3.1 阈值首次激活流程:
awk -F, 'NR>1 { lm+=$8; lc+=$9 } END { printf "%.4f", lc/(lm+lc) }'→ 0.7982yml 对称:
verify-yml-consistency.shpush/MR 两段 81 行完全一致影响面(Impact)
CI 流水线结构升级
测试金字塔首次在本项目完整落地
关闭的待办
新增候选待办
本轮最深刻的 insight(入 CHECKPOINT 轮次 3 学到的东西):
本 PR 不动的事
Refs
docs/requirements/Q2-001.md§六 AC-1~AC-8testing-standards.md§1.3.1(阈值首次激活)+ §3.1(禁 H2)+ §3.2 方案 A(显式 compose)LESSONS.md §二 B12(禁 UI 推断数值)rules/git-conventions.md §四(PR body 规范)cnb-*构建输出 15 stages 结果