Настройка имени параметризованного теста pytest

У меня есть следующие тесты:

@pytest.mark.parametrize(
    "nums",
    [[3, 1, 5, 4, 2], [2, 6, 4, 3, 1, 5], [1, 5, 6, 4, 3, 2]]
)
def test_cyclic_sort(nums):
    pass


@pytest.mark.parametrize(
    "nums, missing",
    [([4, 0, 3, 1], 2)]
)
def test_find_missing_number(nums, missing):
    pass

Я хотел бы настроить имена тестов, чтобы включить входной массив. Я прочитал документацию по pytest и этот вопрос и этот вопрос, но ни один из них не отвечает на следующие вопросы:

  1. Что передается функции id? В моем коде выше первый тест принимает один параметр, второй — два.
  2. Документы pytest используют функцию верхнего уровня для идентификатора, тогда как я хотел бы поместить свои тесты в класс и использовать @staticmethod. Попытка сослаться на статический метод с помощью TestClass.static_method изнутри TestClass дает ошибку в PyCharm; каков правильный синтаксис для этого?

Изменить: создан https://github.com/pytest-dev/pytest/issues/8448.


person Abhijit Sarkar    schedule 15.03.2021    source источник


Ответы (1)


При использовании callable для ключевого слова ids он будет вызываться с одним аргументом: значение параметризуемого параметра теста. Вызываемый ids возвращает строку, которая будет использоваться в квадратных скобках в качестве суффикса имени теста.

Если тест параметризует несколько значений, функция все равно будет вызываться с одним аргументом, но будет вызываться несколько раз за тест. Сгенерированное имя будет соединено тире, например

"-".join([idfunc(val) for val in parameters])

Например:

test_something[val1-val2-val3]

Вот соединение в источнике pytest .

Для использования статического метода работает следующий синтаксис:

class TestExample:

    @staticmethod
    def idfunc(val):
        return f"foo{val}"

    @pytest.mark.parametrize(
        "x, y",
        [
            [1, 2],
            ["a", "b"],
        ],
        ids=idfunc.__func__,
    )
    def test_vals(self, x, y):
        assert x
        assert y

Это создаст два теста, вызывая idfunc четыре раза, как описано выше.

TestExample::test_vals[foo1-foo2]
TestExample::test_vals[fooa-foob]
person wim    schedule 15.03.2021