pytest:固定装置作为函数参数

正如其文档所说,pytest 接受夹具作为函数参数。然而,这与几乎所有语言中参数名称不应影响函数行为的约定有些矛盾。例如:


这有效:


import pytest


@pytest.fixture()

def name():

    return 'foo'


def test_me(name):

    assert name == 'foo'

但这不会:


import pytest


@pytest.fixture()

def name():

    return 'foo'


def test_me(nam):

    assert nam == 'foo'

我认为这里必须有一些内省,需要测试函数参数是有效的装置。我在这方面正确吗?


除了fixtures,还有其他神奇的参数名称让我感到困惑。其中之一是request:


import pytest


@pytest.fixture(params=['foo', 'bar'])

def name(request):

    return request.param


def test_me(name):

    assert name == 'foo'

无需阅读其文档,您似乎可以重命名request为另一个名称,例如req:


import pytest


@pytest.fixture(params=['foo', 'bar'])

def name(req):

    return req.param


def test_me(name):

    assert name == 'foo'

但是然后运行测试会抱怨req找不到夹具。这让我更加困惑,因为列出的可用装置不包括request. 我不确定request在这里调用夹具是否合适,但错误消息自相矛盾:


未找到 E 夹具“req”


> 可用设备:缓存、capfd、capfdbinary、caplog、capsys、capsysbinary、doctest_namespace、monkeypatch、名称、pytestconfig、record_xml_attribute、record_xml_property、recwarn、tmpdir、tmpdir_factory、worker_id


> 使用 'pytest --fixtures [testpath]' 寻求帮助。


那么在使用 pytest 时我必须注意多少这样的魔法名称才不会陷入陷阱?


森林海
浏览 132回答 1
1回答

慕哥6287543

是的,Py.test 注入了一点参数名称自省魔法来保持你的测试用例简洁。除了您可用的任何装置(正如您发现的那样pytest --fixtures)之外,我确实认为这request是唯一的附加魔术参数(当然,除非您使用,例如@pytest.mark.parametrize('foo', (...)),在这种情况下foo是标记的测试用例或装置的魔术参数, 等等。)。顺便说一句,我认为最好不要将 Py.testtest_函数视为常规的旧函数,因为 Py.test 不会直接调用它们。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python