【问题标题】:Pytest - create an object shared by multiple testsPytest - 创建一个由多个测试共享的对象
【发布时间】:2016-05-16 10:36:37
【问题描述】:

在我的功能测试中,我需要创建一个对象(与虚拟服务器相关 - 不是模拟的),该对象将由一组测试共享。服务器是使用一些 py.test 固定装置(环境、主机等)创建的,以指定应该在哪个环境上设置它 - 测试在多个不同的环境中运行。我目前的方法很丑,就像这个抽象的例子:

# [host, env, dns are fixtures, defined in conftest.py and passed from
# commandline args - py.test recognizes them so they can be changed
# each time the test is invoked from CLI]

@pytest.mark.parametrize(parameters_from_parametrize)

def test_something(host, env, dns):
    server = Server(host,env, dns, random_name, random_passwd)
    server.create()
    server.do_stuff(parameters_from_parametrize)
    check_stuff()
    server.delete()

但这会为每组 parameters_from_parametrize 创建一个新服务器。有没有办法创建一个服务器,使用固定装置,然后运行该服务器?

例如:

server = Server(host,env, dns, random_name, random_passwd)
server.create()

@pytest.mark.parametrize(parameters_from_parametrize)

def test_something(server):
    server.do_stuff(parameters_from_parametrize)
    check_stuff()

server.delete()

这样服务器只会被创建一次。上面的示例不起作用,因为不能在测试函数之前使用夹具(并且测试函数之外的代码不会与它们共享范围),因此在测试函数之外添加服务器失败。我尝试了设置和拆卸,但我无法让它与固定装置一起使用。

有办法吗?我以为我可以使用 setup/teardown 或通过创建测试类来做到这一点,但我失败了。

我希望这不是一个非常愚蠢的问题,但它可能是。

【问题讨论】:

    标签: python testing pytest


    【解决方案1】:

    这就是fixtures 的用途:

    @pytest.fixture(scope='session')  # one server to rule'em all
    def server():
        server = Server(host, env, dns, random_name, random_passwd)
        server.create()
        return server
    
    def test_something(server, ...):
        # test logic
    

    这也可以改进为在测试完成后关闭服务器:

    @pytest.yield_fixture(scope='session')
    def server():
        server = Server(host,env, dns, random_name, random_passwd)
        server.create()
        yield server
        server.delete()
    

    在任何一种情况下,pytest 都会根据定义的范围处理服务器创建,并为所有拥有它的测试函数提供server 参数。这样一来,无论有多少测试正在使用它,以及它们是如何参数化的,每个测试会话只创建一次服务器。

    【讨论】:

    • 这里有一个小错字 - score='session' - 应该是范围,而不是分数。
    • 是的!我只需要更改主机、env 和 dns 的范围以匹配“会话”范围,并且效果很好。另外,它不会破坏其余的测试,所以我可以通过这种方式开始编写新的测试并同时修改旧的测试。你是我今天的英雄,我可以给你买杯啤酒吗? :)
    • @Taku 总是乐于提供帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2019-07-06
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多