Как правильно тестировать библиотеку django

Я часто сталкиваюсь с практическими проблемами, когда хочу протестировать библиотеку, которую я разрабатываю и которая является django-приложением. Django приложения могут разрабатываться независимо, как DRF и т.д.

Для тестирования вам нужен либо проект django, либо хотя бы файл settings.py или что-то подобное, смотрите здесь.

Но я не понимаю, как это правильно сделать для "автономной" библиотеки. Мне нужно генерировать миграции для этой библиотеки (если она содержит модели) - поэтому мне нужен файл manage.py для вызова manage.py makemigrations, мне нужно проверить, правильно ли либа интегрируется в проект (в моем случае приложения являются полноценными плагинами, я использую GDAPS).

Какой лучший подход здесь?

  • следует ли мне создать отдельный "тестовый проект" в отдельном репозитории, который использует мою библиотеку и тестирует ее?
  • следует ли мне создать проект в каталоге тестов моей библиотеки и использовать его? Пути CAVE python...
  • стоит ли мне вообще не использовать проект и все имитировать - как?

Пожалуйста, дайте мне хотя бы намек в каком-то направлении.

Я гуглил тот же вопрос и обнаружил, что в разделе "Using the Django test runner to test reusable applications" темы Advanced testing документации Django дается подходящая общая практика. Это смесь всех трех ваших подходов.

По сути, вы должны создать пакет tests рядом с кодом приложения, с файлом test_settings.py, содержащим все настройки, необходимые вашей библиотеке, и, по крайней мере, установить переменные SECRET_KEY и INSTALLED_APPS.

SECRET_KEY = 'fake-key'
INSTALLED_APPS = [
    "tests", "your-library"
]

Где "your-library" - это имя библиотеки, которую вам нужно протестировать.

В моем случае мне пришлось также добавить 'django.contrib.auth', 'django.contrib.contenttypes', так как они были необходимы моей библиотеке.

Затем вы помещаете все свои тесты в этот пакет, случайные зависимые модели в файл models.py, и запускаете их с помощью runtests.py, который находится в корне вашего репо:

#!/usr/bin/env python
import os
import sys

import django
from django.conf import settings
from django.test.utils import get_runner

if __name__ == "__main__":
    os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings'
    django.setup()
    TestRunner = get_runner(settings)
    test_runner = TestRunner()
    failures = test_runner.run_tests(["tests"])
    sys.exit(bool(failures))

Он будет использовать test_settings.py в качестве файла настроек (os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings') и запускать все тесты, содержащиеся в пакете tests.

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