From f59a3cf376c25882bcf03f2b5197d900290398f0 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Mon, 28 Sep 2026 08:43:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(make):=20test-gui=20=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=A2=AB=E5=89=8D=E5=BA=8F=E5=A4=B1=E8=B4=A5=E7=9F=AD=E8=B7=AF?= =?UTF-8?q?=EF=BC=88=E9=97=A8=E7=A6=81=E6=9B=BE=E5=BD=A2=E5=90=8C=E8=99=9A?= =?UTF-8?q?=E8=AE=BE=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 问题 `make test` 原本是 make 的**依赖链**: test: $(GO) test ./... @$(MAKE) test-gui @$(MAKE) csrc-test ... `go test ./...` 一旦 FAIL,make **立即中止** ⇒ 挂在它后面的目标一行都不跑。 实测坐实:`internal/plugin/proc` 偶发 FAIL 时,`make test` 的日志里 **找不到 test-gui 的任何输出** —— 刚接进去的 GUI 判据根本没被执行。 门禁挂上去等于没挂。 ## 为什么不能简单用 `-@$(MAKE) test-gui` `-` 前缀会**吞掉 GUI 判据自己的失败码** —— 判据红了 make 照样绿, 等于给假绿灯。那比短路更糟:它让人以为门禁在生效。 ## 做法 全部跑完,最后统一判退出码: test: @rc=0; $(GO) test ./... || rc=$$?; \ $(MAKE) test-gui || rc=$$?; \ $(MAKE) csrc-test || rc=$$?; \ $(MAKE) check-csrc || rc=$$?; \ $(MAKE) check-codec-cgo-only || rc=$$?; \ exit $$rc 既保证每一步都跑,也保留每一步自己的失败。 ## 验证(注入失败实测,不是推断) 往 `TestKillReturnsEvenWhenGrandchildSurvives` 里塞 `t.Fatal` 制造必然失败: | 验证项 | 结果 | | --- | --- | | `make test` 退出码 | **2**(非 0,失败被上报) | | proc 包 FAIL | 抓到 | | **GUI 判据输出** | **仍执行** ← 这是要证明的那件事 | | csrc-test | 也执行了 | | 汇总 | ok=43 FAIL=1 | 随后已恢复该测试文件(`git checkout` + 确认 0 处残留 `t.Fatal`), 并复跑该包确认 ok 10.6s。 全绿路径也验过:`make test` 退出码 0、ok=44 FAIL=0、GUI 判据执行。 --- Makefile | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index de31a83..d599673 100644 --- a/Makefile +++ b/Makefile @@ -352,12 +352,23 @@ install: build # 不下结论。要稳定门禁就单独跑并重试: # go test ./internal/plugin/proc/ -count=1 # ⚠ 别把"单跑通过"当结论——同一命令会交替通过/失败。 +# ★ test-gui 必须**一定被执行**,但不能被前序失败短路,也不能吞掉自己的失败。 +# +# 问题:`go test ./...` 一旦 FAIL,make 立即中止 ⇒ 挂在它后面的目标 +# 都不会跑。实测 internal/plugin/proc 偶发 FAIL 时,make test 日志里 +# **找不到 test-gui 的任何输出** —— 门禁形同虚设。 +# 但直接用 `-@$(MAKE) test-gui` 又会**吞掉** GUI 判据自己的失败码, +# 变成给假绿灯。 +# +# 做法:先无条件跑并把结果存进变量,最后统一决定退出码。 +# 这样既保证它一定跑,也保留它自己的失败。 test: - $(GO) test ./... - @$(MAKE) test-gui - @$(MAKE) csrc-test - @$(MAKE) check-csrc - @$(MAKE) check-codec-cgo-only + @rc=0; $(GO) test ./... || rc=$$?; \ + $(MAKE) test-gui || rc=$$?; \ + $(MAKE) csrc-test || rc=$$?; \ + $(MAKE) check-csrc || rc=$$?; \ + $(MAKE) check-codec-cgo-only || rc=$$?; \ + exit $$rc # check-codec-cgo-only:钉死「编解码层完全 C 化」这一决定。 #