Путешествие в автоматизированные тесты API

Улучшите конвейер CI / CD с помощью автоматизированных тестов API

В своем предыдущем посте я рассмотрел запуск тестов API и их автоматизацию. Для этого я наткнулся на Insomnia и Loadmill. На этот раз я хочу как можно проще интегрировать эти тесты в мой конвейер CI / CD.

Давайте уйдем и проверим некоторые возможности.

Инструменты, специфичные для фреймворка

ASP.NET Core имеет расширение тестового сервера (оно называется TestServer) от Microsoft, зависимость, которая аккуратно интегрируется в ASP.NET Core и предоставляет доступ к веб-узлу в памяти. В дополнение к этому, он также предоставляет предварительно настроенный HTTP-клиент, который мы можем использовать.

Это расширение также хорошо интегрируется в тестовые среды, такие как xUnit или NUnit. Звучит достаточно интересно, так что давайте попробуем, не перегружая вас.

Давайте снова возьмем в качестве образца API моей домашней страницы, которая еще не завершена. На данный момент я поддерживаю простую структуру проекта с одним контроллером API в ней.

(да, я знаю, Homepage.API звучит банально и скучно, поэтому я выбрал это имя)

На следующем шаге я создаю простой тестовый проект на базе xUnit, извлекаю зависимость тестового хоста (dotnet add Microsoft.AspNetCore.TestHost), ссылаюсь на мой проект API и изменяю тестовый класс по умолчанию на что-то вроде этого:

А наш метод тестирования выглядит так:

Это само собой разумеется, но вы можете запустить этот интеграционный тест в любой среде CI / CD. Visual Studio также может запускать тесты во время разработки («живые тесты»). Похоже, это отличный способ убедиться, что качество вашего кода находится на высоком уровне по сравнению с типичными модульными и интеграционными тестами. Довольно круто.

Этот метод немного дальше от производственной среды, потому что он работает в памяти, но он помогает вам с уверенностью тестировать при разработке и постановке. Неплохо.

В области CI / CD

Поскольку в последнее время я использую Loadmill для оценочных целей, я подумал, что продолжу этот путь и посмотрю, как мы можем использовать его в этом сценарии. Я наткнулся на их официальный пакет npm для CI, который выглядит многообещающим. В моем случае я использую Azure DevOps, но это работает с любым другим инструментом CI.

Пакет npm от Loadmill позволяет запускать предварительно настроенный Test Suite удаленно. У меня есть существующее определение Azure Pipelines, которое выпускает новую сборку на мой сервер. Давайте изменим это определение, чтобы оно также могло запускать пакет npm с тем же набором тестов, который я создал в прошлый раз.

Для этого мы создаем новый этап, который зависит от этапа выпуска.

На этапе npm я просто скопировал команду из раздела CI своего Test Suite. Прежде чем я это сделал, я создал несколько дополнительных потоков и переключил флаг CI. Их пакет отлично работает как модуль узла или инструмент командной строки. Он может делать и то, и другое одновременно. Если тест не пройден, инструмент вернет ненулевой статус выхода. Если это так, наш конвейер по сути выйдет из строя. Вы можете взглянуть на мое полное определение конвейера здесь, если хотите.

Если я хочу протестировать среду, отличную от производственной, есть способ предоставить или переопределить параметры с помощью инструмента CLI. В моем случае я мог просто изменить параметр ${baseUrl} на другой хост.

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

Если вы хотите внести изменения в тесты API, вам просто нужно будет получить доступ к вашему проекту Loadmill и выполнить все остальное оттуда. Это также поможет вам быть уверенным в производственной среде, потому что тест выполняется так же, как вы бы выполняли локально. Вы не только тестируете HTTP-запросы, но и проверяете, доступен ли ваш хост. Другими словами, успешно ли прошел ваш этап развертывания, без каких-либо глупых беспорядков в середине пути развертывания.

Я могу порекомендовать эту обширную статью Синди Шридхаран, которая подробно рассказывает о различных этапах, типах и подходах к тестированию в производственной среде; его стоит прочитать днем ​​на работе, если вы хотите узнать больше о методах высвобождения.



Резюме

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

Пока я писал эту статью, я обнаружил, что очень полезно хранить отдельно тесты, предназначенные для разработки / постановки и производства. Расширение TestHost идеально подходит для ASP.NET и работает для тестирования в реальном времени или тестов в CI, пока создаются двоичные файлы.

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

Это был второй пост в моем путешествии по автоматизированным тестам API. Пожалуйста, дай мне знать, что ты думаешь. Вы также можете подписаться на меня на Medium или dev.to для будущих публикаций.

Ваше здоровье.

Путешествие в автоматизированные тесты API

Дальнейшие ссылки

  1. Интеграционные тесты в ASP.NET Core: https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests
  2. Пакет Loadmill npm: https://www.npmjs.com/package/loadmill
  3. Пример автоматизации сборки и развертывания для учета рабочего времени по всему миру: https://docs.microsoft.com/en-us/azure/devops/migrate/build-deployment-best-practices
  4. Рекомендации по поэтапному отказу от выпуска: https://docs.microsoft.com/en-us/azure/devops/migrate/phase-rollout-with-rings
  5. Безопасное тестирование в производственной среде: https://medium.com/@copyconstruct/testing-in-production-the-safe-way-18ca102d0ef1