Go测试文件必须以_test.go结尾,且测试函数需以Test开头并接收*testing.T参数;基准测试用BenchmarkXXX,示例函数用ExampleXXX;所有测试须与被测代码同包或显式声明package xxx_test。

Go测试文件必须以 _test.go 结尾
Go 的 go test 命令只识别后缀为 _test.go 的文件,其他命名(如 test_xxx.go、xxx_test.go.bak)会被完全忽略。这不是约定,是硬性规则。
- 合法:
calculator_test.go、user_handler_test.go - 非法:
test_calculator.go(不运行)、calculator_test.bak.go(不编译)、calculator_tests.go(静默跳过) - 注意:文件名中
_test必须紧贴主名,且中间不能有空格或特殊符号
测试文件和被测代码需在同一个包内
除非明确写 package xxx_test(用于黑盒测试),否则测试文件应与源文件共用同一 package 声明。例如:calculator.go 里是 package calc,那 calculator_test.go 也得是 package calc。
- 同包测试可直接访问未导出标识符(如
func helper() {}),这是白盒测试的基础 - 若误写成
package calc_test,又没加import "./"或使用//go:build ignore等绕过方式,则可能报undefined: xxx - 跨包测试(黑盒)仅适用于验证导出 API,且需确保
go.mod路径可解析到被测包
测试函数名必须以 Test 开头且接受 *testing.T
只有签名形如 func TestXXX(t *testing.T) 的函数才会被 go test 自动发现并执行。大小写敏感,testXXX 或 TESTXXX 都无效。
- 正确示例:
func TestAdd(t *testing.T) { if got := Add(2, 3); got != 5 { t.Errorf("Add(2, 3) = %d, want 5", got) } } - 错误示例:
func addTest(t *testing.T)(不执行)、func TestAdd() int(编译失败) - 子测试可用
t.Run(),但外层函数仍需符合Test*规则
基准测试和示例函数的命名同样严格
如果要写性能测试或文档示例,命名规则一样不可妥协:
立即学习“go语言免费学习笔记(深入)”;
- 基准测试函数必须是
func BenchmarkXXX(b *testing.B),文件仍是_test.go - 示例函数必须是
func ExampleXXX(),且末尾需有Output:注释,否则go test -run=Example不生效 - 三者(
Test*/Benchmark*/Example*)可共存于同一_test.go文件,但彼此独立触发
最容易被忽略的是:哪怕只是临时加了个 func testHelper() 在测试文件里,只要它没按规则命名,就不会被当作测试执行——而你可能以为它跑了。










