Как протестировать модели Django на БД без manage.py в отдельном пакете с помощью pytest и GitHub Actions?
Контекст:
- Я разрабатываю отдельный Django пакет, который предназначен для добавления в существующие Django проекты.
- Этот пакет включает в себя модели Django с методами, которые взаимодействуют непосредственно с базой данных.
- Я хочу написать тесты для этих методов, используя
pytest
иpytest-django
. - Мне нужно запустить эти тесты в среде CI/CD, в частности, используя GitHub Actions.
Возникшие проблемы:
Настройка базы данных:
- Поскольку это отдельный пакет, он не включает
manage.py
файл. - Это затрудняет выполнение типичных команд управления Django, таких как
migrate
для настройки схемы базы данных для тестирования.
- Поскольку это отдельный пакет, он не включает
Создание таблицы:
- Я сталкиваюсь с ошибками, указывающими на то, что таблица для моей модели не существует, поскольку не применены необходимые миграции.
- Это проблематично, потому что мои тесты должны взаимодействовать с таблицами базы данных напрямую.
Фикстуры и настройка:
- Мне нужно убедиться, что таблицы базы данных созданы и заполнены исходными данными до запуска тестов.
- Мои попытки использовать
pytest
фикстуры и вручную создавать таблицы базы данных в рамках тестов не увенчались успехом.
Что я пробовал:
- Использование фикстур
pytest
для установки начального состояния базы данных. - Ручное создание таблиц базы данных в рамках тестовой установки с помощью прямого выполнения SQL.
- Использование библиотеки
mixer
для наполнения базы данных тестовыми данными.
Желаемый результат:
- Надежный способ обеспечить создание необходимых таблиц базы данных для моих моделей перед запуском тестов.
- Правильная установка и удаление тестовых данных в автономном пакете.
- Интеграция с конвейерами CI/CD, такими как GitHub Actions, без использования команд
manage.py
.
Дополнительная информация:
- Я использую базу данных in-memory SQLite для ускорения выполнения тестов.
- Тестовая среда должна быть изолированной и не зависеть от внешних баз данных или служб.
Я ищу руководство по решению этой проблемы или лучшие практики для тестирования моделей Django в отдельном пакете с помощью pytest
и pytest-django
. Любые советы или решения будут высоко оценены.
Для запуска migrate
вам не нужно manage.py
. Те же команды доступны через команду django-admin
, которую устанавливает Django, но вам нужно будет установить переменную DJANGO_SETTINGS_MODULE
, которую обычно устанавливает manage.py
.
Итак, если вы обычно запускаете python manage.py
, а в настройках проекта стоит myproject.settings
, вы можете с тем же успехом запустить env DJANGO_SETTINGS_MODULE=myproject.settings django-admin migrate
.
При этом, это не ваша проблема - pytest-django справится с установкой и разрушением тестовой базы данных за вас. Как правило, при разработке пакета Django, у вас есть проект тестирования и приложение рядом с ним, чтобы разместить пакет для использования в разработке.
Пример (самостоятельный пакет, проверенный с помощью GitHub Actions): здесь (репозиторий, поддерживаемый вашим настоящим); lippukala
- пакет многократного использования, а lippukala_test_app
- пакет, содержащий настройки для использования pytest-django
; здесь есть строфа
[tool.pytest.ini_options]
DJANGO_SETTINGS_MODULE = "lippukala_test_app.settings"
в файле pyproject.toml, который заставляет это работать.