Fuzzing (Go 1.18+) — автоматическое тестирование со случайными входными данными. Go генерирует входы и ищет паники, крэши, зависания.
func FuzzParseJSON(f *testing.F) {
// Seed corpus — начальные примеры
f.Add([]byte({"name": "test"}))
f.Add([]byte({}))
f.Add([]byte([]))
f.Fuzz(func(t *testing.T, data []byte) {
var result map[string]any
err := json.Unmarshal(data, &result)
if err != nil {
return // ошибка парсинга — ок
}
// Если распарсилось — должно сериализоваться обратно
_, err = json.Marshal(result)
if err != nil {
t.Errorf("marshal failed after unmarshal: %v", err)
}
})
}
Запуск:
go test -fuzz=FuzzParseJSON -fuzztime=30s
Найденные крэш-кейсы сохраняются в testdata/fuzz/FuzzParseJSON/ и автоматически включаются в обычный go test.
Лучше всего находит баги в парсерах, валидаторах, сериализаторах — любом коде, обрабатывающем внешний ввод.