Reviews Go test code for proper table-driven tests, assertions, and coverage patterns. Use when reviewing *_test.go files.
| 问题类型 | 参考文档 |
|---|---|
| 测试结构、命名 | references/structure.md |
| 模拟、接口 |
go
// 错误 - 重复代码
func TestAdd(t *testing.T) {
if Add(1, 2) != 3 {
t.Error(错误)
}
if Add(0, 0) != 0 {
t.Error(错误)
}
}
// 正确
func TestAdd(t *testing.T) {
tests := []struct {
name string
a, b int
want int
}{
{正数, 1, 2, 3},
{零值, 0, 0, 0},
{负数, -1, 1, 0},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Add(tt.a, tt.b)
if got != tt.want {
t.Errorf(Add(%d, %d) = %d, 期望 %d, tt.a, tt.b, got, tt.want)
}
})
}
}
go
// 错误
if got != want {
t.Error(结果错误)
}
// 正确
if got != want {
t.Errorf(GetUser(%d) = %v, 期望 %v, id, got, want)
}
// 复杂类型
if diff := cmp.Diff(want, got); diff != {
t.Errorf(GetUser() 不匹配 (-期望 +实际):\n%s, diff)
}
go
func TestFoo(t *testing.T) {
tests := []struct{...}
for _, tt := range tests {
tt := tt // 捕获变量(Go 1.22+ 不需要)
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// 测试代码
})
}
}
go
// 错误 - 手动清理,失败时跳过
func TestWithTempFile(t *testing.T) {
f, _ := os.CreateTemp(, test)
defer os.Remove(f.Name()) // 测试 panic 时跳过
}
// 正确
func TestWithTempFile(t *testing.T) {
f, _ := os.CreateTemp(, test)
t.Cleanup(func() {
os.Remove(f.Name())
})
}
for i := 0; i < b.N; i++ {
Process(data)
}
}
// 运行:go test -bench=BenchmarkProcess -benchmem
f.Fuzz(func(t *testing.T, input string) {
result, err := ParseInput(input)
if err != nil {
return // 无效输入是预期的
}
// 如果解析成功,重新编码应正常工作
if _, err := json.Marshal(result); err != nil {
t.Errorf(解析后 Marshal: %v, err)
}
})
}
// 运行:go test -fuzz=FuzzParseInput -fuzztime=30s
req := httptest.NewRequest(GET, /api/users/123, nil)
w := httptest.NewRecorder()
srv.ServeHTTP(w, req)
if w.Code != http.StatusOK {
t.Errorf(状态码 = %d, 期望 %d, w.Code, http.StatusOK)
}
}
func TestRender(t *testing.T) {
got := Render(input)
golden := filepath.Join(testdata, t.Name()+.golden)
if *update {
if err := os.WriteFile(golden, got, 0644); err != nil {
t.Fatalf(写入黄金文件: %v, err)
}
}
want, err := os.ReadFile(golden)
if err != nil {
t.Fatalf(读取黄金文件: %v(使用 -update 创建), err)
}
if !bytes.Equal(got, want) {
t.Errorf(输出不匹配:\n实际:\n%s\n期望:\n%s, got, want)
}
}
go
// 错误 - 测试私有状态
func TestUser(t *testing.T) {
u := NewUser(alice)
if u.id != 1 { // 测试内部字段
t.Error(ID 错误)
}
}
// 正确 - 测试行为
func TestUser(t *testing.T) {
u := NewUser(alice)
if u.ID() != 1 {
t.Error(ID 错误)
}
}
go
// 错误 - 测试相互干扰
var testDB = setupDB()
func TestA(t *testing.T) {
t.Parallel()
testDB.Insert(...) // 竞态条件!
}
// 正确 - 每个测试隔离
func TestA(t *testing.T) {
db := setupTestDB(t)
t.Cleanup(func() { db.Close() })
db.Insert(...)
}
go
// 错误
assert.Equal(t, want, got) // 期望 X 得到 Y - 哪个测试?
// 正确
assert.Equal(t, want, got, 更新后的用户名)
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 go-testing-code-review-1776089642 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 go-testing-code-review-1776089642 技能
skillhub install go-testing-code-review-1776089642
文件大小: 7.91 KB | 发布时间: 2026-4-14 13:22