pytest: фикстуры как аргументы функции - PullRequest
0 голосов
/ 30 октября 2018

Как говорится в документе , 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, чтобы не попасть в ловушку?

1 Ответ

0 голосов
/ 30 октября 2018

Да, Py.test вводит немного магии самоанализа имени аргумента, чтобы ваши тесты были краткими.

Помимо любых имеющихся у вас приборов (как вы узнали с помощью pytest --fixtures), я действительно думаю, что request - это единственный дополнительный магический параметр (если, конечно, вы не используете, скажем, @pytest.mark.parametrize('foo', (...)), в котором case foo - магический параметр для этого отмеченного тестового примера или прибора и т. д.).

Кроме того, я думаю, что лучше не думать о функциях Py.test test_ как об обычных старых функциях, так как они напрямую не называются таковыми Py.test.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...