Оглавление
- Предисловие
- Введение ( Инструменты | Идея Несомненно
- 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 вещи:
- Up & Run наши услуги
- Убедитесь, что они видят друг друга и может подключиться
Докер-состав
Если в 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:
- https://github.com/pytestest-docker-compose/pytestest-Docker https://github.com/avast/pytestest-Docker
- https://github.com/lovelysystems/lovely-pytest-docker
Я проверил все 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”