有没有更好的方法来确保一个fixture在另一个fixture之后运行,而不在参数中列出那些fixture?

2024-05-19 20:54:41 发布

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

我需要运行一组预测试检查,但是其中一个检查需要初始化提供程序。 解决这个问题的方法似乎是在fixture参数中添加'foo\u provider',以确保它在foo\u provider运行之后运行。但是,我不想在预测试fixture的args中列出20个fixture。你知道吗

我试过使用pytest.mark.trylast,我试过顺序标记。这些都不能正常工作。我尝试过在pytest_generate_tests中添加各种各样的东西,这往往会使测试的数量增加。 最后,我将kwargs添加到fixture定义中,然后通过来自pytest_generate_tests的函数修改metafunc._arg2fixturedefs,这感觉非常糟糕。你知道吗

我试过了,但失败了,因为它运行检查也太早了:

@pytest.fixture(params=[pytest.lazy_fixture('foo_provider')], autouse=True)
def pretest(test_skipper, logger, request):
    logger().info('running pretest checks')
    test_skipper()

尝试过像这样重新排序装置(从pytest_generate_tests调用)但失败:

def execute_pretest_last(metafunc):
        fixturedef = metafunc._arg2fixturedefs['pretest']
        fixture = metafunc._arg2fixturedefs['pretest'][0]
        names_order = metafunc.fixturenames
        names_order.insert(len(names_order), names_order.pop(names_order.index(fixture.argname)))

        funcarg_order = metafunc.funcargnames
        funcarg_order.insert(len(funcarg_order), 
        funcarg_order.pop(funcarg_order.index(fixture.argname)))

下面的代码按预期工作,但有更好的方法吗?你知道吗

def pytest_generate_tests(metafunc):
    for fixture in metafunc.fixturenames:
        if fixture in PROVIDER_MAP:
              parametrize_api(metafunc, fixture), indirect=True)
              add_fixture_to_pretest_args(metafunc, fixture)

def add_fixture_to_pretest_args(metafunc, fixture):
    pretest_fixtures = list(metafunc._arg2fixturedefs['pretest'][0].argnames)
    pretest_fixtures.append(fixture)
    metafunc._arg2fixturedefs['pretest'][0].argnames = tuple(pretest_fixtures)

@pytest.fixture(autouse=True)
def pretest(test_skipper, logger, **kwargs):
    logger().info('running pretest checks')
    test_skipper()

Tags: testfoonamespytestdeftestsorderlogger