Как говорится в документе , 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'
Я думаю, что здесь должен быть некоторый самоанализ, который требует, чтобы параметры функции тестирования были действительными приборами. Я прав в этом?
Помимо приборов, есть другие магические имена параметров, которые смутили меня. Одним из них является 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, name, pytestconfig, record_xml_attribute, record_xml_property, recwarn, tmpdir, tmpdir_factory, worker_id
> используйте 'pytest --fixtures [testpath]' для помощи по ним.
Так сколько же магических имен , как это, я должен позаботиться при использовании pytest, чтобы не попасть в ловушку?