🟡 Средний · 2 очк. Тестирование
Как объявить и запустить fuzz-тест в Go?
A func TestFuzz(t *testing.T), запуск go test -run TestFuzz
B func FuzzXxx(f *testing.F) с f.Add() и f.Fuzz(); запуск go test -fuzz FuzzXxx
C func BenchmarkFuzz(b *testing.B), запуск go test -bench Fuzz
D func Fuzz(input []byte), запуск go fuzz ./...
Объяснение вопроса

Fuzz-тесты объявляются как функции с префиксом Fuzz и параметром *testing.F:

func FuzzReverse(f *testing.F) {
    // Seed-корпус: начальные примеры
    f.Add("hello")
    f.Add("мир")
    f.Add("")

    // Фаззер мутирует seed-данные
    f.Fuzz(func(t *testing.T, s string) {
        rev := Reverse(s)
        doubleRev := Reverse(rev)
        if s != doubleRev {
            t.Errorf("двойной реверс не равен оригиналу: %q", s)
        }
    })
}

Запуск:

  • go test -fuzz=FuzzReverse - запуск фаззинга (бесконечно, пока не найдет ошибку или Ctrl+C)
  • go test -fuzz=FuzzReverse -fuzztime=30s - ограничение по времени
  • go test ./... - без -fuzz fuzz-тесты выполняются только на seed-корпусе

Найденные "крашащие" входы сохраняются в testdata/fuzz/FuzzReverse/ и автоматически воспроизводятся при обычном go test.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.