Я не буду спрашивать вас, как вы оказались в такой ситуации. Каким-то образом я попал в это, а значит, и вы тоже. Я просто расскажу вам, как из этого выйти.

Итак, у вас есть Django-приложение, приложение к нему, и вы хотите написать самотестирование для тестового образца, находясь вне этого Django-приложения: в другом каталоге, в другом проекте. Пойдем.

Нам понадобится библиотека pytest-джанго — установите его в свою виртуальную среду.

Теперь мы указываем параметры в pytest.ini. Мы хотим, чтобы тестовый образец не пытался найти приложение Django самостоятельно. Мы сообщаем ему, какой файл настроек приложения использовать. Также указываем, где находится наше приложение Django.

# pytest.ini
[pytest]
django_find_project = false 
DJANGO_SETTINGS_MODULE = django-module.settings.your-settings
pythonpath = . django-module

Возможно, вы прочитали документацию и хотите указать настройки не в pytest.ini, а, например, в pyproject.toml. Сопротивляйтесь этому побуждению. Некоторые настройки библиотеки доступны только в pytest.ini и не могут быть установлены где-либо еще.

Если вы запустите тесты сейчас, после инициализации они создадут собственную базу данных в соответствии с настройками DATABASES в файле DJANGO_SETTINGS_MODULE. Скорее всего, вам не нужны такие хорошие вещи. Вы хотите получить доступ к существующей базе данных и использовать данные оттуда. Хорошо, давайте зайдём в conftest.py

#conftest.py
@pytest.fixture(scope="session", autouse=True)
def django_db_setup():
    pass

Да, именно с пропуском. Конечно, вы можете указать в функции некоторые параметры базы данных, как показано на рис. Документация, но это ни на что не повлияет. Если у вас есть настройки DATABASES в файле DJANGO_SETTINGS_MODULE, вы всегда будете подключаться, используя эти настройки. Функция django_db_setup() просто сообщает Piecetest не создавать базу данных с нуля, а подключиться к существующей базе данных. К тому, который указан в файле настроек приложения Django.

ЧИТАТЬ   Украинские власти никогда не избавятся от клейма преступников, считает сенатор

Хорошо, теперь кусок теста готов обратиться к базе данных приложения Django и извлечь из нее данные. Но для этого нам нужны модели. Возьмем модель. Опять же в документации написано, что надо обязательно получать модели на тестировании под маркером pytest.mark.django_db. Но мне не составило труда удалить их так, без всяких маркеров.

from django.apps import apps

MyModel = apps.get_model('application', 'MyModel')

my_object = MyModel.objects.get(id=1)

Иииии… Вы можете использовать шаблоны и Django ORM в своих тестах!

В документации библиотеки указано, что вы можете использовать модели в качестве фикстур, но это возможно только в том случае, если ваши кусочные тесты находятся в приложении Django. У нас их нет, поэтому если мы хотим что-то записать в базу данных, то мы уже используем здесь специальный маркер, всегда с параметром транзакции=True, иначе ничего не будет записано.

# test_some_test
import pytest


@pytest.mark.django_db(transaction=True)
def test_my_name():
    me = MyModel.objects.create(first_name="Bruce", last_name="Springsteen")
    assert me.first_name == 'Bruce'

Но я не понял, как перетащить Django.Factories из внешнего приложения Django. Если вам это очень нужно, создайте свой, есть отличная библиотека pytest-фабрикант. Но это совсем другая история…

Source

От admin