2017-08-22 67 views
2

我正在使用主要使用unittest編寫的代碼庫。測試用pytest運行。我試圖通過參數化一些簡化測試。爲了實現這個目標,我試圖學習如何使用pytest fixture並重構一些現有的基於單元測試的測試。目前的測試必須以conftest.py全球夾具:Chain multiple fixture pytest/unittest hybrid

@pytest.fixture(autouse=True) 
def register_cleanup(): 
    yield True 
    print("cleaning up database") 

現在我想添加一個夾具,專用於我的測試模塊之一,沿東西的

@pytest.fixture() 
def foo_fixture(): 
    print("setup fixture") 
    yield 
    print("tear down fixture") 


class Foo(unittest.TestCase): 
    def setUp(self): 
     print('unittest setUp()') 

    def test(self): 
     print('test') 

行然而,該模塊夾具中的print()語句從不執行。作爲一箇中間步驟,我保持基於單元測試的結構並添加它。是否有可能以我想要的方式得到這個工作,或者我需要完全取消單元測試並直接進入pytest。

+0

哪裏會想到使用這種燈具?你還想在這裏打開'autouse = True'嗎?一般來說,只有在它們是測試參數時才執行fixtures,而不是範圍假設的通用清理機制 – Cireo

+0

@Cireo您是否應該將'autouse = True'添加到'foo_fixture()'類似於'register_cleanup ()'? –

+0

@Cireo隨意發佈這個答案。 –

回答

1

你會想將其標記爲:

@pytest.mark.usefixtures("foo_fixture") 
class Foo(unittest.TestCase): 
    ... 

注意:你可能有一個以上的conftest.py。把更具體的夾具放入這個測試子目錄的conftest.py

+0

謝謝。我在瀏覽文檔時一定錯過了必要的細節。 –

+0

不幸的是,所有的測試都在一個目錄中。當我重構時,我會考慮更好地組織它們。 –

0

你認爲這個夾具可以用在哪裏?

你想在這裏打開autouse=True嗎?一般來說,燈具只有在它們是測試參數時纔會執行,並且比範圍假設更少的是通用清理機制。通過開啓autouse這個燈具,你會基本上是添加一個額外的設置,清除步驟當前模塊:

https://docs.pytest.org/en/latest/fixture.html#autouse-fixtures-xunit-setup-on-steroids

這裏是autouse燈具在其他範圍內的工作原理:

autouse燈具服從範圍=關鍵字參數:如果自動化工具 夾具的範圍='會話',它將只運行一次,不管它在哪裏定義了 。範圍='class'表示每個班級將運行一次,等等。 如果在測試模塊中定義了一個自動夾具,則所有測試 函數都會自動使用它。如果在 conftest.py文件中定義了一個自動夾具,那麼所有在其目錄 下的測試模塊中的所有測試都將調用夾具。最後,請使用 注意事項:如果您在插件中定義了一個自動夾具,則將爲插件安裝的所有項目中的所有測試調用 。如果只有固定裝置在某些 設置的存在下工作,這可以是 e。 G。在ini文件中。這樣一個全球性的夾具應該總是快速確定它是否應該做任何工作,並避免其他昂貴的進口或計算。

[進入一個答案Adaptied評論]