我正在学习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()
。如果我为一次测试多次重复使用相同的夹具,那么夹具功能是否被调用一次并且其结果被缓存?或者每次使用它时都会调用它?在我的设计示例中,返回的值是静态的,因此没有问题。我可以想象很多情况下返回的值更具动态性,我需要保证在任何地方都使用完全相同的实例。
答案 0 :(得分:1)
pytest fixture的生命可以用scope
参数控制。基本上有四个范围function, class, module, session
。默认范围是function
,这是您的灯具使用的范围。
在function
范围的情况下,将为每个使用夹具的测试函数调用夹具。
在整个测试周期中,每个测试类调用一次class
范围的夹具,因此module
范围夹具(每个测试模块一次)。
每个测试会话调用一次session
范围的夹具。
答案 1 :(得分:1)
夹具仅在使用时调用,并且仅基于范围调用一次。
如果范围是session
,则只会在整个执行过程中调用一个范围。在您的情况下,由于您未指定范围,因此它假定为function
。
以下是执行顺序
foo
bar
foo + bar
baz
foo + baz
正如您所见,baz
仅在请求foo + baz
方法时调用。
foobaz
,则baz
将永远不会调用foobaz
test2(foobar, foobaz)
,则整个循环将重复,因为fixture的范围是per / function