Как протестировать модели Django на БД без manage.py в отдельном пакете с помощью pytest и GitHub Actions?

Контекст:

  • Я разрабатываю отдельный Django пакет, который предназначен для добавления в существующие Django проекты.
  • Этот пакет включает в себя модели Django с методами, которые взаимодействуют непосредственно с базой данных.
  • Я хочу написать тесты для этих методов, используя pytest и pytest-django.
  • Мне нужно запустить эти тесты в среде CI/CD, в частности, используя GitHub Actions.

Возникшие проблемы:

  1. Настройка базы данных:

    • Поскольку это отдельный пакет, он не включает manage.py файл.
    • Это затрудняет выполнение типичных команд управления Django, таких как migrate для настройки схемы базы данных для тестирования.
  2. Создание таблицы:

    • Я сталкиваюсь с ошибками, указывающими на то, что таблица для моей модели не существует, поскольку не применены необходимые миграции.
    • Это проблематично, потому что мои тесты должны взаимодействовать с таблицами базы данных напрямую.
  3. Фикстуры и настройка:

    • Мне нужно убедиться, что таблицы базы данных созданы и заполнены исходными данными до запуска тестов.
    • Мои попытки использовать 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, который заставляет это работать.

Вернуться на верх