【发布时间】: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)