Найти в Дзене

Курс - «Программирование на Go для начинающих» - #23 Тестирование и отладка. Unit-тестирование в Go.

Оглавление

Unit-тестирование является ключевым элементом разработки программного обеспечения, позволяющим обеспечить корректность работы отдельных частей (юнитов, модулей) программы. В языке программирования Go поддержка unit-тестирования встроена непосредственно в стандартную библиотеку, что делает процесс тестирования и отладки эффективным и удобным.

Основы Unit-тестирования в Go

Создание тестового файла

Для начала работы над unit-тестами в Go необходимо создать тестовый файл, который обычно располагается в том же пакете, что и тестируемый код. Имена тестовых файлов должны заканчиваться на _test.go.

Пример теста

Допустим, у нас есть следующая функция в файле math.go:

package math
// Add возвращает сумму двух целых чисел.
func Add(x, y int) int {
return x + y
}

Тестовый файл для этой функции может выглядеть следующим образом (math_test.go):

package math
import "testing"
func TestAdd(t *testing.T) {
result := Add(1, 2)
if result != 3 {
t.Errorf("Add(1, 2) = %d; want 3", result)
}
}

Запуск тестов

Для запуска тестов используйте команду go test в терминале. Если все тесты прошли успешно, Вы увидите сообщение ok, а если какой-либо тест не пройден — Go предоставит подробную информацию о проваленных тестах.

Правила и соглашения

  • Имена функций тестов должны начинаться с Test.
  • Каждая тестовая функция должна принимать один аргумент: t *testing.T.
  • Для сообщения об ошибке в тесте используйте методы t.Error или t.Errorf.

Продвинутое использование

Табличные тесты

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

func TestAddTableDriven(t *testing.T) {
var tests = []struct {
x, y int
want int
}{
{1, 2, 3},
{1, 1, 2},
{2, 2, 4},
}
for _, tt := range tests {
testname := fmt.Sprintf("%d+%d", tt.x, tt.y)
t.Run(testname, func(t *testing.T) {
ans := Add(tt.x, tt.y)
if ans != tt.want {
t.Errorf("got %d, want %d", ans, tt.want)
}
})
}
}

Mocking и Dependency Injection

Для тестирования функций, зависящих от внешних сервисов или сложной логики, используйте подходы mocking и dependency injection. Это позволит изолировать тестируемый код и обеспечить его тестируемость без необходимости взаимодействия с внешними системами.

Unit-тестирование в Go — мощный инструмент для обеспечения качества и надежности кода. Благодаря простоте и удобству интеграции с языком, разработчики могут легко создавать и поддерживать тесты, делая свои приложения более стабильными и безопасными.