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. Но у меня ничего не получилось :(.
Прямое подключение к базе данных остается последним способом получения данных для модели. Но это, на мой взгляд, слишком сложно для такой задачи. Лучше извлечь модель (таблицу) в обычный текстовый файл и разобрать его на предмет параметризации аргументов. Если вам это действительно необходимо.

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