是否可以将参数传递给夹具?

时间:2014-08-26 11:28:10

标签: python pytest

我不是在谈论" Fixture Parametrizing"由pytest定义,我在谈论你传递给函数的实际参数(在这种情况下是fixture函数),以使代码更加模块化。

为了演示,这是我的装置

@yield_fixture
def a_fixture(a_dependency):
    do_setup_work()
    yield
    do_teardown_work()
    a_dependency.teardown()

如您所见,我的装置依赖于a_dependency,其中还需要调用其拆卸()。我知道在天真的用例中,我可以这样做:

@yield_fixture
def a_dependency():
    yield
    teardown()

@yield_fixture
def a_fixture(a_dependency):
    do_setup_work()
    yield
    do_teardown_work()

但是,虽然a_fixture代码可以放在中心位置并由所有测试重用,但a_dependecy代码是特定于测试的,每个测试可能需要创建一个新的a_dependency代码。 1}}对象。

我想避免将夹具和依赖项复制粘贴到我的所有测试中。如果这是常规的python代码,我可以将a_dependecy作为函数参数传递。如何将此对象传递给共享夹具?

2 个答案:

答案 0 :(得分:0)

在我看来,也许你不希望a_dependency成为一个装置,你只是想让它成为常规功能。你喜欢这样的事吗?

def a_dependency():
    # returns a context manager


@yield_fixture
def a_fixture():
    with a_dependency() as dependency:
        do_setup_work()
        yield
        do_teardown_work()

答案 1 :(得分:0)

好吧,如果a_dependency真的必须成为一个夹具,为什么不是两全其美?装饰者毕竟只是语法糖。

def a_dependency():
    # returns a context manager

a_dependency_fixture = yield_fixture(a_dependency)


@yield_fixture
def a_fixture():
    # here use a_dependency as a regular function
    with a_dependency() as dependency:
        do_setup_work()
        yield
        do_teardown_work()



def test_foo(a_dependency_fixture):
    # here use a_dependency as a fixture
    pass

我没有检查过这确实有效,因为问题中的信息对于我来说太过通用了。如果您能提供更多细节,可能更容易提供更有用的答案。