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 — мощный инструмент для обеспечения качества и надежности кода. Благодаря простоте и удобству интеграции с языком, разработчики могут легко создавать и поддерживать тесты, делая свои приложения более стабильными и безопасными.