py.test将一个测试的结果传递给另一个测试

时间:2016-06-03 12:02:11

标签: python python-2.7 unit-testing automated-tests pytest

目前我的测试看起来像这样:

@pytest.mark.parametrize("param", [1,2,3])
def test_two_services(param):
    id = check_service_one(param)
    check_service_two(id)

有没有办法将这个测试分成两部分,第二次测试取决于第一次?

1 个答案:

答案 0 :(得分:1)

记得在边界测试。因此,如果id的值仅取决于param,并且id不是某些实现细节,而是被测系统的已定义行为的一部分,则拆分您的测试像这样:

def test_service_one(param, id):
    assert check_service_one(param) == id

def test_service_two(id):
    check_service_two(id)  # I'm assuming this does some assertion of its own.

@pytest.fixture
def param(param_and_id):
    param, _ = param_and_id
    return param

@pytest.fixture
def id(param_and_id):
    _, id = param_and_id
    return id

@pytest.fixture(
    params=[
        (1, EXPECTED_ID_FOR_PARAM_1),
        (2, EXPECTED_ID_FOR_PARAM_2),
        (3, EXPECTED_ID_FOR_PARAM_3),
    ],
)
def param_and_id(request):
    return request.param

像这样,测试与check_service_two的输入松散耦合,与test_service_one的{​​{1}}结果的预期(并通过check_service_one中的断言检查)匹配,而不是test_service_two非常依赖test_service_one。因此,测试可以按任意顺序运行,任何一个测试都可以隔离运行(无需先运行另一个测试)。