go test不生效需检查测试文件命名、函数签名及位置:文件必须以_test.go结尾,函数以test开头且参数为*testing.t,且与被测代码同目录同包。

go test 命令不生效?检查测试文件命名和位置
Go 的单元测试不是靠“配置框架”启动的,而是靠 go test 自动发现并执行——前提是文件名和函数签名完全合规。常见失败场景是:测试文件没以 _test.go 结尾、测试函数没用 Test 开头、或测试文件不在被测代码同一包目录下。
- 测试文件必须命名为
xxx_test.go(不能是test_xxx.go或xxx_test.go.txt) - 测试函数必须形如
func TestAdd(t *testing.T),首字母大写的Test不可省略、不可小写、不可加空格 - 测试文件和被测源文件(如
main.go)必须放在同一目录,且属于同一个 Go 包(package myproject) - 如果测试文件在子目录里,
go test默认只运行当前目录下的测试;想递归运行所有子目录,用go test ./...
测试函数里该用 t.Error 还是 t.Fatal?
两者都标记测试失败,但行为完全不同:一个继续执行,一个立刻终止当前测试函数。选错会导致后续断言被跳过,掩盖真实问题。
-
t.Error和t.Errorf:记录错误后继续执行该测试函数内的剩余代码,适合一次验证多个条件(比如校验返回值、错误类型、日志输出) -
t.Fatal和t.Fatalf:打印错误后立即 return,不再执行后续语句,适合前置条件不满足时快速失败(例如初始化 mock 失败、临时目录创建失败) - 别在循环里用
t.Fatal——它会直接跳出整个循环,导致后续测试用例无法覆盖
如何只跑某个测试函数或按名字过滤?
go test -run 支持正则匹配,但容易因大小写或路径写错而漏匹配。实际使用中,最稳妥的是用完整函数名精确匹配。
- 运行单个测试:
go test -run=TestAdd(注意无空格、无括号、大小写敏感) - 匹配一组测试:
go test -run=^TestAdd$(^和$锁定边界,避免误匹配TestAddWithNegative) - 忽略某些测试:
go test -run='^(?!TestHelper).*$'(用负向先行断言跳过辅助测试函数) - 加
-v参数才能看到具体哪个子测试失败:go test -v -run=TestDivide
覆盖率报告为什么显示 0%?关键参数顺序不能错
go test -cover 看起来简单,但若和 -run 或其他 flag 混用,顺序不对就失效——Go 要求 coverage 相关 flag 必须放在命令末尾,且不能和 -o 等编译类 flag 冲突。
- 正确写法:
go test -v -run=TestAdd -cover(-cover 在最后) - 错误写法:
go test -cover -run=TestAdd(部分 Go 版本会忽略 -cover) - 生成 HTML 报告:
go test -coverprofile=c.out && go tool cover -html=c.out,注意c.out是临时文件名,可任意指定 - 覆盖率统计的是「被执行过的代码行」,不是「写了 if/else 就算覆盖」;分支未走到、error case 未触发,都会拉低数值
go test 就静默跳过,连 warning 都不报。这点和带配置文件的框架完全不同,得靠肌肉记忆养成习惯。golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











