[英]Why would a pytest factory as fixture be used over a factory function?
在py.test 文档中,它描述了将工厂方法声明为固定装置,如下所示:
@pytest.fixture
def make_foo():
def __make_foo(name):
foo = Foo()
foo.name = name
return foo
return __make_foo
与仅定义 make_foo 函数并使用它相比,这样做有什么好处/权衡? 我不明白为什么它是固定装置。
实际上,最重要的优势是能够使用其他fixtures,并使pytest的依赖注入为您工作。 另一个优点是允许您将参数传递给工厂,这在普通夹具中必须是静态的。
看这个例子:
@pytest.fixture
def mocked_server():
with mock.patch('something'):
yield MyServer()
@pytest.fixture
def connected_client(mocked_server):
client = Client()
client.connect_to(mocked_server, local_port=123) # local_port must be static
return client
您现在可以编写一个获取connected_client
的测试,但您无法更改端口。 如果您需要对多个客户端进行测试怎么办? 你也不能。
如果你现在写:
@pytest.fixture
def connect_client(mocked_server):
def __connect(local_port):
client = Client()
client.connect_to(mocked_server, local_port)
return client
return __connect
您可以编写接收connect_client
工厂的测试,并调用它以在任何端口获取初始化的客户端,以及您想要的次数!
如果您有许多简单的工厂,那么您可以使用装饰器简化它们的创建:
def factory_fixture(factory):
@pytest.fixture(scope='session')
def maker():
return factory
maker.__name__ = factory.__name__
return maker
@factory_fixture
def make_stuff(foo, bar):
return 'foo' + str(foo + bar)
这相当于
@pytest.fixture(score='session')
def make_stuff():
def make(foo, bar):
return 'foo' + str(foo + bar)
return
一个示例可能是会话级装置,例如:
@pytest.fixture(scope="session")
def make_foo():
def __make_foo(name):
foo = Foo()
foo.name = name
return foo
return __make_foo
这样,Pytest 将确保在您的测试期间只存在一个工厂实例。 特别是这个例子可能不会从中获得太多,但是如果外部函数做了很多处理,例如从文件中读取或初始化数据结构,那么这可以为您节省大量时间。
请参阅下面的代码,这可以回答您的问题..
import pytest
@pytest.fixture
def make_foo():
def __make_foo(name):
print(name)
return __make_foo
def test_a(make_foo):
make_foo('abc')
def test_b(make_foo):
make_foo('def')
输出如下所示::
tmp3.py::test_a abc
PASSED
tmp3.py::test_b def
PASSED
基本上您可以在工厂夹具中传递参数,并可以根据您的要求使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.