Go: 标准库 testing
Outlinks (1)
Backlinks (0)
No backlinks found
1 · 标准库 testing#
testing 包本身其实不大,重点不是“教你怎么写测试”,而是提供一组被 go test 调用的运行时类型和辅助函数。
1.1 · 包的定位
go test识别约定形式的函数,再把控制权交给testing包。- 测试文件必须是
*_test.go。 - 同包测试可访问未导出标识符;
package xxx_test属于黑盒测试,只能访问导出符号。 - 更完整的执行规则看:
go help test、go 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 的约定和工作流。