Как протестировать модели 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, который заставляет это работать.