Тип testing.F

Тип testing.F используется для написания fuzz-тестов в пакете testing. Он предоставляет методы для добавления начальных данных, выполнения fuzz-тестирования и контроля за процессом выполнения. Fuzz-тестирование позволяет автоматически генерировать случайные входные данные для поиска ошибок, паник и уязвимостей в коде.

Синтаксис

gofunc FuzzFunction(f *testing.F) {
  f.Add(initialData...)
  f.Fuzz(func(t *testing.T, data ...interface{}) {
    // test logic
  })
}

Пример

Давайте напишем простой fuzz-тест для функции, которая преобразует строку в число:

gopackage main

import (
  "strconv"
  "testing"
)

func FuzzStringToInt(f *testing.F) {
  f.Add("123")
  f.Add("456")

  f.Fuzz(func(t *testing.T, s string) {
    result, err := strconv.Atoi(s)
    if err == nil {
      if result < 0 {
        t.Errorf("expected non-negative number, got %d", result)
      }
    }
  })
}

Результат выполнения кода при обнаружении ошибки:

go"=== FAIL: FuzzStringToInt (0.00s)"

Пример

Рассмотрим пример с несколькими типами данных и проверкой на панику:

gopackage main

import (
  "testing"
)

func FuzzCheckData(f *testing.F) {
  f.Add(42, "hello", []byte{1, 2, 3})

  f.Fuzz(func(t *testing.T, num int, s string, data []byte) {
    if num < 0 {
      t.Logf("negative number: %d", num)
    }

    if len(data) > 100 {
      t.Errorf("data too large: %d bytes", len(data))
    }

    // Potential panic if s is empty
    if s != "" {
      _ = s[0]
    }
  })
}

Результат выполнения кода:

go"=== PASS: FuzzCheckData (0.00s)"

Методы типа

Тип testing.F предоставляет следующие основные методы:

Важные особенности

Fuzz-тесты выполняются в специальном режиме и могут генерировать миллионы входных данных для поиска ошибок. Тип testing.F автоматически сохраняет найденные значения, приводящие к ошибкам, для последующего воспроизведения. Это делает его мощным инструментом для обеспечения надежности кода.

Смотрите также

  • тип testing.T,
    который используется для написания обычных unit-тестов
  • тип testing.B,
    который используется для написания бенчмарков
  • тип testing.M,
    который используется для управления тестовым процессом
  • функцию testing.F.Add,
    которая добавляет начальные данные для fuzz-теста