Я не буду спрашивать, как вы попали в такую ситуацию. Я в неё как-то попала, значит, и вы тоже могли. Я просто расскажу, как из неё выбраться.
Итак, у вас есть джанго-приложение, апишка к нему, и вы хотите написать автотесты на пайтест, находясь вне этого джанго-приложения: в другой директории, в другом проекте. Погнали.
Нам понадобится библиотека pytest-django - установите её в своё виртуальное окружение.
Теперь в pytest.ini указываем настройки. Нам нужно, чтобы пайтест не пытался найти джанго-приложение самостоятельно. Мы подсказываем ему, какой файл настроек приложения использовать. А так же указываем на то, где лежит наше джанго-приложение.
# 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
Да, именно с pass. Вы можете, конечно, указать в функции какие-то настройки базы данных, как это указано в документации, но это ни на что не повлияет. Если у вас есть настройки DATABASES в файле DJANGO_SETTINGS_MODULE, то вы всегда будете подключаться именно по этим настройкам. Функция django_db_setup() просто говорит пайтесту, чтобы он не создавал базу с нуля, а подключился к существующей. К той, что указана в файле настроек джанго-приложения.
Хорошо, теперь пайтест готов посмотреть на базу данных из джанго-приложения и достать оттуда какие-то данные. Но для этого нам нужны модели. Достанем модель. Опять же, документация говорит, что обязательно надо доставать модели в тестах под маркером pytest.mark.django_db. Но у меня не было никаких проблем с тем, чтобы доставать их просто так, безо всяких маркеров.
from django.apps import apps
MyModel = apps.get_model('application', 'MyModel')
my_object = MyModel.objects.get(id=1)
Ииии... Можно использовать модели и джанго ОРМ в своих тестах!
В документации библиотеки сказано, что можно модели использовать как фикстуры, но это возможно только, если у вас пайтесты лежат внутри джанго-приложения. У нас-то не лежат, поэтому, если мы хотим записать что-то в базу данных, то здесь уже используем специальный маркер, обязательно с параметром transaction=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 из внешнего джанго-приложения я не разобралась. Если вам очень надо, создайте свои, есть отличная библиотека pytest-factoryboy. Но это уже совсем другая история...