Тесты на основе таблиц
Параметризованные тесты с дочерними тестами
«Тесты на основе таблиц» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Что такое табличные тесты
В табличных тестах определяется срез тестовых сценариев с входными и ожидаемыми выходными данными, после чего они перебираются в одном теле теста. Это уменьшает дублирование и упрощает добавление новых сценариев.
Базовый шаблон
Определите структуру для каждого сценария, выполните перебор с помощью t.Run и сообщайте о сбоях, указывая имя сценария:
tests := []struct {
name string
input int
want int
}{
{"zero", 0, 0},
{"positive", 3, 9},
{"negative", -2, 4},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := Square(tt.input)
if got != tt.want {
t.Errorf("Square(%d) = %d; want %d", tt.input, got, tt.want)
}
})
}Срез анонимных структур
Используйте анонимную структуру для типа тестового сценария — это позволяет хранить определение сценария рядом с тестом и не вводить имя для типа, используемого один раз.
Добавление сценариев с ошибками
Добавьте поле wantErr bool, чтобы проверять, возвращают ли функции ошибки в ожидаемых ситуациях:
{"invalid input", -1, 0, true},
// in the loop:
if (err != nil) != tt.wantErr {
t.Errorf("wantErr %v, got err %v", tt.wantErr, err)
}Именование подтестов
Описательное поле имени делает причины сбоев очевидными. Конкретный сценарий можно запустить с помощью -run TestFunc/case_name.
Параллельные подтесты с t.Run
Помечайте каждый подтест как параллельный и сохраняйте переменную цикла, чтобы выполнять сценарии одновременно (особенно важно, когда тесты связаны с вводом-выводом).
for _, tt := range tests {
tt := tt // capture
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
// ...
})
}Общая настройка для каждого сценария
Используйте поля-функции tt.setup, чтобы задавать настройку для каждого сценария без дублирования шаблонного кода:
type tc struct {
setup func() *DB
input string
want int
}Сохранение читаемости сценариев
Если сценарии становятся слишком большими, определяйте их как именованные переменные или загружайте из файлов с тестовыми данными. Держите таблицу компактной — по возможности размещайте каждый сценарий в одной строке.
Тестирование нескольких результатов
Тестируйте функции, возвращающие несколько значений, добавляя отдельное поле для каждого результата:
type tc struct {
input string
wantVal int
wantErr bool
}Проверки Testify в таблицах
Используйте github.com/stretchr/testify/assert в табличных тестах для удобных проверок без громоздких блоков if/t.Errorf.
assert.Equal(t, tt.want, got, tt.name)Документирование с помощью сценариев
Таблица сценариев служит живой документацией. Будущие разработчики могут быстро просмотреть её, чтобы понять все поддерживаемые входные данные и граничные случаи.
Быстрая проверка
Зачем сохранять переменную цикла (tt := tt) перед вызовом t.Parallel в табличных тестах?
Итоги: табличные тесты
Основные положения:
- Срез структур, охватывающий входные данные, ожидаемые результаты и признак ошибки
- Перебор с помощью t.Run для именованных независимых подтестов
- Сохраняйте переменную цикла (tt := tt) перед вызовом t.Parallel
- Сценарии служат живой документацией поддерживаемого поведения
Часто задаваемые вопросы
Урок «Тесты на основе таблиц» бесплатный?
Да — полный текст урока «Тесты на основе таблиц» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Тесты на основе таблиц»?
Параметризованные тесты с дочерними тестами Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Тесты на основе таблиц»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Написание модульных тестов с testing
- Тесты на основе таблиц
- Тестовые двойники: имитации и заглушки
- Покрытие тестами и testify