2013-01-11 49 views
1

代碼的功能測試通常需要外部資源,例如,一個數據庫。啓動/停止守護進程作爲單元測試的一部分的最佳實踐(使用pytest)

基本上有兩種方法:

  • 假設資源(如數據庫)始終運行並隨時可用
  • 啓動/停止相關的資源作爲測試的一部分

在Python單元測試(2)的「舊」世界中,可以使用world setUp()和tearDown()方法來控制服務。

隨着py.test世界變得更加複雜,setUp()和tearDown()方法的概念已經被實現燈具的funcarg魔術所取代。 老實說,這種方法被破壞 - 至少作爲setUp/tearDown方法的替代。

在使用py.test的項目中控制服務和資源的推薦方式是什麼?

我們是否應該繼續用setUp/tearDown方法編寫測試(至少在需要的地方)還是有更好的模式?

+1

爲什麼你認爲夾具的方法被打破?你有什麼具體問題? – pfctdayelise

回答

1

pytest支持xUnit風格的設置/拆卸方法,請參閱http://pytest.org/latest/xunit_setup.html,所以如果你喜歡這種風格,你可以使用它。

使用http://pytest.org/latest/fixture.html也可以實例化一個「會話」範圍的fixture,它可以爲整個測試運行實例化外部進程並返回一個連接對象。代碼將大致是這樣的:使用

# content of conftest.py 

import pytest 

@pytest.fixture(scope="session") 
def connection(): 
    ... instantiate process ... 
    return connection_to_process_or_url 

和測試文件是這樣的:

# content of test_conn.py 
def test_conn_ok(connection): 
    ... work with connection ... 

如果你想要跟上測試運行的服務,你需要編寫一些邏輯(存儲PID,檢查它是否活着,如果沒有PID或沒有活動,開始一個新的進程),暫時(未來版本可能包括這樣的支持代碼)。

0

在pytest中這樣做的正確方法似乎是使用會話範圍的燈具,如hpk42 points out。您可以使用yield語句簡潔內嵌安裝/拆卸成一個單一的電話,按了Fixture finalization/executing teardown code section of the documentation

import smtplib 
import pytest 

@pytest.fixture(scope="module") 
def smtp(request): 
    smtp = smtplib.SMTP("smtp.gmail.com") 
    yield smtp # provide the fixture value 
    print("teardown smtp") 
    smtp.close() 

在這種情況下,你可以使用session範圍內,如果你不希望這每個模塊的運行。

相關問題