2016-05-16 64 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