go单元测试必须满足三个硬性条件才能被go test识别执行:文件名以_test.go结尾、函数名以test开头、参数类型为*testing.t;缺一不可,否则测试静默跳过。

Go 单元测试不是“写完函数再补个 Test 函数”就完事——它必须满足三个硬性条件才能被 go test 识别并执行:文件名以 _test.go 结尾、函数名以 Test 开头、参数类型为 *testing.T。缺一不可,否则测试根本不会运行。
怎么让 go test 找到并跑全所有测试
很多人只在当前目录执行 go test,结果 internal/ 或 cmd/ 下的测试完全没被覆盖。Go 默认不递归子目录,这是最常被忽略的路径陷阱。
- 统一用
go test ./启动,确保所有子包参与测试 - CI 中禁用无参数的
go test,避免因工作目录切换导致漏测 - 如需排除某些目录(比如
examples/),用go test $(go list ./ | grep -v examples),比-exclude更兼容老版本 Go
表驱动测试里为什么 t.Run 会跑错数据
循环中直接写 t.Run(tc.name, func(t *testing.T) { ... }),90% 的概率所有子测试都用的是最后一组 tc 的值——这是 Go 闭包捕获变量的经典坑。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 必须在循环体内加一行
tc := tc,显式复制变量,切断引用共享 -
name字段要语义清晰,比如"empty_input_returns_error",别用"case1"或拼接字符串("Test_" + tc.input) - 结构体字段名必须显式写出,避免靠顺序匹配;新增字段时不会意外错位
测试 HTTP handler 时为什么 status code 总是 400 或 415
用 httptest.NewRecorder() 测 handler,看似绕过了网络层,但 JSON 处理和 header 缺失会让测试在第一关就失败。
- 发 JSON 请求前,必须调用
req.Header.Set("Content-Type", "application/json"),否则很多 handler 直接返回 415 - 别用
fmt.Sprintf拼 JSON 字符串——引号、转义、空值全会出问题;一律用json.Marshal并检查返回的error - 读响应时别用
io.ReadAll+string(),直接json.Unmarshal到最小预期结构体,避免因字段新增导致测试飘红 - 错误路径(如参数校验失败)必须显式设置
w.WriteHeader(400),并在测试里断言状态码,不能只看 body 内容
真正难的不是写通一个测试,而是让每个 t.Run 名字能精准指向失败输入、每条 JSON 路径都带 error 检查、每个并发测试都不共享状态——这些细节不处理,测试就只是看起来在跑而已。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










