如何在 Go 中正确编写和运行测试文件

go 测试文件必须以 `_test.go` 结尾,且需包含符合规范的 `testxxx` 函数;否则 `go test` 会提示 “no test files”。本文详解命名规则、目录结构及运行命令。

在 Go 中,测试不是靠文件名随意定义的,而是由严格的命名约定和包结构共同决定的。你当前的文件名为 reverseTest.go,这不符合 Go 测试框架的识别规则——它只会扫描以 _test.go 结尾的源文件。

✅ 正确做法是:将文件重命名为 reverse_test.go(注意下划线 _ 和小写 test),并确保其与被测代码位于同一包、同一目录中。例如,若 Reverse 函数定义在 reverse.go 中(package main),那么测试文件也应为:

// reverse_test.go
package main

import "testing"

func TestReverse(t *testing.T) {
    cases := []struct {
        in, want string
    }{
        {"Hello, world", "dlrow ,olleH"},
        {"Hello, 世界", "界世 ,olleH"},
        {"", ""},
    }

    for _, c := range cases {
        got := Reverse(c.in) // 注意:Reverse 必须是 exported(首字母大写)且在同一包中可见
        if got != c.want {
            t.Errorf("Reverse(%q) == %q, want %q", c.in, got, c.want)
        }
    }
}

⚠️ 关键注意事项:

  • Re

    verse 函数必须导出(即命名为 Reverse 而非 reverse),否则测试无法调用;
  • 测试文件和被测代码必须同属一个包(如均为 package main),且位于同一目录;
  • 文件名必须严格为 xxx_test.go(不能是 xxxTest.go、test_xxx.go 或 reversetest.go);
  • 若项目含多个子包,可使用 go test -v ./... 递归运行所有子目录下的测试。

运行命令示例:

# 在包根目录下运行当前包的测试
go test -v

# 运行当前包及其所有子包的测试
go test -v ./...

# 检查是否识别到测试(不执行,仅列出)
go test -list=.

若仍提示 no test files,请执行 ls *.go 确认文件名是否已更正,并检查 go list ./... 是否能正常列出该包。遵循以上规范,即可让 Go 测试框架准确发现并执行你的测试用例。