Переименование параметризованных тестов в pytest - PullRequest
3 голосов
/ 26 сентября 2019

Параметризованные тесты в Pytest имеют следующий формат идентификатора: <function name>[<param identifier>].

Я хотел бы иметь возможность полностью контролировать имя тестового примера, когда они параметризованы.

ДляНапример, в настоящее время у меня есть следующий код:

import pytest

list_args = ["a", "b", "c"]


@pytest.fixture(params=list_args)
def prog_arg(request):
    yield request.param


def test_001():
    # This should not be changed
    pass

def test_002(prog_arg):
    # This should be test_002_01, test_002_02, ...
    print(prog_arg)


ids = [f"test_003_{i+1:02d}" for i in range(len(list_args))]


@pytest.mark.parametrize("arg", list_args, ids=ids)
def test_003(arg):
    # This should be test_003_01, test_003_02, ...
    print(prog_arg)

Когда я запускаю ( pytest 5.1.3 ), у меня есть:

test_rename_id.py::test_TC_001 PASSED
test_rename_id.py::test_TC_002[a] PASSED
test_rename_id.py::test_TC_002[b] PASSED
test_rename_id.py::test_TC_002[c] PASSED
test_rename_id.py::test_TC_003[test_003_01] PASSED                                                                                                                                                   
test_rename_id.py::test_TC_003[test_003_02] PASSED                                                                                                                                                  
test_rename_id.py::test_TC_003[test_003_03] PASSED

Что бы я хотелдолжен иметь:

test_rename_id.py::test_TC_001 PASSED
test_rename_id.py::test_TC_002_01 PASSED
test_rename_id.py::test_TC_002_02 PASSED
test_rename_id.py::test_TC_002_03 PASSED
test_rename_id.py::test_TC_003_01 PASSED                                                                                                                                                   
test_rename_id.py::test_TC_003_02 PASSED                                                                                                                                                  
test_rename_id.py::test_TC_003_03 PASSED

Возможно ли это без слишком большого взлома запроса object (или других модификаций, которые могут быть повреждены в будущих обновлениях pytest?

Спасибо

Ответы [ 2 ]

4 голосов
/ 26 сентября 2019

Это, безусловно, возможно, переписав nodeid с собранных предметов.В приведенном ниже примере я переписываю nodeid s в пользовательском значении хука pytest_collection_modifyitems.Поместите следующий код в ваш conftest.py:

import itertools as it
import re


def grouper(item):
    return item.nodeid[:item.nodeid.rfind('[')]


def pytest_collection_modifyitems(items):
    for _, group in it.groupby(items, grouper):
        for i, item in enumerate(group):
            item._nodeid = re.sub(r'\[.*\]', '_{:02d}'.format(i + 1), item.nodeid)

Запуск тестового модуля из вопроса теперь дает:

test_spam.py::test_001 PASSED
test_spam.py::test_002_01 PASSED
test_spam.py::test_002_02 PASSED
test_spam.py::test_002_03 PASSED
test_spam.py::test_003_01 PASSED
test_spam.py::test_003_02 PASSED
test_spam.py::test_003_03 PASSED
0 голосов
/ 26 сентября 2019

Что касается документов, доступных в pytest, я хотел бы сообщить вам, что способ ids работает в pytest.mark.paramterize точно так же, как результат, который вы упомянули в своем вопросе.

Формат: - filename-testname-idsvalue .

Ссылка: - https://hackebrot.github.io/pytest-tricks/param_id_func/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...