Pytest:测试的运行时参数化

时间:2019-03-01 09:29:00

标签: python-3.x python-requests 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 github上遇到了以下问题,与我的问题几乎相同。

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

根据此讨论,pytest在执行任何测试之前对测试进行参数设置。不支持运行时参数化。有谁知道解决此问题的解决方法或Python方法?

2 个答案:

答案 0 :(得分:0)

不要使测试相互依赖。如here所述,这不是一个好习惯。

如果要重用请求响应,可以将其包装到fixture中。

ID=02141592cc0000000100000000000000

模拟请求以使测试独立于远程资源也是一个好主意。您可以使用responses库。

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

答案 1 :(得分:0)

Adrian Krupa的答案很接近,现在添加响应参数:

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中获得命名ID,并获得一组罐头答案的多个测试:

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