mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-11-05 16:57:32 +00:00
ci+docs: 覆盖率改用 -coverpkg=./... —— 默认统计会漏掉外部测试包
## 缺陷(实测发现,且是**度量本身**在说谎)
加覆盖率采集之后,`internal/agent/core/child` 报告 0.0% —— 但刚给
它写了 9 条判据、覆盖 87.6%。
原因:`go test ./... -coverprofile` **只统计每个包内自测的覆盖**。
而覆盖 child 的测试在 `child/test/` —— 另一个包。主报告里只看到:
internal/agent/core/child 0.0% ← 假的
internal/agent/core/child/test 87.6% ← 真的在覆盖 child
## 修法
go test ./... -coverpkg=./... -coverprofile=/tmp/cover.out
实测差异:
child 0.0% → 85.7%
全局总覆盖率 56.9% → 63.0%
即**此前的数字是系统性低估的**。而低估比高估更危险 —— 它会促使人
"为凑覆盖率写空判据",那正是 engineering-lessons §1.1 记的坑。
代价:`-coverpkg=./...` 为每个测试二进制插桩全部包,跑得更慢
(实测仍在 20m 门内)。这个代价换"数字是真的",值得。
## 文档补 §5.3.2
把这条写进 engineering-lessons,因为它是**判据分离的连带义务**:
> 判据分离(§5.3)与覆盖率采集必须同时改。
> 只改前者,度量会退化成谎报。
否则下次有人把测试迁到 test/ 之后,会看到覆盖率"莫名其妙掉了",
进而怀疑分离本身,把它改回去。
## 本提交同时包含
`internal/agent/core/child/test/registry_contract_test.go`(9 条判据)
已随上一个提交(8884cf9)入库 —— 那里和 io 的并发判据修复放在一起,
因为它们都是"判据自身的缺陷"这一主题。
This commit is contained in:
15
.github/workflows/ci.yml
vendored
15
.github/workflows/ci.yml
vendored
@ -226,7 +226,22 @@ jobs:
|
||||
- name: 覆盖率(仅报告)
|
||||
run: |
|
||||
set -euo pipefail
|
||||
# ★ 必须带 -coverpkg=./...(2026-11-04 实测发现漏统计)。
|
||||
#
|
||||
# 不带它时,`go test ./... -coverprofile` **只统计每个包内自测的覆盖**。
|
||||
# 而本仓正在把判据迁到 `<pkg>/test/` 外部包 —— 那样一来:
|
||||
#
|
||||
# internal/agent/core/child 显示 0.0%
|
||||
# internal/agent/core/child/test 覆盖了它 87.6%
|
||||
#
|
||||
# 主报告里 child 是 0%,因为覆盖它的测试在**另一个包**里。
|
||||
# 实测:加 -coverpkg=./... 后 child 从 0.0% → 85.7%,
|
||||
# 全局从 56.9% → 63.0%。即之前的数字是**低估**的。
|
||||
#
|
||||
# 代价:-coverpkg=./... 会为每个测试二进制插桩全部包,跑得更慢
|
||||
# (实测 20m 门内仍有余量)。这个代价换"数字是真的",值得。
|
||||
go test ./... -count=1 -timeout 20m \
|
||||
-coverpkg=./... \
|
||||
-coverprofile=/tmp/cover.out -covermode=atomic > /tmp/cover.log 2>&1 || {
|
||||
echo "★ 覆盖率跑挂了(这条同时兜住了 go test 的失败)"
|
||||
tail -40 /tmp/cover.log
|
||||
|
||||
Reference in New Issue
Block a user