Pytest和pytestDjango:如何在不同的上下文中多次运行每个测试(完成setup和teardown)?

2024-09-23 06:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为多租户系统建立测试平台。在

对于每个编写的测试,我想为每个租户创建一个测试,并包装整个测试运行,以便在测试之前更改数据库连接和一些线程本地变量,而不会破坏数据库清理的位置。在

在我的尝试和错误过程中,我在pytest钩子链中爬得越来越高:我从pytest_generate_tests开始为每个租户创建一个带有相关fixture的测试,但是teardown失败了,我的最终想法是:

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数据库连接需要在加载任何fixture之前和运行flush之后指向当前租户的数据库。在

我禁用了pytest-django的默认会话固定机制,并计划使用外部数据库进行测试:

^{pr2}$

我可以有一个包装器python脚本,用正确的配置多次调用pytest,但是我会丢失很多漂亮的工具。在


Tags: django数据库pytest过程session系统错误with