Метод testing.F.Add
Метод testing.F.Add используется для добавления значений в корпус фаззинга. Он принимает один или несколько аргументов, которые должны соответствовать типам параметров целевой функции, передаваемой в f.Fuzz. Эти значения служат начальными данными для генерации новых тестовых случаев и помогают направлять процесс фаззинга в нужные области.
Синтаксис
func (f *testing.F) Add(args ...interface{})
Пример
Давайте рассмотрим базовый пример использования метода Add для добавления начальных данных в корпус фаззинга:
package 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 с различными типами данных:
package 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))
}
})
}
Пример
Рассмотрим практический пример, где мы добавляем важные граничные значения для тестирования:
package 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