fix(make): test-gui 不再被前序失败短路(门禁曾形同虚设)

## 问题

`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 判据执行。
This commit is contained in:
JianFeeeee
2026-09-28 08:43:04 +08:00
parent f5981a2807
commit f59a3cf376

View File

@ -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 化」这一决定。
#