go-test-gen - Go 单元测试生成器
智能分析 Go 源代码并生成符合项目规范的单元测试、基准测试和测试辅助代码。
Skill 元信息
- •名称: go-test-gen
- •版本: 1.0.0
- •适用语言: Go 1.24+
- •依赖: testify/assert, testify/require, testify/mock
使用方式
bash
# 基础用法 - 为指定文件生成测试 /go-test-gen <source_file> # 分析覆盖率并生成缺失的测试 /go-test-gen --coverage <source_file> # 生成基准测试 /go-test-gen --benchmark <source_file> # 更新已有测试(补充缺失的测试用例) /go-test-gen --update <test_file> # 生成 Mock 接口实现 /go-test-gen --mock <interface_name> <source_file> # 批量生成整个包的测试 /go-test-gen --package <package_path>
核心功能
1. 智能代码分析
- •解析函数签名、参数、返回值
- •识别错误处理路径(if err != nil)
- •检测边界条件(nil、空切片、零值)
- •分析依赖注入点(接口参数)
- •识别并发敏感函数(sync、channel)
2. 自动生成测试
- •表驱动测试: 多场景测试结构(3+ 场景时使用)
- •简单测试: 单一场景快速测试
- •并发测试: 竞态条件检测
- •边界测试: 自动添加 nil、空值、边界值用例
- •错误路径: 为每个错误返回生成测试
3. 项目规范遵循
自动读取并应用项目配置:
- •
.golangci.yml→ 识别启用的 linters - •
go.mod→ 检测 Go 版本和依赖 - •
CLAUDE.md→ 读取项目测试规范
强制应用的规范:
- •✅ AAA 模式(Arrange-Act-Assert)
- •✅ testify 断言(assert/require)
- •✅ 并行测试(t.Parallel())
- •✅ 测试辅助函数(t.Helper())
- •✅ 资源清理(t.Cleanup())
- •✅ 描述性测试名称(snake_case)
4. 基准测试生成
自动识别性能敏感函数并生成:
- •基础基准测试(b.ReportAllocs())
- •并行基准测试(b.RunParallel())
5. Mock 代码生成
为接口生成 testify/mock 实现,包含:
- •Mock 结构体和方法实现
- •测试辅助函数
6. 覆盖率驱动
- •运行
go test -coverprofile - •解析覆盖率报告
- •识别未覆盖的函数和分支
- •生成针对性的测试用例
工作流程
code
1. 解析命令参数 ├─ 确定源文件路径和生成模式 └─ 读取项目配置文件 2. 分析源代码 ├─ 使用 Go AST 解析源文件 ├─ 提取函数签名和文档注释 └─ 分析函数复杂度和依赖 3. 检查已有测试 ├─ 查找 *_test.go 文件 └─ 识别缺失的测试场景 4. 生成测试代码 ├─ 选择测试模板(表驱动/简单/并发) ├─ 生成测试用例结构 └─ 应用项目规范 5. 验证和优化 ├─ 格式化生成的代码(gofmt) ├─ 运行 golangci-lint 检查 └─ 运行生成的测试并报告覆盖率 6. 输出结果 └─ 显示生成的文件、测试运行结果和改进建议
测试模板结构
表驱动测试
go
func Test{FunctionName}(t *testing.T) {
t.Parallel()
tests := []struct {
name string
// ... 参数字段
want {ReturnType}
wantErr bool
}{
{name: "scenario_1", /* ... */ },
{name: "scenario_2", /* ... */ },
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// Arrange, Act, Assert
})
}
}
简单测试
go
func Test{FunctionName}_{Scenario}(t *testing.T) {
t.Parallel()
// Arrange
// Act
// Assert (使用 assert/require)
}
并发安全测试
go
func Test{FunctionName}_ConcurrentSafe(t *testing.T) {
t.Parallel()
var wg sync.WaitGroup
const goroutines = 100
for i := 0; i < goroutines; i++ {
wg.Add(1)
go func(idx int) {
defer wg.Done()
// Act & Assert
}(i)
}
wg.Wait()
}
基准测试
go
func Benchmark{FunctionName}(b *testing.B) {
// Arrange
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
{FunctionName}(/* params */)
}
}
func Benchmark{FunctionName}_Parallel(b *testing.B) {
b.ReportAllocs()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
{FunctionName}(/* params */)
}
})
}
测试场景生成策略
根据函数签名自动生成测试场景:
| 函数特征 | 生成场景 |
|---|---|
| 接受指针参数 | nil 指针、有效指针 |
| 接受切片参数 | nil 切片、空切片、单元素、多元素 |
| 接受字符串参数 | 空字符串、普通字符串、特殊字符 |
| 接受数值参数 | 零值、负数、正数、边界值 |
| 返回 error | 成功场景、各种错误场景 |
| 返回多值 | 验证所有返回值 |
边界条件自动检测:
go
// 示例:为这个函数生成边界测试
func ProcessUsers(users []User, limit int) ([]User, error)
// 自动生成场景:
// - users == nil
// - users == []User{}
// - len(users) == 1
// - len(users) == limit
// - len(users) > limit
// - limit == 0, limit < 0, limit > len(users)
项目规范检测
读取 .golangci.yml
识别启用的 linters 并自动应用:
- •
paralleltest→ 生成t.Parallel() - •
testifylint→ 使用assert/require - •
thelper→ 添加t.Helper() - •
errcheck→ 检查所有 error
读取 CLAUDE.md
从项目文档提取测试规范并自动遵循。
生成报告格式
code
📊 测试生成报告
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 已生成文件: {file_path}
📝 生成的测试函数 ({count} 个):
• TestFunction1_Scenario1
• TestFunction1_Scenario2
• TestFunction2
🧪 运行测试:
$ go test ./{package} -run TestFunction
📈 覆盖率变化:
{file}: {before}% → {after}% (+{delta}%)
💡 改进建议:
• {suggestion_1}
• {suggestion_2}
⚡ 下一步:
/go-test-gen --benchmark {file}
使用注意事项
限制
- •泛型函数 - 需手动补充类型实例化
- •复杂接口 Mock - 可能需要手动调整
- •仅测试导出函数 - 黑盒测试优先
- •并发测试 - 可能需要调优 goroutine 数量
最佳实践
- •✅ 增量生成(新增函数后立即生成测试)
- •✅ 覆盖率驱动(定期运行
--coverage检查) - •✅ Review 生成的代码(测试是起点,不是终点)
- •⚠️ 复杂业务逻辑需手动补充测试
- •❌ 不能完全替代手工编写测试
相关资源
- •详细使用指南: README.md
- •示例代码: examples/
- •项目测试策略: ../../CLAUDE.md
- •testify 文档: https://github.com/stretchr/testify
Skill 版本: 1.0.0 创建时间: 2026-02-04 适用于: onebot-go-sdk 项目