Pytest: во время выполнения параметризация теста
Кто-нибудь знает обходной путь для динамической параметризации теста Pytest.
Пример:
resp = []
def test_1():
r = requests.get(<some url>)
resp = <parse a list out of response r>
@pytest.mark.parameterize("response",resp)
def test_2(response):
<Use resp values and pass it one by one to another api>
Я столкнулся со следующей проблемой на pytest g ithub, которая почти такая же, как моя проблема.
https://g ithub.com/pytest-dev/pytest/issues/3273
Согласно этому обсуждению, pytest параметризует тест перед выполнением любого теста. Параметризация во время выполнения не поддерживается. Кто-нибудь знает об обходном пути или питоническом способе справиться с этим поведением?
1 ответ
Ответ Адриана Крупы близок, теперь добавьте параметризацию ответа:
CANNED_RESPONSES = dict(OK=200, REDIRECT=304, SERVER_ERROR=500)
RESPONSE = 'response'
def pytest_generate_tests(metafunc):
if RESPONSE in metafunc.fixturenames:
ids = list(CANNED_RESPONSES.keys())
responses = list(CANNED_RESPONSES.values())
metafunc.parametrize(RESPONSE, responses, ids=ids)
def test_flar(response):
print response
Таким образом вы можете получить именованные идентификаторы в -v и несколько тестов для набора стандартных ответов:
test_in.py::test_flar[OK] 200
PASSED
test_in.py::test_flar[REDIRECT] 304
PASSED
test_in.py::test_flar[SERVER_ERROR] 500
PASSED
Не заставляйте тесты зависеть друг от друга. Это не очень хорошая практика, как описано здесь.
Если вы хотите повторно использовать ответ на запрос, вы можете обернуть его в фиксатор.
@pytest.fixture(scope="module")
def response():
import requests
return requests.get(<some url>)
def test(response):
<Use resp values and pass it one by one to another api>
Также было бы неплохо посмеяться над запросом, чтобы сделать тесты независимыми от удаленного ресурса. Вы можете использовать библиотеку ответов для этого.
import responses
import requests
@responses.activate
def test_simple():
responses.add(responses.GET, 'http://twitter.com/api/1/foobar',
json={'error': 'not found'}, status=404)
resp = requests.get('http://twitter.com/api/1/foobar')