Метод testing.F.Add

Метод testing.F.Add используется для добавления значений в корпус фаззинга. Он принимает один или несколько аргументов, которые должны соответствовать типам параметров целевой функции, передаваемой в f.Fuzz. Эти значения служат начальными данными для генерации новых тестовых случаев и помогают направлять процесс фаззинга в нужные области.

Синтаксис

gofunc (f *testing.F) Add(args ...interface{})

Пример

Давайте рассмотрим базовый пример использования метода Add для добавления начальных данных в корпус фаззинга:

gopackage main

import (
  "testing"
)

func FuzzExample(f *testing.F) {
  // Добавляем начальные данные в корпус фаззинга
  f.Add(1, "hello")
  f.Add(2, "world")
  f.Add(3, "test")
  
  f.Fuzz(func(t *testing.T, num int, str string) {
    // Проверяем, что строка не пустая
    if str == "" {
      t.Errorf("empty string with num: %d", num)
    }
  })
}

В этом примере мы добавляем три набора значений, которые будут использоваться как начальные данные для фаззинга.

Пример

Покажем пример использования Add с различными типами данных:

gopackage main

import (
  "testing"
)

func FuzzTypes(f *testing.F) {
  // Добавляем значения разных типов
  f.Add(int64(100))
  f.Add(uint(50))
  f.Add(float64(3.14))
  f.Add(true)
  f.Add([]byte("test data"))
  
  f.Fuzz(func(t *testing.T, data []byte) {
    // Проверяем, что данные не слишком большие
    if len(data) > 1024 {
      t.Errorf("data too large: %d bytes", len(data))
    }
  })
}

Пример

Рассмотрим практический пример, где мы добавляем важные граничные значения для тестирования:

gopackage main

import (
  "testing"
)

func FuzzDivide(f *testing.F) {
  // Добавляем граничные значения
  f.Add(10, 2)
  f.Add(0, 5)
  f.Add(-5, 3)
  f.Add(1, 1)
  f.Add(100, 0) // Пограничный случай - деление на ноль
  
  f.Fuzz(func(t *testing.T, a, b int) {
    if b == 0 {
      return // Пропускаем деление на ноль
    }
    
    result := a / b
    // Проверяем, что результат не равен бесконечности
    if result < -1000 || result > 1000 {
      t.Errorf("result out of range: %d / %d = %d", a, b, result)
    }
  })
}

В этом примере мы специально добавляем случай с делением на ноль, чтобы фаззинг мог исследовать поведение функции в этой ситуации.

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

  • метод testing.F.Fuzz,
    который выполняет основную логику фаззинга
  • метод testing.F.Skip,
    который пропускает выполнение фазз-теста
  • структуру testing.T,
    которая используется для управления тестами
  • пакет testing/fuzz,
    содержащий документацию по фаззингу в Go