测试辅助
wescode 为测试开发提供全方位的 AI 辅助,从测试用例生成到测试策略设计,帮助你构建可靠的测试体系。
测试生成
自动生成测试
选中函数或文件,AI 自动生成测试用例:
- 表驱动测试:Go 惯用的 table-driven 测试风格
- 边界覆盖:零值、空值、最大值、负数等边界
- 错误路径:所有可能的错误返回
- 并发安全:竞态条件测试
生成策略
AI 根据函数特征选择测试策略:
| 函数类型 | 测试策略 |
|---|---|
| 纯计算函数 | 输入/输出对照表 |
| HTTP Handler | httptest + 请求/响应验证 |
| 数据库操作 | testcontainers + 真实 DB |
| 文件操作 | t.TempDir() + 临时文件 |
| 并发代码 | 多 goroutine + sync.WaitGroup |
| 时间依赖 | clock mock 注入 |
单元测试
Go 测试最佳实践
AI 生成符合 Go 惯例的测试:
// AI 生成的典型 Go 表驱动测试结构
func TestCalculateTotal(t *testing.T) {
tests := []struct {
name string
items []Item
discount float64
want float64
wantErr bool
}{
{
name: "正常计算",
items: []Item{{Price: 100, Qty: 2}},
discount: 0.1,
want: 180,
},
{
name: "空列表",
items: nil,
want: 0,
},
{
name: "折扣超范围",
items: []Item{{Price: 100, Qty: 1}},
discount: 1.5,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := CalculateTotal(tt.items, tt.discount)
if (err != nil) != tt.wantErr {
t.Fatalf("error = %v, wantErr %v", err, tt.wantErr)
}
if got != tt.want {
t.Errorf("got %v, want %v", got, tt.want)
}
})
}
}
Mock 生成
AI 可以辅助生成 Mock:
- 接口 Mock:为接口生成测试替身
- HTTP Mock:httptest.Server 模拟外部服务
- 数据库 Mock:sqlmock / 测试容器
- 文件系统 Mock:afero / 临时目录
集成测试
API 集成测试
AI 生成完整的 API 集成测试:
- 启动测试服务器
- 构造请求和认证
- 验证响应状态码和体
- 验证数据库状态变更
- 清理测试数据
数据库集成测试
使用真实数据库的测试:
- testcontainers 启动临时数据库
- 执行迁移脚本
- 运行测试用例
- 自动清理
测试隔离
AI 确保测试之间相互独立:
- 每个测试使用独立数据
- 测试后清理副作用
- 并行测试不互相影响
- 固定时间种子避免时间依赖
测试覆盖率
覆盖率分析
AI 分析覆盖率报告并建议补充:
示例提问:
"coverage.html 显示 auth 包只有 45% 覆盖率,帮我分析缺什么"
AI 会:
1. 识别未覆盖的分支
2. 分析哪些路径最重要
3. 按优先级生成缺失的测试
4. 标注可以跳过的 trivial 路径
有意义的覆盖率
AI 会区分有意义和无意义的覆盖:
- 应该覆盖:业务逻辑、错误处理、边界条件
- 可以跳过:简单 getter/setter、日志语句、panic 不可达路径
TDD 辅助
红绿重构
AI 支持 TDD 工作流:
- 红(Red):根据需求先写失败的测试
- 绿(Green):写最少的代码让测试通过
- 重构(Refactor):改进实现保持测试绿色
测试先行
在 Chat 中描述需求,AI 会:
- 先生成测试用例(定义预期行为)
- 再生成实现代码(满足测试)
- 验证所有测试通过
测试策略
测试金字塔
AI 帮助建立合理的测试层次:
╱╲
╱ ╲ E2E 测试(少量关键路径)
╱────╲
╱ ╲ 集成测试(API、DB、外部服务)
╱────────╲
╱ ╲ 单元测试(大量、快速、独立)
╱────────────╲
测试命名
AI 生成清晰的测试名称:
Test<函数>_<场景>_<预期>格式- 中文描述让意图更清晰
- 子测试分组相关用例
测试数据管理
- Fixture:预定义的测试数据文件
- Factory:按需生成的测试对象
- Builder:链式构建复杂测试对象
- Golden File:快照对比测试
QualityGate 集成
L0 自动验证
代码变更后自动运行:
go vet静态分析- 相关测试执行
- 覆盖率检查
L1 构建验证
- 全包编译通过
- lint 检查通过
- 增量测试执行
L2 验证命令
AI 自动选择合适的验证命令:
go test ./...go test -race ./...go test -count=100 ./...(稳定性)
特殊测试场景
并发测试
// AI 生成的并发安全测试
func TestCache_ConcurrentReadWrite(t *testing.T) {
c := NewCache()
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
wg.Add(2)
go func(key string) {
defer wg.Done()
c.Set(key, "value")
}(fmt.Sprintf("key-%d", i))
go func(key string) {
defer wg.Done()
c.Get(key)
}(fmt.Sprintf("key-%d", i))
}
wg.Wait()
}
性能基准测试
func BenchmarkProcess(b *testing.B) {
data := generateTestData(1000)
b.ResetTimer()
for i := 0; i < b.N; i++ {
Process(data)
}
}
模糊测试
func FuzzParseInput(f *testing.F) {
f.Add("normal input")
f.Add("")
f.Add("特殊字符!@#quot;)
f.Fuzz(func(t *testing.T, input string) {
_, err := ParseInput(input)
if err != nil {
// 错误是预期的,只要不 panic
return
}
})
}
注意事项
- 测试应该快速、独立、可重复
- 避免测试之间有依赖关系
- Mock 外部服务,不在测试中调用真实外部 API
- 测试代码也需要保持整洁
- 不要为了覆盖率而写无意义的测试
- 优先测试业务关键路径和容易出错的边界