Как стать автором
Обновить

Тестируем внешнее django-приложение при помощи pytest

Уровень сложностиСредний
Время на прочтение2 мин
Количество просмотров1.9K

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

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

Нам понадобится библиотека 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. Но это уже совсем другая история...

Теги:
Хабы:
+3
Комментарии0

Публикации

Истории

Работа

Python разработчик
126 вакансий
Data Scientist
79 вакансий

Ближайшие события

Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область