我正在为多租户系统设置测试平台。
对于每个书面测试,我想为每个租户创建一个测试并包装整个测试运行,以便在测试之前更改数据库连接和一些线程局部变量,而不会破坏数据库拆卸它的位置。
在我的试错过程中,我在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
,但是我会丢失很多漂亮的工具。