Pytest Fixture для использования БД на основе файла sqlite для тестирования?

Я использую pytest и pytest-django для тестирования проекта Django.

У меня есть test_settings.py, который я использую для того, чтобы использовать базы данных in-memory. Она очень проста и выглядит следующим образом:

from .settings import *

# Set up in memory databases for testing purposes
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": ":memory:",
    },
    "other_db": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": ":memory:",
    },
}

Моя pytest.ini столь же проста:

[pytest]
DJANGO_SETTINGS_MODULE = ic_project.test_settings
python_files = tests.py test_*.py *_tests.py

Есть несколько мест, где я хотел бы протестировать, используя реальный .sqlite3 файл - не в памяти.

Поэтому я попробовал написать следующее приспособление:

@pytest.fixture(scope="function")
def file_based_db(settings):
    """Generator to create a file based database for testing"""
    settings.DATABASES["default"]["TEST"] = {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": "default_db.sqlite3",
    }

    settings.DATABASES["other_db"]["TEST"] = {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": "other_db.sqlite3",
    }

Итак, тест, в котором я хотел бы использовать эту 'file_based_db', будет выглядеть примерно так:

@pytest.mark.usefixtures("file_based_db")
class ThingForm(TransactionTestCase):
    def setUp(self):
        self.thing = Thing.objects.create(name="thing1")

    def test_empty_form_fields(self):
        form = MyForm()
        self.assertIn("created_by", form.fields)
        self.assertIn("deleted_at", form.fields)
        self.assertIn("updated_by", form.fields)
        breakpoint()

Однако, когда я запускаю это, я получаю следующую ошибку:

    return [
        alias for alias in connections
        if alias in cls.databases and (
>           include_mirrors or not connections[alias].settings_dict['TEST']['MIRROR']
        )
    ]
E   KeyError: 'MIRROR'

В конечном итоге, как вы видите, я просто пытаюсь добавить словарь базы данных "TEST" в settings.DATABASES - но мне это нужно только в определенных случаях.

Если есть другие способы сделать это? Я буду рад услышать о том, как - я думал, что pytest fixture будет работать отлично, чтобы я мог просто украсить несколько тестов, где я хочу этого.

Любая помощь была бы признательна - поскольку я не уверен, к чему относится KeyError: 'MIRROR'.

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