繁体   English   中英

为什么要在工厂函数上使用 pytest 工厂作为夹具?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM