pytest:夹具作为函数参数

时间:2018-10-30 06:09:16

标签: python pytest

正如其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'

我认为这里必须进行一些自省,要求测试功能参数是有效的灯具。我对此是否正确?


除了灯具之外,还有其他 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'

但是随后运行测试将抱怨找不到夹具req。这进一步使我感到困惑,因为列出的可用固定装置不包含request。我不确定是否在此处调用request固定装置是正确的,但是错误消息本身却与此矛盾:

  

找不到E夹具'req'

     

可用的固定装置:缓存,capfd,capfdbinary,caplog,capsys,capsysbinary,doctest_namespace,monkeypatch,名称,pytestconfig,record_xml_attribute,record_xml_property,rewarn,tmpdir,tmpdir_factory,worker_id

     

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

那么当使用pytest避免陷入困境时,我必须照顾多少个这样的魔术名称

1 个答案:

答案 0 :(得分:2)

是的,Py.test注入了一些自变量名称自省魔法,以保持测试用例的简洁。

除了可用的固定装置(如您在pytest --fixtures中发现的)之外,我确实认为request是唯一的附加魔术参数(当然,除非您使用{{ 1}},在这种情况下,@pytest.mark.parametrize('foo', (...))是该标记的测试用例或固定装置等的魔术参数。

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