Курс — «Программирование на Go для начинающих» — #23 Тестирование и отладка. Unit-тестирование в Go.
Здравствуйте, дорогие друзья.
Unit-тестирование является ключевым элементом разработки программного обеспечения, позволяющим обеспечить корректность работы отдельных частей (юнитов, модулей) программы. В языке программирования Go поддержка unit-тестирования встроена непосредственно в стандартную библиотеку, что делает процесс тестирования и отладки эффективным и удобным.
Основы Unit-тестирования в Go
Создание тестового файла
Для начала работы над unit-тестами в Go необходимо создать тестовый файл, который обычно располагается в том же пакете, что и тестируемый код. Имена тестовых файлов должны заканчиваться на _test.go
.
Пример теста
Допустим, у нас есть следующая функция в файле math.go
:
1 2 3 4 5 |
package math // Add возвращает сумму двух целых чисел. func Add(x, y int) int { return x + y } |
Тестовый файл для этой функции может выглядеть следующим образом (math_test.go
):
1 2 3 4 5 6 7 8 |
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
.
Продвинутое использование
Табличные тесты
Табличные тесты позволяют проверить функцию на различных наборах входных данных. Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 — мощный инструмент для обеспечения качества и надежности кода. Благодаря простоте и удобству интеграции с языком, разработчики могут легко создавать и поддерживать тесты, делая свои приложения более стабильными и безопасными.
На этом все. Всем хорошего дня!
Цикл статей по курсу: «Язык программирования Go для начинающих».