通八洲科技

如何在Golang中引入测试模块_Golang测试包导入与使用实践

日期:2026-01-02 00:00 / 作者:P粉602998670
Go测试文件必须以_test.go结尾且与被测代码同包;测试函数须为func TestXxx(testing.T)签名;go test支持多种运行方式;testing.T非并发安全,需谨慎使用。

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

Go 的 go test 命令只会自动识别和运行后缀为 _test.go 的文件。如果命名为 utils_test.go,它会被识别;但写成 test_utils.goutils_test.go.bak 就完全不会执行。

func TestXxx(*testing.T) 是唯一被识别的测试函数签名

Go 不支持自定义测试函数名或参数类型。只有形如 func TestSomething(t *testing.T) 的函数才会被 go test 扫描到。常见错误包括:

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 可看详细输出,加 -run 可匹配测试函数名。

别忘了 testing.T 的并发安全限制

*testing.T 对象不是并发安全的——不能在 goroutine 中直接调用 t.Logt.Error,否则可能 panic 或输出错乱。

func TestConcurrentAdd(t *testing.T) {
    t.Parallel() // 允许与其他 Parallel 测试并发运行
    results := make(chan int, 10)
    for i := 0; i < 10; i++ {
        go func() {
            results <- Add(1, 1)
        }()
    }
    for i := 0; i < 10; i++ {
        if got := <-results; got != 2 {
            t.Errorf("expected 2, got %d", got) // 在主 goroutine 中调用
        }
    }
}

真正容易被忽略的是:测试文件里 import 的包,只要没被任何测试函数实际引用,Go 编译器会静默忽略——这意味着 _test.go 中写了 import "net/http" 却没用,不会报错,但后续加了 http 相关逻辑却忘记补 import,就会编译失败。检查方式很简单:go test -v -x 看实际执行的编译命令,或用 go list -f '{{.Imports}}' xxx_test.go 确认依赖是否完整。