Django Pytest. Использование записей базы данных в параметризации
Я хочу иметь тест для данных, который будет использовать реальные данные из DB.
Цель состоит в том, чтобы пройтись по всем записям таблицы Foo
и применить некоторую тестовую логику к каждой записи. В идеале для этого нужно использовать parametrize
, но я немного затрудняюсь с доступом БД к parametrize
.
Что я делаю до сих пор:
tests.py
import pytest
from app.models import Foo
pytestmark = pytest.mark.django_db
@pytest.fixture(scope='session')
def django_db_setup():
settings.DATABASES['default'] = {
'ENGINE': 'django.db.backends.mysql',
'NAME': os.environ['DB_NAME'],
'USER': os.environ['DB_USER'],
'PASSWORD': os.environ['DB_PASSWORD'],
'HOST': 'localhost',
}
@pytest.mark.django_db
class TestFoo:
@pytest.mark.parametrize('foo', Foo.objects.all())
def test_foo_objects(self, foo):
assert foo.is_ok
В итоге я получаю
E RuntimeError: Доступ к базе данных не разрешен, используйте метку "django_db" или фиксы "db" или "transactional_db", чтобы разрешить его.
.
Однако, если DB-access не используется в parametrize
- он работает. Т.е. внутри test_foo_objects
DB-access разрешен.
Итак, вопрос в том, как разрешить parametrize
использовать также и DB?
Не существует простого способа сделать это, потому что:
Параметризация тестовых функций происходит во время сбора. (согласно документации pytest).
Даже если вы хотите использовать pytest_generate_tests
функцию, вам нужно получить вашу Foo
модель (данные) без использования какого-либо приспособления (предоставляемого pytest-django
плагином).
Я пробовал использовать способ Django deserializing data из предварительно сохраненной модели в JSON файл, сгенерированный командой dumpdata
CLI. Но у меня ничего не получилось :(.
Прямое подключение к базе данных остается последним способом получения данных для модели. Но это, на мой взгляд, слишком сложно для такой задачи. Лучше извлечь модель (таблицу) в обычный текстовый файл и разобрать его на предмет параметризации аргументов. Если вам это действительно необходимо.