【问题标题】:In pytest, how can I access the parameters passed to a test?在 pytest 中,如何访问传递给测试的参数?
【发布时间】:2012-11-21 20:41:24
【问题描述】:

在 pytest 中,我可以传递参数进行测试(使用夹具或装饰器 @pytest.fixture(params=list-of-params))。

测试完成后,如果测试失败,则通过的参数会显示在结果中,如 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 在测试失败时截取屏幕截图,但是因为带有参数的测试具有相同的名称和类名等等,它正在为第一次执行编写一个文件,然后在第二次、第三次、... ,时间。所以我想将参数添加到文件名中以避免这种情况。

谢谢!

【问题讨论】:

  • request.node.callspec.params 是一个类似于 kwargs 的 dict,具有当前测试参数的值。
  • 参数现在可以从request.node.funcargs获得

标签: python testing pytest


【解决方案1】:

确实,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_driveruser 实际参与测试的情况下做某事,那么你可以这样做:

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

【讨论】:

    猜你喜欢
    • 2018-02-26
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多