2014-09-13 23 views
2

我想使用PyTest,我無法獲得如何設置燈具。我試過下面的代碼:pytest夾具不起作用 - 爲什麼?

import pytest 
import random 

@pytest.fixture() 
def setup(): 
    a = random.randint(0,10) 

def test(setup): 
    assert 3 > a 
if __name__ == '__main__': 
    pytest.main() 

而且我越來越"NameError: name 'a' is not defined".

而且例如,從官方文檔不起作用。怎麼了?我需要功能類似於setUp/tearDown。但我不想使用單元測試。有人能給我提供一個工作夾具的例子(setUp類型和tearDown類型)嗎?我想寫一些測試作爲函數和一些測試作爲類內的方法,因此我的第二個問題是使用具有類/方法的fixture的工作示例。我只需要在python中查看fixtures的工作示例。

是否與斷言簡單不同python3單元測試框架爲PyTest

回答

5

燈具不能這樣工作。他們不能神奇地將名稱a從一個功能的(setup)本地範圍轉移到另一個(test)。相反,您的setup函數必須顯式返回將作爲setup參數傳遞給您的test函數的對象。例如:

import pytest 
import random 

class TestSetup: 
    def __init__(self): 
     self.a = random.randint(0, 10) 

@pytest.fixture() 
def setup(): 
    return TestSetup() 

def test(setup): 
    assert 0 <= setup.a <= 10 

if __name__ == '__main__': 
    pytest.main() 
+0

謝謝** Vasiliy **。有沒有更簡單的方法來設置/ tearDown pytest?更容易我的意思是減少打字。我嘗試在燈具中定義變量並將其返回,但它不起作用。我真的不想爲此定義額外的類。任何意見將是有益的。還有,是否有另一個單元測試框架,其斷言以pytest中的語句定義?我想盡可能少寫:)再次感謝。 – 2014-09-13 16:20:11

+0

@ master.py如果你只需要一個變量(在這種情況下爲'a'),只需從'setup()'返回它。然後,在'test()'裏面,'setup'參數的值就是你返回的值,所以你可以寫:'assert 0 <= setup <= 10'。 – 2014-09-13 16:22:18

+0

** Vasiliy **!有用。這很簡單。我被文檔弄糊塗了。我有兩個更多的好處要問。你能告訴我如何以類似的方式設置tearDown - 我讀過文檔,我不知道:(以及如何爲所有測試設置默認的setUp和tearDown,而不需要明確地加入像'def test(setup)':' – 2014-09-13 16:31:04