Pytest和pytest-django:如何在不同的上下文中多次运行每个测试(完成设置和拆除)?

时间:2018-06-04 12:09:06

标签: python django pytest pytest-django

我正在为多租户系统设置测试平台。

对于每个书面测试,我想为每个租户创建一个测试并包装整个测试运行,以便在测试之前更改数据库连接和一些线程局部变量,而不会破坏数据库拆卸它的位置。

在我的试错过程中,我在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,但是我会丢失很多漂亮的工具。

0 个答案:

没有答案