Go测试文件必须以_test.go结尾,函数名须为TestXxx且首字母大写,参数为*testing.T,包名通常与源码一致;否则go test将静默忽略。

Go测试文件必须以 _test.go 结尾
Go编译器和go test命令只识别以_test.go为后缀的文件作为测试文件。名字不满足这个规则,哪怕内容全是func TestXxx(*testing.T)也不会被运行。
常见错误现象:go test 输出no test files,但目录里明明有mytest.go或test_utils.go——问题就在没加_test后缀。
- 正确命名:
http_handler_test.go、cache_test.go、user_service_test.go - 错误命名:
test_http.go、utils_test.go(缺少下划线)、handler_tests.go(用复数且后缀不对) - 测试文件可以和被测源码同包,无需额外
package xxx_test(除非要测未导出标识符且需隔离)
测试函数名必须是 TestXxx 形式且首字母大写
Go测试框架通过反射查找函数,仅识别符合func TestXxx(t *testing.T)签名的函数(Xxx必须以大写字母开头,不能是testXxx或Test_xxx)。
使用场景:一个math_utils.go对应一个math_utils_test.go,里面定义TestAdd、TestDivide等。
-
func TestAdd(t *testing.T)✅ 可被发现并执行 -
func testAdd(t *testing.T)❌ 小写开头,go test直接忽略 -
func Test_add(t *testing.T)❌ 下划线后接小写,不符合Xxx驼峰要求 - 函数参数类型必须是
*testing.T(单元测试)或*testing.B(基准测试),不可省略或换类型
同包测试 vs 黑盒测试:何时用 xxx_test 包名
默认情况下,测试文件和源文件用相同package名(如都是package cache),可直接访问导出和未导出符号,适合白盒验证逻辑细节。
但若想强制黑盒调用(只通过公开API测试,模拟外部使用者),需将测试文件声明为package cache_test(包名加_test后缀),此时无法访问原包未导出名(如errInvalidKey),只能调用ExportedFunc。
- 白盒测试(推荐默认):
package cache+cache_test.go→ 可查内部状态、打桩私有方法 - 黑盒测试(显式隔离):
package cache_test+cache_test.go→ 更贴近真实依赖方视角 - 注意:
go test会自动识别package xxx_test为独立包,但仍与xxx包关联编译,无需额外import
示例:一个最小可运行的 Go 测试文件结构
假设项目中有calc.go:
package calc
func Add(a, b int) int {
return a + b
}
对应测试文件calc_test.go应为:
package calc
import "testing"
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Errorf("Add(2, 3) = %d, want %d", got, want)
}
}
运行:go test 或 go test -v 查看详情。别忘了文件名是calc_test.go,函数是TestAdd,包名和源码一致——这三个点任意一个错,测试就静默失效。
最容易被忽略的是:测试文件和源文件不在同一目录时,go test不会跨目录扫描;子目录里的_test.go需单独进入该目录运行,或用go test ./...递归执行。










