SuperAPI AI 工具集

golang-unit-testing

测试与质量

查看项目

更新于 10-15 20:32

技能介绍

用途:为 Go 项目编写单元测试与 handler 测试,重点测试有风险的行为而非私有细节,优先使用清晰的表驱动测试而非脆弱的测试套件。

技术栈与范围:testing(Test*、t.Run、t.Helper)、httptest(内存中 HTTP 请求)、Gin(gin.New()、测试模式、真实 handler)、fakes(在边界处模拟 repo、clock、bus 等端口)。仅当项目已依赖 testify 时才使用它。并发代码在受影响的包上使用 -race 运行。

优先覆盖:授权与归属、校验与 HTTP 状态码、变更与领域错误(404、409)、已发生的回归(bug 转测试)、纯 helper 与策略。

表驱动测试:用 name 描述行为与条件,各 case 相互独立、无隐式全局顺序,共享断言使用 t.Helper()。

Gin handler 测试:设置 gin.SetMode(gin.TestMode),用 gin.New() 构建最小必要路由(真实 auth 中间件加 fake 依赖),通过 httptest.NewRequest 与 httptest.NewRecorder 调用 ServeHTTP;当中间件重要时优先用 ServeHTTP 而非仅 CreateTestContext;比较状态码与 JSON 相关字段,而非脆弱的完整 body。

Fakes 与边界:在边界定义接口(repository、mailer),测试中使用内存 fake;不要 mock 被测系统本身;时钟、UUID、随机数应注入以保证确定性;真实数据库留给集成测试,并按测试隔离 schema 或事务。

并发与 flaky:对含 goroutine 的包运行 go test -race;避免 time.Sleep,改用 channel、条件或注入时钟;等待事件的测试使用 context 超时;清理全局状态。

组织方式:单元测试放在 internal/service/service_test.go、internal/http/handlers/handler_test.go 等;测试公共 API 时用外部 _test 包,需要内部白盒时谨慎使用内部包;fixtures 保持小巧,用 builder 而非复制巨大 JSON。

反模式:无 t.Run 的单一巨型测试、把不稳定错误消息当契约断言、依赖真实网络或时钟、只测授权 happy path、为内部类型生成过多 mock、新增并发代码忽略 -race。

完成标准:变更风险已覆盖(授权、校验、错误)、表驱动可读且确定、契约重要时通过 HTTP 测试 handler、fake 仅在边界、受影响的包 go test(并发时加 -race)通过。