Пакеты, тестирование, файлы и JSON

Табличные тесты через пакет 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 — строка, потому что она нужна как метка для идентификации случая в выводе. inputint, потому что 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},
}

Структура таблицы — зеркало сигнатуры тестируемой функции. Это и делает подход масштабируемым: добавить новый сценарий значит добавить одну строку в срез, а не копировать блок проверки.