Подтвердить что ты не робот

Переопределение имени параметрируемых функций pytest

Мои параметры определяют имя моего параметризованного pytest. Я буду использовать некоторые рандомизированные параметры для этих тестов. Чтобы мои имена отчетов в junit не перепутались, я хотел бы создать статическое имя для каждого параметризованного теста.

Возможно ли это?

У JUnit есть параметр: Изменение имен параметризованных тестов

class TestMe:
    @pytest.mark.parametrize(
        ("testname", "op", "value"),
        [
            ("testA", "plus", "3"),
            ("testB", "minus", "1"),
        ]
    )
    def test_ops(self, testname, op, value):

Я попробовал перезаписать request.node.name, но я могу только переименовать его во время выполнения теста.

Я почти уверен, что мне нужно написать плагин или светильник. Как вы думаете, как лучше всего это сделать?

4b9b3361

Ответ 1

Вы ищете аргумент ids для pytest.mark.parametrize:

список идентификаторов строк или вызываемых. Если строки, каждая соответствует к argvalues, чтобы они были частью идентификатора теста. Если вызвано, это должен принимать один аргумент (одно аргумент) и возвращать строку или вернуть нет.

Ваш код будет выглядеть как

@pytest.mark.parametrize(
    ("testname", "op", "value"),
    [
        ("testA", "plus", "3"),
        ("testB", "minus", "1"),
    ],
    ids=['testA id', 'testB id']
)
def test_industry(self, testname, op, value):

Ответ 2

Вы также можете использовать упаковщик параметров Pytest из: https://github.com/singular-labs/parametrization или Pypi

pip install pytest-parametrization

ваш код будет выглядеть так:

from parametrization import Parametrization

class TestMe:
    @Parametrization.autodetect_parameters()
    @Parametrization.case(name="testA", op='plus', value=3)
    @Parametrization.case(name="testB", op='minus', value=1)
    def test_ops(self, op, value):
        ...

что равно:

class TestMe:
    @pytest.mark.parametrize(
        ("op", "value"),
        [
            ("plus", "3"),
            ("minus", "1"),
        ],
        ids=['testA', 'testB']
    )
    def test_ops(self, op, value):
        ...