gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:31 24 4
gpt4 key购买 nike

在我的功能测试中,我需要创建一个对象(与虚拟服务器相关 - 不是模拟的),该对象将由一组测试共享。服务器是使用一些 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()

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

有办法吗?我以为我可以使用安装/拆卸或创建测试类来完成此操作,但我失败了。

我希望这不是一个极其幼稚的问题,但它可能是。

最佳答案

这就是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 参数。这样,每个测试 session 仅创建服务器一次,无论有多少测试正在使用它,以及它们是如何参数化的。

关于python - Pytest - 创建一个由多个测试共享的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37251892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com