go test 能运行不代表测试被执行,关键在文件名(_test.go)、函数签名(func TestXxx(t *testing.T))和包路径(同目录同包)三处硬性约定,任一不符则静默跳过。

go test 能跑起来,不代表你的测试被真正执行了——绝大多数“测试没反应”“no tests to run”问题,都卡在文件名、函数签名或包路径这三处硬性约定上。
测试文件名和位置必须严格匹配 _test.go 与同包同目录
Go 不会扫描子目录或跨包加载测试代码。常见错误包括:
-
utils_test.go被放在test/子目录下 →go test静默跳过,不报错也不运行 - 测试文件写了
package utils_test,但源码是package utils→ 编译失败:cannot use utils.XXX (type int) as type int - 想测私有函数(如
parseConfig),却把测试文件放到其他包里 → 根本无法访问
正确做法:源码 calculator.go 和测试 calculator_test.go 必须并列放在同一目录,且都声明 package calculator。
TestXxx 函数签名错一个字符就失效
Go 对测试函数签名零容忍。以下任一写法都会导致 go test 完全忽略该函数:
立即学习“go语言免费学习笔记(深入)”;
-
func testAdd(t *testing.T)❌ 小写t开头 → 不识别 -
func Test_add(t *testing.T)❌ 含下划线 → 不识别 -
func TestAdd(t testing.T)❌ 漏掉*指针 → 编译失败 -
func TestAdd(t *testing.T) bool❌ 多返回值 → 不识别
唯一合法形式:func TestAdd(t *testing.T),且不能有任何额外参数或返回值。
用 t.Run 做子测试,否则失败时找不到具体哪组数据出问题
表格驱动测试若只用 for range 循环 + if 判断,失败只会显示 TestAdd failed,无法定位是 {"zero", 0, 0, 0} 还是 {"negative", -1, -1, -2} 出错。
必须加 t.Run:
func TestAdd(t *testing.T) {
tests := []struct {
name string
a, b int
expected int
}{
{"positive", 2, 3, 5},
{"zero", 0, 0, 0},
{"negative", -1, -1, -2},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := Add(tt.a, tt.b)
if result != tt.expected {
t.Errorf("got %d, want %d", result, tt.expected)
}
})
}
}这样失败时输出是 --- FAIL: TestAdd/zero (0.00s),一眼锁定问题场景。
t.Error 和 t.Fatal 行为完全不同,选错会掩盖后续问题
新手常误用 t.Fatal 在表驱动循环里做结果校验,结果第一个 case 失败就终止,后面所有用例全跳过。
-
t.Error/t.Errorf:记录错误,继续执行当前测试函数内剩余逻辑 → 适合检查多个断言(如返回值 + error 是否为 nil) -
t.Fatal/t.Fatalf:记录错误后立即退出当前测试函数 → 只适合前置检查失败(如 mock 初始化失败、临时目录不可写)
特别注意:在 t.Run 的子测试闭包里用 t.Fatal,只终止该子测试,不影响其他子测试;但若直接在主 TestXxx 函数里用,整个测试就停了。
最易被忽略的点是:测试文件和函数名的大小写、下划线、指针符号这些细节,Go 全部按字面严格匹配,不作任何推断或容错。一旦写错,不是报错,而是彻底静默——你得自己意识到“它根本没跑”,而不是等它失败。


















