Skip to main content

Go: 标准库 testing

📅 2026-03-26 ✏️ 2026-03-26 Go 标准库 CS GO

1 · 标准库 testing#

testing 包本身其实不大,重点不是“教你怎么写测试”,而是提供一组被 go test 调用的运行时类型和辅助函数。

1.1 · 包的定位

  • go test 识别约定形式的函数,再把控制权交给 testing 包。
  • 测试文件必须是 *_test.go
  • 同包测试可访问未导出标识符;package xxx_test 属于黑盒测试,只能访问导出符号。
  • 更完整的执行规则看:go help testgo help testflag,见测试

1.2 · 约定入口

这四种函数形式更像 go test 约定的入口,不算 testing 包里很多“内容”,但需要知道:

形式作用对应核心类型
func TestXxx(*testing.T)普通测试T
func BenchmarkXxx(*testing.B)基准测试B
func FuzzXxx(*testing.F)模糊测试F
func ExampleXxx()示例测试无专门参数

1.3 · 核心类型

testing.T#

  • 普通测试上下文。
  • 常见能力:失败上报(Error / Fatal)、跳过(Skip)、日志(Log)、子测试(Run)、并行(Parallel)。
  • 常见理解:TestXxx 真正可用的能力,基本都挂在 *testing.T 上。

testing.B#

  • 基准测试上下文。
  • T 的测试控制能力之外,还带有基准相关能力。
  • 常见能力:循环基准(Loop 或旧式 N)、重置计时(ResetTimer)、子基准(Run)、并行基准(RunParallel)。

testing.F#

  • 模糊测试上下文。
  • 常见能力:添加种子(Add)、注册 fuzz target(Fuzz)。
  • fuzz target 里的失败/跳过仍然通过 *testing.T 处理。

testing.M#

  • 整个测试进程级别的控制对象。
  • 主要出现在 TestMain(m *testing.M) 里。
  • 核心用途:全局 setup / tear-down,最后通过 m.Run() 统一执行测试。

testing.TB#

  • T / B / F 共享的一组基础能力接口。
  • 读标准库或第三方测试辅助库源码时,经常会看到函数接收 testing.TB 而不是具体的 *testing.T

testing.PB#

  • b.RunParallel 使用的并行基准辅助对象。
  • 典型写法是 for pb.Next() { ... }

1.4 · 顶层辅助函数

这些是包级函数,比“怎么写某种测试”更像 testing 包自身的内容:

  • testing.Short():是否处于 go test -short 模式。
  • testing.Verbose():是否启用了详细输出。
  • testing.Testing():当前是否运行在测试环境中。
  • testing.Coverage():读取当前覆盖率。
  • testing.CoverMode():读取覆盖率模式。
  • testing.AllocsPerRun():统计某段代码平均分配次数,常用于性能/分配分析。

TestMain#

  • 形式:func TestMain(m *testing.M)
  • 作用:自定义整个测试程序的入口。
  • 常见场景:全局初始化、全局清理、需要控制主 goroutine 的逻辑。
  • 注意:调用 TestMain 时,flag.Parse() 还没自动执行;若依赖命令行参数,要手动调用。
  • 心智模型:TestMain 操作的是整个测试进程,而不是某一个测试用例。
func TestMain(m *testing.M) {
	// flag.Parse() // 如果这里要读取 flag
	os.Exit(m.Run())
}

1.6 · 与 go test 的关系#

  • -run:筛选 TestXxx,也可按 / 分层匹配子测试名。
  • -bench:筛选 BenchmarkXxx
  • -fuzz:启用并筛选 FuzzXxx
  • ExampleXxx 通过 // Output:// Unordered output: 校验输出;没有输出注释时通常只编译不执行。
  • fuzz 失败样例会写回 testdata/fuzz/<Name>;若目录不可写,则写到 build cache 的 fuzz cache。

1.7 · 一句话总结

testing 包的主体就是几种上下文类型(T / B / F / M / TB / PB)加少量包级辅助函数;至于“测试怎么组织、怎么命名、怎么跑”,更多是 go test 的约定和工作流。