2016-05-16 63 views
1

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

# [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或者创建一个测试课来完成,但是我失败了。

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

回答

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

+1

这里有一个小的错字 - 'score ='session'' - 应该是范围,而不是分数。 –

+0

@TomDalton修正了,谢谢! – bereal

+0

是的!我只需要改变host,env和dns的作用域以匹配'session'作用域,并且它完美地工作。此外,它不会中断其余的测试,所以我可以开始以这种方式编写新测试,并在此期间修改旧测试。 你是我今天的英雄,我能不能给你买啤酒? :) – Taku