← Назад ко всем вопросам

Как пользоваться тестовыми таблицами

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: Сообщает об ошибке, если результат не соответствует ожидаемому.

Тестовые таблицы делают тесты более структурированными и легкими для расширения, что особенно полезно в проектах с большим количеством тестов.

Тема: Ошибки, тестирование
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки