首页 文章

Pytest - 创建由多个测试共享的对象

提问于
浏览
1

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

# [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()

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

有办法吗?我以为我可以使用setup / teardown或创建测试类来完成它,但我失败了 .

我希望这不是一个非常无聊的问题,但它可能是 .

1 回答

  • 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 参数 . 这样,每个测试会话只创建一次服务器,无论有多少测试使用它,以及它们如何参数化 .

相关问题