Как передать значение testCase следующему с помощью Pytest

import pytest


def add(x):
    return x + 1

def sub(x):
    return x - 1


testData1 = [1, 2]
testData2 = [3]


class Test_math(object):
    @pytest.mark.parametrize('n', testData1)
    def test_add(self, n):
        result = add(n)
        testData2.append(result) <-------- Modify testData here
        assert result == 5

    @pytest.mark.parametrize('n', testData2)
    def test_sub(self, n):
        result = sub(n)
        assert result == 3


if __name__ == '__main__':
    pytest.main()

в этом сценарии выполняется только 3 теста: Test_math.test_add[1],Test_math.test_add[2],Test_math.test_sub[3].

Test_math.test_sub выполняется только с предопределенными данными [3], что не соответствует моим ожиданиям [2,3,3]. Как это исправить?

обновить [1,2,3] -> [2,3,3]


person Chweng Mega    schedule 20.03.2018    source источник
comment
Почему вы ожидаете [1,2,3]? Вы даете test_sub список testData2, который состоит только из одного элемента. Хорошо, я понимаю, почему вы могли ожидать чего-то другого.   -  person Ignacio Vergara Kausel    schedule 20.03.2018
comment
Я думаю, что testData2.append(result) изменит testData2, а новые testData2 перейдут к следующему выполнению, но это не так.   -  person Chweng Mega    schedule 20.03.2018
comment
На мой взгляд, это плохой дизайн (подробнее в ответе), возможно, этого можно было бы добиться, поместив вместо этого testData1 и testData2 в качестве атрибутов класса (это не проверялось).   -  person Ignacio Vergara Kausel    schedule 20.03.2018
comment
К сожалению, это не работает   -  person Chweng Mega    schedule 20.03.2018


Ответы (1)


Не совсем уверен, почему это не сработало, но делать это так - плохая идея, поскольку порядок тестов не гарантируется (если только вы не реализуете специальный код для заказа выполнения тестов).

Помимо этой и других проблем проектирования тестов, вы можете достичь желаемого, объединив testData1 и testData2 в декораторе pytest.mark.parametrize.

@pytest.mark.parametrize('n', testData1 + testData2)
def test_sub(self, n):
    result = sub(n)
    assert result == 3

Теперь имейте в виду, что с вашим определением теста это всегда будет давать сбой, потому что результат sub(n) с testData1 + testData2 никогда не будет 3.

person Ignacio Vergara Kausel    schedule 20.03.2018