用途
golang-testing 是一套 Go 语言测试模式合集,用于指导开发者编写可靠、易于维护的测试,并遵循 TDD(测试驱动开发)方法论。其定位是测试实践参考,而非独立工具或框架。
该内容明确列出的适用时机(When to Activate):
- 编写新的 Go 函数或方法时
- 为已有代码补充测试覆盖时
- 为性能敏感的代码创建基准测试时
- 为输入校验实现模糊测试时
- 在 Go 项目中践行 TDD 工作流时
主要能力与覆盖主题
TDD 工作流
采用 RED-GREEN-REFACTOR 循环:RED(先写失败测试)→ GREEN(写最小代码让测试通过)→ REFACTOR(在测试保持通过的前提下改进代码)→ REPEAT(进入下一个需求)。文档以 Add 函数为例,给出从定义签名、写失败测试、运行验证 FAIL、写最简实现、运行验证 PASS 到重构的分步演示。
表驱动测试(Table-Driven Tests)
被描述为 Go 测试的标准模式,通过最小代码实现全面覆盖。示例涵盖普通数值用例,以及带有错误用例(wantErr)的 ParseConfig 测试,并配合 reflect.DeepEqual 进行结果比对。
子测试与子基准(Subtests and Sub-benchmarks)
给出用 t.Run 组织相关测试(如 Create/Get/Update/Delete)的写法;并演示并行子测试,其中包含 tt := tt 捕获循环变量以及 t.Parallel() 的用法。
测试辅助与资源管理
- 测试辅助函数:使用 t.Helper() 标记,配合 t.Cleanup() 做资源清理,示例为基于内存 SQLite 的 setupTestDB。
- 断言辅助:assertNoError、泛型 assertEqual[T comparable]。
- 临时文件与目录:使用 t.TempDir() 自动清理。
- Golden Files:将期望输出存放于 testdata/,通过 -update 标志更新 golden 文件。
Mocking
基于接口实现 mock:定义 UserRepository 接口,分别给出生产实现(PostgresUserRepository)与测试实现(MockUserRepository,含 GetUserFunc / SaveUserFunc 字段),并在 TestUserService 中演示注入使用。
基准测试(Benchmarks)
- 基础基准:b.ResetTimer() 排除准备时间;示例输出包含 ns/op、B/op、allocs/op。
- 不同规模基准:通过 b.Run 按 size 分组(100/1000/10000/100000)。
- 内存分配基准:对比字符串拼接的三种方式(+=、strings.Builder、strings.Join)。
模糊测试(Go 1.18+)
- 基础 fuzz:以 FuzzParseJSON 为例,通过 f.Add 添加种子语料,在 f.Fuzz 中校验「解析成功则重新编码应成功」的性质。运行命令为 go test -fuzz=FuzzParseJSON -fuzztime=30s。
- 多输入 fuzz:以 FuzzCompare 为例,校验 Compare(a, a) == 0 以及 Compare(a, b) 与 Compare(b, a) 符号相反的属性。
测试覆盖率
给出命令:go test -cover ./...、-coverprofile 生成覆盖率文件、go tool cover -html 浏览器查看、go tool cover -func 按函数查看、以及 -race 配合覆盖率。文档还列出覆盖率目标建议:关键业务逻辑 100%、公共 API 90%+、一般代码 80%+、生成代码排除。排除生成代码提到可用 build tags(go test -cover -tags=!generate ./...)。
HTTP Handler 测试
使用 httptest.NewRequest 与 httptest.NewRecorder,示例包含 HealthHandler 的状态码与响应体校验,以及表驱动的 API Handler 测试(覆盖 GET 成功、404、POST 创建等场景,含 Content-Type 设置)。
测试命令速查
包括:go test ./...、-v 详细输出、-run 指定测试、-run "TestUser/Create" 模式匹配、-race 竞态检测、-cover/-coverprofile 覆盖率、-short 仅短测试、-timeout 30s 超时、-bench=. -benchmem 基准、-fuzz 模糊测试、-count=10 重复运行以检测 flaky 测试。
CI/CD 集成
给出 GitHub Actions 示例:checkout、setup-go(go-version '1.22')、运行 go test -race -coverprofile=coverage.out ./...,并通过 go tool cover -func 解析 total 覆盖率、低于 80% 时退出失败。
最佳实践(文档明确列出)
DO:先写测试(TDD);用表驱动测试实现全面覆盖;测试行为而非实现;在辅助函数中使用 t.Helper();对独立测试使用 t.Parallel();用 t.Cleanup() 清理资源;使用能描述场景的有意义测试名。
DON'T:直接测试私有函数(应通过公共 API 测试);在测试中使用 time.Sleep()(应使用 channel 或条件);忽略 flaky 测试(修复或移除);mock 一切(可能时优先集成测试);跳过错误路径测试。
文档结尾强调:测试即文档,它们展示了代码应当如何被使用,应当清晰编写。
适用场景
Go 项目的单元测试编写与补充、以 TDD 方式开发新功能、性能关键路径的基准对比、输入校验类代码的模糊测试,以及将测试与覆盖率检查接入 CI/CD 流程。
限制与暂未提供的信息
资料未说明该技能的安装方式、依赖安装命令、收费模式、价格、许可证、版本号与平台支持范围,这些信息暂未提供。文中示例涉及的具体第三方库(如 sqlite3 驱动)与代码片段均按原始资料呈现,未作改动。