必须用 go test -run 加完整路径名,如 go test -run "TestParse/json_valid";仅写子测试名或不完整路径会导致误匹配或静默失败,因-run匹配的是“父测试名/子测试名”这一完整路径。

直接运行单个子测试用例,必须用 go test -run 加完整路径名,比如 go test -run "TestParse/json_valid";只写 json_valid 或 TestParse/json 都会误匹配或静默失败。
怎么精准运行一个子测试
子测试的完整名字是 父测试函数名/子测试名,-run 匹配的是这个完整路径,不是子测试名本身。
-
go test -run TestAdd/positive—— 正确,精确命中 -
go test -run positive—— 错误,可能同时触发TestPositive、TestLoginSuccess等所有含positive的测试函数 -
go test -run TestAdd/pos—— 错误,前缀匹配会拉进TestAdd/positional(如果存在) - Windows 下记得用双引号,并转义正则符号:例如
go test -run "^(TestAdd/positive)$" - 不确定名字?先跑
go test -list .看实际注册的完整路径
t.Run 循环里为什么总跑错数据
这是最隐蔽也最常发生的错误:在 for range 中直接把循环变量传进 t.Run 闭包,所有子测试实际都用最后一组值。
- 根本原因是 Go 闭包捕获变量地址,不是值
- 必须在循环体第一行显式拷贝:
tt := tt(哪怕tt是 struct) - IDE 或
staticcheck会报SA9003,别忽略警告 - 漏掉这行不会 panic,但测试“看似通过”,实则漏测——CI 里尤其难发现
子测试并发要注意什么
t.Parallel() 不是声明,是运行时指令,位置和资源安全都得卡准。
- 必须放在子测试函数体第一行,或至少在任何读写共享状态之前
- 父测试里调
t.Parallel()无效,它只对当前子测试生效 - 并发子测试不能共用未加锁的全局 map、文件句柄、mock server 实例等
- 如果 setup 后依赖同一份初始化结果(比如一个启动好的 HTTP server),就别并发——并发不等于正确
- 加
-race能暴露 data race,但前提是t.Parallel()已正确启用
子测试命名能不能用斜杠 /
能显示,但不能用;/ 是框架解析路径的分隔符,不是命名字符。
-
t.Run("JSON/valid", ...)日志里会显示为树形,但go test -run TestFoo/JSON会同时匹配TestFoo/JSON和TestFoo/JSON/invalid - 名字含
/、以/开头或结尾、或含//,go test直接报错:test name "xxx" contains illegal characters - 推荐用下划线:
"json_valid"、"empty_input";层级靠父子关系自然形成,如TestParse/json_valid
子测试真正的复杂点不在语法,而在状态隔离与资源生命周期管理——t.Run 创建的是独立 *testing.T 实例,但变量捕获、并发控制、清理逻辑这些地方,稍不注意就会让测试行为和预期脱节。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











