Go语言测试文件如何命名_Go测试文件规范说明

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

go语言测试文件如何命名_go测试文件规范说明

Go测试文件必须以 _test.go 结尾

Go 的 go test 命令只识别后缀为 _test.go 的文件,其他命名(如 test_xxx.goxxx_test.go.bak)会被完全忽略。这不是约定,是硬性规则。

  • 合法: calculator_test.gouser_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 自动发现并执行。大小写敏感,testXXXTESTXXX 都无效。

  • 正确示例:
    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* 规则

基准测试和示例函数的命名同样严格

如果要写性能测试或文档示例,命名规则一样不可妥协:

Artbreeder

Artbreeder

创建令人惊叹的插画和艺术

下载

立即学习go语言免费学习笔记(深入)”;

  • 基准测试函数必须是 func BenchmarkXXX(b *testing.B),文件仍是 _test.go
  • 示例函数必须是 func ExampleXXX(),且末尾需有 Output: 注释,否则 go test -run=Example 不生效
  • 三者(Test* / Benchmark* / Example*)可共存于同一 _test.go 文件,但彼此独立触发

最容易被忽略的是:哪怕只是临时加了个 func testHelper() 在测试文件里,只要它没按规则命名,就不会被当作测试执行——而你可能以为它跑了。

https://www.php.cn/faq/1982092.html

发表回复

Your email address will not be published. Required fields are marked *