Учебное пособие для начинающих по модульному тестированию GoLang
При тестировании программисты стремятся обнаружить любые потенциальные проблемы перед развертыванием приложения в рабочей среде. Одним из важных видов тестирования, которым занимаются программисты, является модульное тестирование.
Исходный код: https://github.com/dilaragorum/go-testing-tutorial
Модульный тест
В качестве первого шага давайте подумаем о том, как мы напишем модульный тест для нашей функции приветствия в GoLang. Есть несколько правил, которыми мы руководствуемся при написании модульных тестов.
- Мы должны создать файл
<filename>_test.go
. - Мы должны написать обычную функцию Go с сигнатурой
func(*testing.T)
. - Мы должны указать имя функции с префиксом
Test
.
Чтобы написать простые утверждения в нашем тесте, мы можем использовать отличную библиотеку под названием testify ❤. Мы можем установить этот пакет как:
go get -u github.com/stretchr/testify
Мы написали наш тест детского модуля, используя метод Equal
, который имеет сигнатуру, указанную ниже, и взят из пакета testify.
func Equal(t TestingT, expected, actual interface{}) bool
Мы можем протестировать параметрические функции, как указано выше, с той же логикой.
В некоторых случаях мы хотим протестировать наши параметрические функции с несколькими тестовыми примерами. По сути, мы можем написать этот тест, используя цикл for, создав структуру тестового примера с необходимыми параметрами для вызова нашей функции Add
.
Вместо использования базового цикла for мы можем использовать стратегию тестирования на основе таблиц для реализации этой функциональности. Мы увидим эту реализацию в следующем разделе.
Подтест (несколько t.Run)
Мы можем создать Table Driven Test с помощью GoLand, как показано ниже.
В свете этой информации мы повторно реализуем наш функциональный тест Add
, как показано ниже.
Используя эту стратегию, мы можем запускать наши тестовые случаи отдельно. Однако, чтобы использовать эту функциональность, мы должны определить name
переменную в нашей TestCase
структуре и передать ее в качестве первого аргумента в t.Run(test.name,...)
.
Тестирование обработчиков HTTP
Обработчик (контроллер): они отвечают за выполнение логики вашего приложения и за написание заголовков и тел ответов HTTP.
В Go мы можем легко тестировать обработчики HTTP без затрат на интеграционный тест благодаря пакет net/http/httptest
. Когда мы изучаем этот пакет, все методы, необходимые для интерфейса http.ResponseWriter
, реализованы в httptest.ResponseRecorder
. Чтобы просмотреть структуру httptest.ResponseRecorder
, вы можете проверить документацию. httptest.ResponseRecorder
по сути, это реализация http.ResponseWriter
, которая записывает код состояния ответа, заголовки и тело вместо того, чтобы фактически записывать их в HTTP-соединение. Короче говоря, httptest.ResponseRecorder
это реализация http.ResponseWriter
, которая записывает свои мутации для последующей проверки в тестах.
Таким образом, простой способ модульного тестирования ваших обработчиков — создать новую структуру httptest.ResponseRecorder
, передать ее функции обработчика, а затем снова проверить ее после возврата обработчика. В нашем примере мы создаем req
и rec
в соответствии с упомянутой выше информацией и передаем их в наш GreetingAPI
. Наши полученные данные, которые будут использоваться для сравнения ожидаемых данных для проверки нашей функции дескриптора, будут поступать из rec.Body
.
Спасибо за чтение ! Не забудь этого:
«Самая сложная часть модульного тестирования — это достижение максимальной ценности при минимальных затратах на обслуживание».
Исходный код: https://github.com/dilaragorum/go-testing-tutorial