Я настраиваю тестовую платформу для мультитенантной системы.
Для каждого письменного теста я хочу создать тест для каждого арендатора и обернуть весь тестовый прогон, чтобы изменить соединение базы данных и некоторую локальную переменную потока перед тестом, не прерывая разбор базы данных там, где он сбрасывается.
Во время процесса проб и ошибок я прибегал к подъему все выше и выше в цепочке ловушек pytest: я начал с pytest_generate_tests
, чтобы создать тест для каждого арендатора с соответствующим приспособлением, но разборка не удаласьЯ пришел к следующей идее:
def pytest_runtestloop(session):
for tenant in range(settings.TENANTS.keys()):
with set_current_tenant(tenant):
with environ({'DJANGO_CONFIGURATION': f'Test{tenant.capitalize()}Config'}):
session.config.pluginmanager.getplugin("main").pytest_runtestloop(session)
return True
Хотя это не работает (так как django-configurations
загружает настройки во время более ранней фазы pytest_load_initial_conftests
), этот пример должен дать представление о том, чтоЯ пытаюсь достичь.
Большое препятствие: соединение с базой данных default
должно указывать на базу данных текущего арендатора до загрузки каких-либо устройств и после запуска flush
.
Я отключил механизм фиксации сеанса по умолчанию pytest-django
и планирую использовать внешнюю базу данных для тестов:
@pytest.fixture(scope='session')
def django_db_setup():
pass
У меня может быть скрипт Python-оболочки, который вызывает pytest
множественныйраз с правильным конфигом, но я бы потерял много хороших инструментов.