Pytest - 创建一个由多个测试共享的对象
Pytest - create an object shared by multiple tests
在我的功能测试中,我需要创建一个对象(它与虚拟服务器相关 - 而不是模拟服务器),该对象将由一组测试共享。服务器创建时使用了一些 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 或通过创建测试 class 来做到这一点,但我失败了。
我希望这不是一个非常菜鸟的问题,但它可能是。
这就是 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
参数。这样,无论有多少测试正在使用它,以及它们是如何参数化的,每个测试会话只创建一次服务器。
在我的功能测试中,我需要创建一个对象(它与虚拟服务器相关 - 而不是模拟服务器),该对象将由一组测试共享。服务器创建时使用了一些 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 或通过创建测试 class 来做到这一点,但我失败了。
我希望这不是一个非常菜鸟的问题,但它可能是。
这就是 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
参数。这样,无论有多少测试正在使用它,以及它们是如何参数化的,每个测试会话只创建一次服务器。