Как пользоваться тестовыми таблицами
1️⃣ Как кратко ответить
Тестовые таблицы в Go используются для организации и упрощения тестирования функций с различными входными данными и ожидаемыми результатами. Они представляют собой срез структур, где каждая структура содержит набор входных данных и ожидаемый результат. Это позволяет легко добавлять новые тестовые случаи и поддерживать тесты в чистоте и порядке.
2️⃣ Подробное объяснение темы
Тестовые таблицы — это метод организации тестов, который позволяет эффективно управлять множеством тестовых случаев. В Go они особенно полезны для тестирования функций с различными входными данными и ожидаемыми результатами. Основная идея заключается в использовании среза структур, где каждая структура представляет собой отдельный тестовый случай.
Зачем это нужно
Тестовые таблицы помогают:
- Уменьшить дублирование кода в тестах.
- Легко добавлять новые тестовые случаи.
- Поддерживать тесты в чистоте и порядке.
- Улучшить читаемость и поддержку тестов.
Как это работает
Тестовые таблицы обычно реализуются с использованием среза структур, где каждая структура содержит поля для входных данных и ожидаемого результата. Затем срез итерируется в цикле, и для каждого элемента выполняется тест.
Пример кода
Рассмотрим пример функции, которая складывает два числа, и теста для нее с использованием тестовой таблицы.
package main
import (
"testing"
)
// Функция, которая складывает два целых числа.
func Add(a, b int) int {
return a + b
}
// Тестовая функция для Add с использованием тестовой таблицы.
func TestAdd(t *testing.T) {
// Определяем структуру для тестового случая.
type testCase struct {
name string // Имя теста для удобства идентификации.
a, b int // Входные данные для функции Add.
expected int // Ожидаемый результат.
}
// Создаем срез тестовых случаев.
testCases := []testCase{
{name: "both positive", a: 1, b: 2, expected: 3},
{name: "both negative", a: -1, b: -2, expected: -3},
{name: "positive and negative", a: 1, b: -1, expected: 0},
{name: "zero values", a: 0, b: 0, expected: 0},
}
// Итерируемся по каждому тестовому случаю.
for _, tc := range testCases {
// Используем t.Run для запуска под-теста с именем.
t.Run(tc.name, func(t *testing.T) {
// Вызываем тестируемую функцию.
result := Add(tc.a, tc.b)
// Сравниваем результат с ожидаемым.
if result != tc.expected {
// Если результат не совпадает, тест проваливается.
t.Errorf("Add(%d, %d) = %d; want %d", tc.a, tc.b, result, tc.expected)
}
})
}
}
Объяснение кода
- Структура
testCase: Определяет поля для каждого тестового случая, включая имя, входные данные и ожидаемый результат. - Срез
testCases: Содержит все тестовые случаи, которые мы хотим проверить. - Цикл
for: Итерируется по каждому элементу срезаtestCases. t.Run: Позволяет запускать каждый тестовый случай как под-тест, что улучшает читаемость вывода тестов.Add(tc.a, tc.b): Вызывает тестируемую функцию с текущими входными данными.t.Errorf: Сообщает об ошибке, если результат не соответствует ожидаемому.
Тестовые таблицы делают тесты более структурированными и легкими для расширения, что особенно полезно в проектах с большим количеством тестов.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться