2012-11-21 63 views
3

在pytest中,我可以傳遞參數來測試(使用燈具或修飾器@pytest.fixture(params=list-of-params))。在pytest中,我如何訪問傳遞給測試的參數?

測試完成後,如果測試失敗,則傳遞的參數會顯示在結果中,如TestCheckoutPage.test_address_edit[True]False(如果爲false)。

如何訪問這些參數並將它們添加到終結器中? request.param似乎並沒有工作,即使是製作夾具時,你將如何獲取參數:

@pytest.fixture(params=[True, False]) 
def user(request): 
    return request.param 

工程。但是,如果我嘗試將它傳遞給一個測試:

class TestClass: 
    def test_something(self, user): 
     pass 

,然後使用autouse夾具,以收集信息就可以了:

@pytest.fixture(autouse=True) 
def set_driver(self, request): 
    print request.param 

拋出一個錯誤,說有在FixtureRequest沒有param

有沒有一種方法可以得到該參數?我試圖讓Selenium在測試失敗時截取屏幕截圖,但是因爲帶有參數的測試具有相同的名稱和類名,並且它正在爲第一次執行寫入一個文件,然後第二次,第三次覆蓋它。 ,時間周圍。所以我想將這個參數添加到文件名中以避免這種情況。

謝謝!

+0

'request.node.callspec.params'是一個類似kwargs的字典,並且具有當前測試參數的值。 –

回答

5

實際上,request.param僅在定義參數化的夾具功能中可用。如果您在set_driver夾具需要user你可以試試這個:

import pytest 

@pytest.fixture(params=[True, False]) 
def user(request): 
    return request.param 

class TestHello: 
    @pytest.fixture(autouse=True) 
    def set_driver(self, user): 
     print "set_driver sees", user 

    def test_method(self): 
     assert 0 

如果你只是想有set_driver做一些事情,如果user實際上是參與測試,那麼你可以做這樣的事情:

import pytest 

@pytest.fixture(params=[True, False], scope="module") 
def user(request): 
    return request.param 

@pytest.fixture(autouse=True) 
def set_driver(request): 
    if "user" in request.fixturenames: 
     user = request.getfuncargvalue("user") 
     print "set_driver sees", user 


def test_function(user): 
    assert 0 

def test_function_nouser(): 
    assert 0 
相關問題