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')
Другие вопросы по тегам