Табличные тесты через пакет testing и go test
Содержание курса
Таблица тестовых случаев: срез анонимных структур с name, input, expected
Одна тест-функция с хардкодом Square(3) == 9 — это слабое покрытие. Что насчёт нуля, отрицательного числа, большого значения? Дублировать блоки if для каждого случая неудобно: при изменении логики проверки придётся редактировать их все.
Решение — описать случаи данными, а не кодом. В Go для этого используют срез анонимных структур:
tests := []struct {
name string
input int
expected int
}{
{name: "zero", input: 0, expected: 0},
{name: "positive", input: 3, expected: 9},
{name: "negative", input: -2, expected: 4},
{name: "large", input: 100, expected: 10000},
}
Здесь нет никакого специального синтаксиса тестового фреймворка — это обычный срез структур, объявленный прямо внутри функции. Тип структуры анонимный: Go не требует давать ему имя, если он используется только в одном месте.
Важно понять, почему поля называются именно так и имеют именно такие типы. name — строка, потому что она нужна как метка для идентификации случая в выводе. input — int, потому что Square принимает int. expected — тоже int, потому что Square возвращает int. Язык не навязывает названия input и expected; это ваши имена. Если тестируете функцию с двумя аргументами, добавьте два поля:
tests := []struct {
name string
a, b int
expected int
}{
{"add positives", 2, 3, 5},
{"add negative", -1, 4, 3},
}
Структура таблицы — зеркало сигнатуры тестируемой функции. Это и делает подход масштабируемым: добавить новый сценарий значит добавить одну строку в срез, а не копировать блок проверки.
