Тип testing.F
Тип testing.F используется для написания fuzz-тестов в пакете testing. Он предоставляет методы для добавления начальных данных, выполнения fuzz-тестирования и контроля за процессом выполнения. Fuzz-тестирование позволяет автоматически генерировать случайные входные данные для поиска ошибок, паник и уязвимостей в коде.
Синтаксис
func FuzzFunction(f *testing.F) {
f.Add(initialData...)
f.Fuzz(func(t *testing.T, data ...interface{}) {
// test logic
})
}
Пример
Давайте напишем простой fuzz-тест для функции, которая преобразует строку в число:
package 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)
}
}
})
}
Результат выполнения кода при обнаружении ошибки:
"=== FAIL: FuzzStringToInt (0.00s)"
Пример
Рассмотрим пример с несколькими типами данных и проверкой на панику:
package 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]
}
})
}
Результат выполнения кода:
"=== PASS: FuzzCheckData (0.00s)"
Методы типа
Тип testing.F предоставляет следующие основные методы:
-
Add- добавляет начальные данные для fuzz-тестирования -
Fuzz- запускает fuzz-тестирование с переданной функцией -
Skip- пропускает выполнение теста с указанной причиной
Важные особенности
Fuzz-тесты выполняются в специальном режиме и могут генерировать миллионы входных данных для поиска ошибок. Тип testing.F автоматически сохраняет найденные значения, приводящие к ошибкам, для последующего воспроизведения. Это делает его мощным инструментом для обеспечения надежности кода.
Смотрите также
-
тип
testing.T,
который используется для написания обычных unit-тестов -
тип
testing.B,
который используется для написания бенчмарков -
тип
testing.M,
который используется для управления тестовым процессом -
функцию
testing.F.Add,
которая добавляет начальные данные для fuzz-теста