2014-01-30 61 views
1

The docs說:如何使用的xUnit風格setup_function

如果你寧願定義的測試功能直接在模塊級,你也可以使用以下功能來實現燈具:

def setup_function(function): 
    """ setup any state tied to the execution of the given function. 
    Invoked for every test function in the module. 
    """ 

def teardown_function(function): 
    """ teardown any state that was previously setup with a setup_function 
    call. 
    """ 

但實際上目前還不清楚你應該如何使用它們。

我試着把它們放在我的測試文件中,就像上面顯示的那樣,但是它們沒有被調用。仔細看看它們,那個function arg看起來像裝飾者。所以,我試圖找到一種方法做:

@pytest.setup_function 
def my_setup(): 
    # not called 

我找不到任何地方導入一個由作爲裝飾的,所以不能是正確的。

我發現this thread on grokbase如果有人介紹,你可以這樣做:

@pytest.fixture(autouse=True) 
def setup_function(request): 
    # this one gets called 

它的工作原理,但它似乎並沒有相關的文檔的任何更多...沒有理由在這裏稱之爲setup_function

回答

2

你只需要實現的setup_function()身體,調用該函數爲每個函數的名稱以test_開始,該功能被傳遞作爲一個參數:

def setup_function(fun): 
    print ("in setup function: " + fun.__name__) 

def test_test(): 
    assert False 

這將給作爲輸出,與運行py.test

============================= test session starts ============================== 
platform linux2 -- Python 2.7.6 -- pytest-2.3.5 
collected 1 items 

test/test_test.py F 

=================================== FAILURES =================================== 
__________________________________ test_test ___________________________________ 

    def test_test(): 
>  assert False 
E  assert False 

test/test_test.py:7: AssertionError 
------------------------------- Captured stdout -------------------------------- 
in setup function: test_test 
=========================== 1 failed in 0.01 seconds =========================== 

最後一個之前的線表示從實際調用setup_function()

輸出

稍微更有用的例子,實際上做的事情影響了測試功能:

def setup_function(function): 
    function.answer = 17 

def teardown_function(function): 
    del function.answer 

def test_modlevel(): 
    assert modlevel[0] == 42 
    assert test_modlevel.answer == 17 

這是從py.testown tests,總是一個好(希望完成)一套的py.test所有功能例子拍攝。

+0

謝謝,結果我遭受了終結代碼失明......我的測試函數實際上是在一個類中(我查了這個,只是沒有看到它!)......製作一個'setup_method(自我,方法)'在班內完美運作,這只是我是一個白癡 – Anentropic