2012-11-21 66 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 
相关问题