在pytest中重复使用灯具

时间:2017-08-23 00:04:56

标签: python pytest fixtures

我正在学习pytest,特别是它与xUnit setUp()和tearDown()范例不同的灯具。说我有以下测试:

import pytest


@pytest.fixture()
def foo():
    return 'foo'


@pytest.fixture()
def bar():
    return 'bar'


@pytest.fixture()
def baz():
    return 'baz'


@pytest.fixture()
def foobar(foo, bar):
    return foo + bar


@pytest.fixture()
def foobaz(foo, baz):
    return foo + baz


def test(foobar, foobaz):
    print('test')
    print(foobar)
    print(foobaz)

在此示例中,foo()灯具使用了两次,一次是foobar(),另一次是foobaz()。如果我为一次测试多次重复使用相同的夹具,那么夹具功能是否被调用一次并且其结果被缓存?或者每次使用它时都会调用它?在我的设计示例中,返回的值是静态的,因此没有问题。我可以想象很多情况下返回的值更具动态性,我需要保证在任何地方都使用完全相同的实例。

2 个答案:

答案 0 :(得分:1)

pytest fixture的生命可以用scope参数控制。基本上有四个范围function, class, module, session。默认范围是function,这是您的灯具使用的范围。

function范围的情况下,将为每个使用夹具的测试函数调用夹具。

在整个测试周期中,每个测试类调用一次class范围的夹具,因此module范围夹具(每个测试模块一次)。

每个测试会话调用一次session范围的夹具。

fixturesfixture function

提供了更多阅读和不同范围的示例

答案 1 :(得分:1)

夹具仅在使用时调用,并且仅基于范围调用一次。

如果范围是session,则只会在整个执行过程中调用一个范围。在您的情况下,由于您未指定范围,因此它假定为function

以下是执行顺序

foo
bar
foo + bar
baz
foo + baz

正如您所见,baz仅在请求foo + baz方法时调用。

  • 如果从测试功能中删除这两个参数。什么都不会被称为甚至一次。
  • 如果您删除foobaz,则baz将永远不会调用foobaz
  • 如果您插入另一个函数test2(foobar, foobaz),则整个循环将重复,因为fixture的范围是per / function