go单元测试必须严格遵循三规则:文件名以_test.go结尾、函数名以test开头且首字母大写、参数为*testing.t;否则go test静默忽略或编译失败。

go test 就是 Go 语言自带的自动化单元测试入口,不需要额外“通过语言学习”来实现——它不依赖 AI、不训练模型、不解析语义,靠的是明确的文件命名、函数签名和命令约定。
你真正要做的,是严格遵守三件事:文件怎么命名、函数怎么写、命令怎么跑。其他所有“自动化”效果(比如一键回归、CI 集成、覆盖率生成)都建立在这三件事之上。
测试文件必须叫 xxx_test.go
不是 test_xxx.go,不是 xxx_test.go.bak,也不是 xxx.test.go。只有 _test.go 这个后缀才会被 go test 自动识别。
- 如果放错位置(比如单独建
test/目录),go test找不到,报错:no test files - 如果包名写成
package main而源文件是package calc,会编译失败:cannot load package: package ... is not in GOROOT - 正确做法:和被测文件同目录、同包名(通常就是
package calc),例如:calc.go和calc_test.go并列存放
测试函数必须是 func TestXxx(t *testing.T)
Test 开头 + 首字母大写的驼峰名 + 唯一参数 t *testing.T,缺一不可。
- 写成
func testAdd(...)或func Testadd(...):运行go test -v时静默跳过,只提示testing: warning: no tests to run - 漏掉
*testing.T参数或改成*testing.B(那是基准测试用的):编译报错cannot use ... as testing.T value - 返回值或额外参数(如
func TestAdd(t *testing.T, extra string)):直接编译失败
go test 命令不自动发现“逻辑”,只按字面匹配
它不会读你注释、不会猜你意图、不会分析控制流——它只扫描文件、匹配函数名、调用函数。
-
go test默认只跑当前目录下所有*_test.go中的Test*函数 -
go test -run TestAdd是精确字符串匹配,大小写敏感,不支持正则(除非加-run '^TestAdd$'这种 shell 层转义) -
go test -cover统计的是「被执行过的源代码行」,不是「你认为该覆盖的逻辑分支」;if 分支里没写测试用例,那行就不算覆盖
go test 的自动化,是机械式、约定式、零推理的自动化。你写错一个下划线、少导一个 testing 包、把测试文件挪到子目录——它就彻底失灵,且错误信息极其简短,不解释原因。这种“脆弱的自动化”,恰恰是 Go 测试体系的设计哲学:把规则压到最简,把容错留给开发者自己盯。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











