AgentSkillsCN

Go Test Gen

Go Test生成器

SKILL.md

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}

使用注意事项

限制

  1. 泛型函数 - 需手动补充类型实例化
  2. 复杂接口 Mock - 可能需要手动调整
  3. 仅测试导出函数 - 黑盒测试优先
  4. 并发测试 - 可能需要调优 goroutine 数量

最佳实践

  • ✅ 增量生成(新增函数后立即生成测试)
  • ✅ 覆盖率驱动(定期运行 --coverage 检查)
  • ✅ Review 生成的代码(测试是起点,不是终点)
  • ⚠️ 复杂业务逻辑需手动补充测试
  • ❌ 不能完全替代手工编写测试

相关资源


Skill 版本: 1.0.0 创建时间: 2026-02-04 适用于: onebot-go-sdk 项目