Pytest: во время выполнения параметризация теста - PullRequest
0 голосов
/ 01 марта 2019

Кто-нибудь знает обходной путь для динамической параметризации теста 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 github, которая почти совпадает с моей проблемой.

https://github.com/pytest-dev/pytest/issues/3273

Согласно этому обсуждению, pytest параметризует тест перед выполнением любого теста.Параметризация во время выполнения не поддерживается.Кто-нибудь знает обходной путь или pythonic способ справиться с этим поведением?

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Ответ Адриана Крупа близок, теперь добавьте параметризацию ответа:

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
0 голосов
/ 01 марта 2019

Не заставляйте тесты зависеть друг от друга.Это не очень хорошая практика, как описано здесь .

Если вы хотите повторно использовать ответ на запрос, вы можете обернуть его в прибор .

@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>

Также было бы неплохо посмеяться над запросом, чтобы сделать тесты независимыми от удаленного ресурса.Для этого вы можете использовать библиотеку response .

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')
...