writing-go-tests 是一个 Go 语言测试相关的技能,来源于 sammcj/agentic-coding,其用途是在编写或修改 Go 测试文件、或就 Go 测试策略提供建议时,应用当前公认的 Go 测试最佳实践。该技能的 SKILL.md 提供可操作的规则,详细的实现模式、代码示例、设计理由与生产系统参考则收录在配套文档 go-testing-best-practices.md 中。
主要能力(以规则形式给出):
一、测试组织 将测试文件与源代码放在一起,使用 *_test.go 命名;单元测试未导出函数时使用内部测试(同一 package);集成测试和示例使用外部测试(package foo_test)。当测试文件超过 500-800 行时,按功能拆分(如 handler_auth_test.go、handler_validation_test.go)。
二、表驱动测试 相比基于切片的表,优先使用基于 map 的表,这样可以自动获得唯一的测试名称;使用描述性的测试用例名称,使其出现在失败输出中。完整模式与示例见详细指南。
三、并发测试 使用 testing/synctest 进行确定性并发测试(Go 1.24+),可消除基于时间的易波动测试,并将运行时间从秒级降到微秒级。对于传统的并行测试,始终在测试函数中首先调用 t.Parallel()。
四、断言与比较 复杂比较使用 google/go-cmp 的 cmp.Diff();简单测试使用标准库即可;需要更丰富断言时,Testify 是主流的第三方框架。
五、Mock 与测试替身 优先使用真实依赖做集成测试,而非重度 Mock;数据库/服务集成测试使用 Testcontainers;确需 Mock 时,优先使用简单的基于函数的测试替身而非代码生成;采用基于接口的设计(“接收接口,返回结构体”)。
六、覆盖率目标 以 70-80% 覆盖率作为务实目标,关注有意义的测试而非百分比指标;使用 go test -cover 和 go tool cover -html 进行分析。
七、测试夹具 使用 testdata 目录存放测试夹具(Go 工具链会自动忽略);对复杂输出验证实现 golden file 测试;对复杂测试数据使用函数式 builder 模式。
八、辅助函数与清理 辅助函数始终用 t.Helper() 标记,以获得准确的错误报告;使用 t.Cleanup() 进行资源清理(在测试中优于 defer)。
九、基准测试(Go 1.24+) 优先使用 B.Loop() 方法(可防止编译器优化);结合 benchstat 做统计分析;使用 -benchmem 进行内存分析。
十、命名约定 测试函数:Test*、Benchmark*、Fuzz*、Example*(前缀后首字母大写);实际值与期望值使用 got 和 want;表驱动测试中使用描述性测试用例名称。
集成测试与单元测试方面,建议通过环境变量区分(优先于 build tags),具体实现模式见详细指南。
使用方式:该技能在编写或修改 Go 测试文件、或提供 Go 测试策略建议时触发应用。需要在以下情形时加载 go-testing-best-practices.md:需要表驱动测试、Mock 模式、golden 文件、辅助函数或基准测试的完整代码示例;需要 testing/synctest 并发测试模式的详细说明;需要了解为何优先采用某些模式的理由;需要生产系统示例与统计数据(Kubernetes、Docker、Uber、Netflix、ByteDance);需要关于测试框架选择(Testify、GoMock、Testcontainers)的背景;需要全面的覆盖率策略与工具细节;需要结合容器化的集成测试模式。
适用场景:Go 项目的测试编写与维护、测试策略咨询、测试代码评审与重构。
限制与缺失信息:该技能基于资料中的规则清单,不提供具体的运行命令步骤(除 go test -cover、go tool cover -html、-benchmem 等工具参数外);技能本身是否收费、价格、具体版本要求(除 Go 1.24+ 的并发与基准测试特性标注外)、支持的平台与集成方式,资料中暂未提供。