【问题标题】:pytest: fixtures as function argumentspytest:固定装置作为函数参数
【发布时间】:2019-04-03 03:25:16
【问题描述】:

正如document 所说,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,还有其他的magic参数名让我很困惑。其中之一是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'

但是运行测试会报错fixture req not found。这让我更加困惑,因为列出的可用灯具不包括request。我不确定在这里调用 request 是否合适,但错误消息自相矛盾:

找不到 E 夹具“req”

> 可用的固定装置:cache、capfd、capfdbinary、caplog、capsys、capsysbinary、doctest_namespace、monkeypatch、name、pytestconfig、record_xml_attribute、record_xml_property、recwarn、tmpdir、tmpdir_factory、worker_id

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

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

【问题讨论】:

  • 对于第二个代码sn-p,你必须发送函数(你在其中使用了fixture decorator)

标签: python pytest


【解决方案1】:

是的,Py.test 注入了一点参数名称自省魔法,以使您的测试用例保持简洁。

除了您可用的任何固定装置(正如您在pytest --fixtures 中发现的那样),我确实认为request 是唯一的附加魔术参数(当然,除非您使用@pytest.mark.parametrize('foo', (...)),其中case foo 是那个标记的测试用例或夹具等的神奇参数。

顺便说一句,我认为最好不要将 Py.test test_ 函数视为常规旧函数,因为 Py.test 不会直接调用它们。

【讨论】:

    猜你喜欢
    • 2017-11-24
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    相关资源
    最近更新 更多