Что такое fuzzing в Go?

Middle+
521 просмотров
AFK Offer AI

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.

Лучше всего находит баги в парсерах, валидаторах, сериализаторах — любом коде, обрабатывающем внешний ввод.

Следующий вопрос

Что такое two pointer technique?