golang-testing
SKILL.md
Go 测试模式
用于编写可靠、可维护测试的完整 Go 测试模式,遵循 TDD 方法论。
何时启用
- 编写新的 Go 函数或方法
- 为现有代码增加测试覆盖率
- 为性能关键代码建立基准测试
- 实现输入验证的模糊测试
- 在 Go 项目中遵循 TDD 工作流程
测试模式
| 模式 | 描述 | 参考 |
|---|---|---|
| TDD 方法论 | RED-GREEN-REFACTOR 循环 | test-tdd |
| 表格驱动测试 | Go 测试的标准模式 | test-table-driven |
| 子测试与并行 | 组织相关测试,并行执行 | test-subtests |
| 接口 Mock | 使用接口进行依赖注入和 mock | test-mocking |
| 基准测试 | 性能测试和内存分析 | test-benchmarks |
| 模糊测试 | 随机输入测试以发现边界情况 | test-fuzzing |
| 测试覆盖率 | 分析代码覆盖情况 | test-coverage |
Go 的 TDD 工作流程
RED → 先写失败的测试
GREEN → 编写最少代码使测试通过
REFACTOR → 在保持测试绿色的同时改善代码
REPEAT → 继续下一个需求
快速参考
基本测试
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Errorf("Add(2, 3) = %d; want %d", got, want)
}
}
表格驱动测试
func TestAdd(t *testing.T) {
tests := []struct {
name string
a, b int
expected int
}{
{"positive", 2, 3, 5},
{"negative", -1, -2, -3},
{"zero", 0, 0, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Add(tt.a, tt.b)
if got != tt.expected {
t.Errorf("got %d; want %d", got, tt.expected)
}
})
}
}
子测试与并行
func TestParallel(t *testing.T) {
tests := []struct{ name string }{
{"test1"}, {"test2"}, {"test3"},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel() // 并行执行
// 测试代码...
})
}
}
基准测试
func BenchmarkProcess(b *testing.B) {
for i := 0; i < b.N; i++ {
Process()
}
}
测试命令
# 执行所有测试
go test ./...
# 执行带覆盖率的测试
go test -coverprofile=coverage.out ./...
# 执行带竞态检测的测试
go test -race ./...
# 执行基准测试
go test -bench=. -benchmem ./...
# 执行模糊测试
go test -fuzz=FuzzParseJSON -fuzztime=30s ./...
最佳实践
应该做的
- 先写测试(TDD)
- 使用表格驱动测试以获得完整覆盖
- 测试行为,而非实现
- 在辅助函数中使用
t.Helper() - 对独立测试使用
t.Parallel() - 用
t.Cleanup()清理资源 - 使用描述情境的有意义测试名称
不应该做的
- 不要直接测试私有函数(通过公开 API 测试)
- 不要在测试中使用
time.Sleep()(使用 channels 或条件) - 不要忽略不稳定测试(修复或移除它们)
- 不要 mock 所有东西(可能时偏好集成测试)
- 不要跳过错误路径测试
覆盖率目标
| 代码类型 | 目标 |
|---|---|
| 关键业务逻辑 | 100% |
| 公开 API | 90%+ |
| 一般代码 | 80%+ |
| 生成的代码 | 排除 |
资源
Weekly Installs
4
Repository
caijiatao/skillsGitHub Stars
1
First Seen
Feb 25, 2026
Security Audits
Installed on
opencode4
gemini-cli4
amp4
github-copilot4
codex4
kimi-cli4