测试
Outlinks (0)
No outlinks found
Backlinks (1)
Backlinks (1)
1 · 测试
1.1 · go test 命令与标志#
用法:go test [build/test flags] [packages] [flags & test binary flags]
- 对指定包做自动化测试,输出每包摘要(
ok/FAIL+ 耗时),失败时再打详细输出。 - 会编译
*_test.go;以_或.开头的文件被忽略。testdata目录被忽略,可放测试数据。
两种模式:
| 模式 | 触发 | 缓存 |
|---|---|---|
| 本地目录 | 无包参数(go test / go test -v) | 否 |
| 包列表 | 显式包(go test . / ./... / math) | 是 |
缓存:仅当仅用可缓存标志时生效(如 -run、-bench、-v、-count、-timeout 等)。禁用缓存常用 -count=1。
标志(go help test、go help testflag):
| 标志 | 说明 |
|---|---|
| 编译与输出 | |
-c | 只编译不运行,生成 pkg.test 二进制 |
-o file | 指定输出二进制路径 |
-json | 输出 JSON 格式(test2json 编码) |
-exec xprog | 用 xprog 运行二进制(如 ssh remote、qemu-arm) |
-args | 之后的参数原样传给测试二进制(包列表须在 -args 前) |
| 运行控制 | |
-v | 详细输出 |
-short | 可配合 testing.Short() 跳过耗时测试 |
-count n | 执行次数;-count=1 可禁用缓存 |
-timeout d | 整个二进制超时 panic,默认 10m,0 禁用 |
-cpu 1,2,4 | 按 GOMAXPROCS 组合重复运行 |
| Test | |
-run regexp | 只运行匹配的 TestXxx(支持 / 匹配子测试) |
-parallel n | t.Parallel() 的最大并发数 |
| Benchmark | |
-bench regexp | 运行匹配的基准;默认不跑,-bench . 跑全部 |
-benchtime t | 每个基准时长,默认 1s;100x 为固定 100 次 |
-benchmem | 输出内存分配统计 |
| Fuzz | |
-fuzz regexp | 对匹配的 FuzzXxx 启用随机输入(默认只跑种子) |
-fuzztime t | 每个模糊测试时长 |
| 分析 | |
-cover / -covermode / -coverpkg | 覆盖率 |
-cpuprofile / -memprofile | 写出 profile 给 go tool pprof |
对 test 二进制可用 test. 前缀,如 pkg.test -test.v -test.cpuprofile=out。
go test -v -args -x # -args 后原样传测试二进制
pkg.test -test.v -test.cpuprofile=prof.out # 直接跑二进制时用 test. 前缀
1.2 · Mock vs. Stub#
统称 Test Double(测试替身):Dummy(填参数,从不使用)、Fake(有真实实现但走捷径,如内存数据库)、Stub、Mock。
| Stub | Mock | |
|---|---|---|
| 本质 | 提供预设数据,替代真实依赖 | 预设行为期望,验证交互是否发生 |
| 测试什么 | 状态(断言被测对象的结果) | 行为(断言依赖是否被正确调用) |
| 能否让测试失败 | 不能,只辅助测试运行 | 能,期望不满足则测试失败 |
| 例子 | 返回假数据代替数据库查询 | 验证邮件发送服务被调用了一次 |
1.3 · 测试相关库
- 断言:stretchr/testify(assert、require)
- HTTP:
- net/http/httptest
- 外部 API mock:h2non/gock
- jarcoal/httpmock
- DB:
- Mock/Stub:Mock=接口替换,Stub=函数/占位
- Mocks Aren’t Stubs
- golang/mock
- prashantv/gostub
- bouk/monkey(需
-gcflags=-l,非线程安全) - agiledragon/gomonkey
- BDD:
- goconvey(Convey/So、SkipConvey、FocusConvey)
- Assertions
- Convey() 定义 scope/context,So() 做断言;支持 custom assertions(按指定函数签名实现)
- SkipConvey() 替换 Convey() 跳过整个 scope;SkipSo() 跳过断言;FocusConvey 仅运行标记的 scope
- 默认 test fail/panic 停止当前 scope;可传 FailureContinues;Reset() 在同 scope 每个 Convey() 结束后执行
1.4 · 更好的测试
-
覆盖率:
go test -cover;常见要求约 80%。 -
Stub 场景:屏蔽(不想引入数据库等重资源)、补齐(依赖的上下游未实现);gomock 支持对参数、返回值、调用次数、顺序打桩。
-
技巧:inline 接口(caller 定义接口并注入,便于 mock);辅助断言(assert/ok/equals)见 benbjohnson/testing、Go 测试技巧、povilasv。
-
可测设计:接口抽象 + 依赖注入(如 google/wire);SOLID(单一职责、开闭、里式替换、接口隔离、依赖反转)。Absolute unit test、Learn Go with Tests、TestComments。
1.5 · 参考链接
官方:
- go help test
- Testing flags
- test2json(-json 编码)
- Subtests and Sub-benchmarks
- go.dev/doc/fuzz
- draft-fuzzing
- design/14313-benchmark-format
- golang.org/x/perf/cmd
Mock/Stub:
技巧与可测性:
- benbjohnson/testing
- Go 测试技巧
- povilasv
- wire
- Absolute unit test
- Learn Go with Tests
- TestComments
- Integration testing with Docker
- Fuzzing in Go
- 最佳实践
演讲: