0Pricing
Go Academy · Урок

Тесты на основе таблиц

Параметризованные тесты с дочерними тестами

«Тесты на основе таблиц» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Написание модульных тестов с testing
  2. Тесты на основе таблиц
  3. Тестовые двойники: имитации и заглушки
  4. Покрытие тестами и testify
← Назад к Go Academy