Рубрики
Без рубрики

Интеграционные тесты для букеты услуг с Pтойцей и Docker Compose

Оглавление предисловии Введение (инструменты | идея) Docker-Compose & Dockerfile … Теги с учебником, Python, Docker, тестированием.

Оглавление

  • Предисловие
  • Введение ( Инструменты | Идея Несомненно
  • Docker-Compose & Dockerfiles
  • Создать Test-Docker-Compose.yml
  • Pytest Plugin
  • Определить Conftest.py.
  • Создание модуля тестов
  • Пробежать тесты

Предисловие

Привет! Это моя первая статья на dev.to. Ранее я написал учебники на среднем (ссылка должна быть где-то в профиле). Сегодня я хочу поделиться руководством о том, как настроить тесты интеграции для группы услуг. В прошлом месяце я работал над аналогичным заданием и для некоторых членов команды результат выглядел как что-то новое. Я думал, что, может быть, это имеет смысл написать быструю руководство об этом.

Кроме того, мне действительно нужно писать тесты для https://github.com/xnuinside/gino-admin Отказ Конечно, мне нужен набор различных тестов, но сегодня я подготовим настроек для тестов, что проведет примеры правильно выполнены с новыми изменениями в коде «Джиномин».

Введение

В руководстве я буду использовать:

  • Питон
  • питиш
  • pytest-docker-compose
  • Запросы (мы можем легко использовать что-то Asyncio httpx или AioHTTP, но в этом случае нет смысла, потому что я не буду добавлять какие-либо тесты параллелизма в этом руководстве, поэтому запустить один за другим)
  • Docker & Docker составляют

Главная мысль:

У вас есть проект с несколькими микросервисами или услугами (не имеет значения в этом контексте) и БД. И вам нужно запустить тесты на этой инфраструктуре, чтобы быть уверены, что компоненты работают вместе.

Моя демонстрация проекта:

Для учебника я возьму fastapi_as_main_app Из примеров администратора GINO, потому что он содержит веб-приложение на Fastapi, администратора Panel & DB PostgreSQL. Исходный код этого крошечного проекта здесь: https://github.com/xnuinside/gino-admin/tree/master/examples/fastapi_as_main_app

Руководство

В начале нам нужны 2 вещи:

  1. Up & Run наши услуги
  2. Убедитесь, что они видят друг друга и может подключиться

Докер-состав

Если в 2020 году вы все еще не используете/попробуйте docker-compose – просто Google Tutorials об этом и даст ему шанс. Это действительно незаменимо в случае непрерывных служб, по крайней мере, для Dev и Test Env.

Для и прогон мы будем использовать Docker Compose , как вы могли догадаться.

Прежде чем начать работать на Docker-Compose.yml Файл, который вам нужно подготовить Dockerfiles за услуги. Прежде всего, давайте посмотрим на мою структуру исходности:

Было бы плохое представление о примерах «Возьми & Play» с тестами, поэтому я поставим все файлы, необходимые для тестов внутри Тесты/ реша.

Давайте создадим папку Integration_tests/ и внутри создать Docker/ папка, где мы будем хранить все Dockerfiles Что я буду использовать для интеграционных тестов. Теперь я создадим 2 DockerFiles – один для основного приложения, один для администратора. И у меня будет эта структура в папке тестов:

Дочсерский контекст

Теперь мне нужно обратить внимание на контекст Docker. Потому что мне нужно получить доступ к Примеры/ Папка в DockerFile (и, как вы знаете, Docker не позволяет получить доступ к любым пути внешнего контекста Docker) Мой Докерный контекст будет главным gino_admin/ Папка, которая содержит «примеры». Итак, когда я определяю Dockerfiles, я помню, что мой Workdirs будет «Gino_Admin» папка, а не каталог «Docker/», где размещены DockerFiles.

В моем случае будут два файла докеров – один для панели администратора, один для основного приложения. PostgreSQL будет построен с официального образа.

Dockerfiles.

Довольно простые докерфаты. Установите требования, копировать исходный код, запустить.

Для Панель администратора Мне также нужно добавить gino_admin Источники и устанавливают из них внутри, потому что это то, что я проверяю – код, не выпуски из pypi:

Создать Test-Docker-Compose.yml

Пойдем и создам Test-Docker-Compose.yml Файл со всеми нашими услугами, которые необходимы для правильного теста.

Иди в Тесты/Integration_tests/ Отказ Создать Test-Docker-Compose.yml Отказ Обратите внимание на Контекст и Dockerfile Path Отказ

Наше Test-Docker-Compose.yml будет:

Мне нужно установить var Db_host = postgres Поскольку он использует внутренний код (здесь:) Чтобы решить, что хост PostgreSQL подключается. Если он работает внутри докера-составного кластера – хост Postgres , если нет, – localhost Отказ

Прохладный. Теперь время запустить:

$ docker-compose -f test-docker-compose.yml up –build

И мы получили:

Ага, мы устанавливаем зависит от Но в любом случае вижу ошибку Связь отказалась в услугах. Потому что серверы пытаются подключиться к БД, прежде чем оно на самом деле. Defends_on Только ждет ждет докеренного контейнера, но это ничего не знает о реальном запуске сервера/процесса внутри контейнера.

Ждать-за скрипт

Нам нужно дождаться БД, прежде чем запустить наши услуги. Ибо это существует a ждать-за Сценарий шаблона. Это может Bash, Python, любой бы вы хотели. Идея этого сценария – подожди, пока вы не получите «успехи» на некотором состоянии.

В нашем случае нам нужно ждать до Postgreresdb Будет готов принять соединения.

Давайте создадим wait_for.py Отказ Мы разместим его в той же папке рядом со Compose .yml file

Содержание скрипта будет очень просто, чтобы проверить соединения БД, я буду использовать те же библиотеки, которые уже существуют в качестве зависимостей, но в вашем случае вы можете использовать все, что вы хотите. Самый простой и популярный путь – с psycopg2 Отказ

Я буду использовать Джино потому что, как я сказал, я все равно использую это в приложении:

Не очень логика – просто попробуйте подключиться, если ошибка спать 8 сек, попробуйте еще раз.

Теперь нам нужно изменить Dockerfiles Перед запуском серверов нам нужно запустить этот скрипт. И когда он возвращает 0 – запустить серверы.

Измените нашу последнюю строку в главном приложении DockerFile для:

Копировать ../../tests/wait_for.py/wait_for.py. CMD Python/wait_for.py && Uvicorn Главная: App –host 0.0.0.0 – порт 5050

А на панели администратора:

Копировать тесты/Integration_tests/wait_for.py/wait_for.py. CMD Python/wait_for.py && python admin.py

Примечание: То же самое, как вы можете запустить какое-либо предварительно настроенное действие, которое вам нужно сделать свои сервисные работы.

Теперь снова запустите кластер с: $ docker-compose -f test-docker-compose.yml up --build

И мы получаем успешный результат. Все услуги вверх и работают.

Здорово. У нас есть тестовый кластер, теперь нам нужно что-то, что позволяет проводить тест внутри этого кластера.

Pytest Plugin для Docker Compose

Если вы никогда не работали с Pteest Смешать в первую очередь взглянуть на официальную документацию и некоторые учебники. По крайней мере, вы должны понять, что это Светильникиhttps://docs.pytest.org/en/latest/fixture.html. .

Существуют 3 разных плагина для Pteest Чтобы запустить тесты на Docker-Compose Infrastructure:

Я проверил все 3, но в конце дня остановился на pytest-docker-compose . Это работает для меня лучше, чем другие по объему четкости скорости и использования.

Начнем с установки пакетов:

$ PIP Установить Pteest $ pip Установить Pteest-Docker-Compose

Определить Conftest.py.

Теперь давайте создадим наше конфтест ( https://docs.pytest.org/ru/2.7.3/plugins.html ) Для Pтойцы, где мы определим наш пользовательский путь к Docker-Compose файлу, который мы используем для запуска тестов и плагинов.

И сейчас мы закончили готовить нашу общую инфраструктуру.

Следующая установка нашего первого тестового модуля.

Создание модуля тестов

Когда вы помните, у меня есть несколько примеров, и каждый из них – набор услуг, которые работают с БД. Для каждого примера у меня будет собственный тестовый модуль и собственные светильники.

Сервисные приспособления

Создайте наш первый Test_Module: я буду продолжать назвать согласованность и называть это test_fastapi_as_main_app_example.py. .

Теперь наши тесты папка выглядит как:

Внутри test_fastapi_as_main_app_example.py Прежде всего, нам нужно определить светильники с нашими услугами:

  • Чтобы проверить, что они доходят и запускают успех
  • Чтобы получить их URI, что мы будем использовать в тестах

Что нужно обратить внимание:

Module_scoped_container_getter – Это специальное приспособление, предоставленное pytest-docker-compose плагин. Я использую Module_scoped_container_getter Поскольку каждый из моих примеров – набор отдельных групп приложений со своей собственной схемой БД – для каждого модуля мне нужно будет отбросить таблицы БД и создавать их для конкретного примера, который я проверю в модуле.

Плагин предоставляет 4 различных светильника, которые определяют поведение о том, как часто строят и запускают контейнеры:

  • Function_scoped_container_getter.
  • Class_scoped_container_getter.
  • Module_scoped_container_getter.
  • Session_scoped_container_getter.

Далее обратите внимание на строку:

Service.get («fastapi_main_app_main»). Network_info [0]

В .get (...) Метод необходимо предоставить имя службы, как он определен в файле Docker-Compose YML.

Теперь давайте определим 2 простых теста – Check ‘/’ Page и утверждайте, что для обоих услуг кода 200. Добавить к тому же test_fastapi_as_main_app_example.py файл:

Время запустить тесты.

Как запустить тесты

Чтобы запустить тест, у вас есть 2 возможных способа.

Первый способBuild & Up & Run с одна команда Отказ

pytest . --docker-compose=test-docker-compose.yml -v
# will build and run docker compose & execute the tests

Второй способ Позвольте вам сократить время в процессе создания/отладки/отладки, поскольку вы не перестраиваете каждую запускающуюся контейнеры.

docker-compose -f test-docker-compose.yml up --build
# build & run test cluster
# when in new terminal window:
pytest . --docker-compose=test-docker-compose.yml --docker-compose-no-build --use-running-containers -v 

Выберите любую бы вы хотели и запустить тест.

И мы получили зеленый результат:

Отлично все работает. Услуги вверх, и мы можем использовать их из тестов.

Авторские приспособления

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

Кроме того, мне нужно загрузить предустановку на DB – некоторые исходные набор данных. Специальное для этого в Джино админ существует функция Пресеты , что позволяет определять список файлов CSV, которые будут загружены в БД. Вы можете иметь несколько различных пресетов БД и загрузить их с помощью DROD DB или просто вставить в существующие таблицы – как вы хотите.

Итак, я определим 2 светильника – 1 к auth, 2 для загрузки предустановки

Как вы видите, вы можете использовать одно приспособления в другом.

Добавьте еще два теста: тот, который будет использовать наш новый прибор «initdb», второй только «admin_auth_headers».

Я напишу тест на Основное приложение конечная точка /пользователи . Эта конечная точка возвращает количество пользователей в БД. Итак, /Пользователи Конечная точка должна возвращать {«count_users»: 5} на основе данных, которые я загружаю с предустановкой.

И тест на /api/drop_db Конечная точка администратора панели.

Добавить тесты:

Обратите внимание на приспособление initdb, мы не используем его в вызове метода, но нам нужно позвонить на приспособление initdb, потому что для этого теста нам нужно иметь данные в БД.

Поскольку наше устройство initdb имеет это означает, что он будет выполнен только один раз на модуль, если вы хотите воссоздать БД для каждого теста – измените его на «Функция»

Пробежать тесты

Потрясающий. Вот и все.

В моем случае следующие шаги было – добавить больше модулей и больше тестов для каждого примера. И исходный код с тестами Образцы вы можете найти здесь: https://github.com/xnuinside/gino-admin/tree/master/tests/integration_tests

В вашем случае, может быть, необходимо использовать, если вы заботитесь о скорости испытаний, и ваш код не имеет эффектов сторон или, возможно, напротив вам нужен – проверьте больше об этом в Pteest Docs.

Такие интеграции тесты очень полезны, когда у вас есть 4-5 услуг, которые называют друг друга, и вы должны быть уверены, что они работают вместе.

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

Оригинал: “https://dev.to/xnuinside/integration-tests-for-bunch-of-services-with-pytest-docker-compose-j5i”