DevGang
Авторизоваться

Учебное пособие для начинающих по модульному тестированию GoLang

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

Исходный код: https://github.com/dilaragorum/go-testing-tutorial

Модульный тест

В качестве первого шага давайте подумаем о том, как мы напишем модульный тест для нашей функции приветствия в GoLang. Есть несколько правил, которыми мы руководствуемся при написании модульных тестов.

  1. Мы должны создать файл <filename>_test.go.
  2. Мы должны написать обычную функцию Go с сигнатурой func(*testing.T).
  3. Мы должны указать имя функции с префиксом 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

#Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться