Как заставить pytest отображать пользовательское строковое представление для параметров прибора?

При использовании встроенных типов в качестве параметров фикстуры pytest распечатывает значения параметров в отчете о тестировании. Например:

@fixture(params=['hello', 'world']
def data(request):
    return request.param

def test_something(data):
    pass

Выполнение этого с py.test --verbose напечатает что-то вроде:

test_example.py:7: test_something[hello]
PASSED
test_example.py:7: test_something[world]
PASSED

Обратите внимание, что значение параметра печатается в квадратных скобках после имени теста.

Теперь, когда в качестве параметра используется объект пользовательского класса, например:

class Param(object):
    def __init__(self, text):
        self.text = text

@fixture(params=[Param('hello'), Param('world')]
def data(request):
    return request.param

def test_something(data):
    pass

pytest просто перечислит количество значений (p0, p1 и т. д.):

test_example.py:7: test_something[p0]
PASSED
test_example.py:7: test_something[p1]
PASSED

Это поведение не меняется, даже когда определяемый пользователем класс предоставляет пользовательские реализации __str__ и __repr__. Есть ли способ сделать так, чтобы pytest отображал что-то более полезное, чем просто p0 здесь?

Я использую pytest 2.5.2 на Python 2.7.6 в Windows 7.


person Björn Pollex    schedule 28.05.2014    source источник


Ответы (1)


Декоратор фикстуры принимает параметр ids, который можно использовать для переопределения имени автоматического параметра:

@fixture(params=[Param('hello'), Param('world')], ids=['hello', 'world'])
def data(request):
    return request.param

Как показано, требуется список имен для использования для соответствующего элемента в списке параметров.

person flub    schedule 29.05.2014
comment
Есть ли способ сгенерировать идентификаторы на основе параметров контролируемым способом? Например, я хотел бы передать в качестве параметров объекты 3-х человек, но я бы хотел, чтобы идентификаторы были названы по имени person.name или даже person ['name']? - person Joe; 17.01.2015
comment
Можно передать функцию параметру ids, который будет вызываться с использованием значения фикстуры и может возвращать строку или None для автоматического идентификатора. Это задокументировано в doc / en / fixture.txt в репозитории, но по какой-то причине в настоящее время не отображается в визуализированной версии веб-сайта, что странно. - person flub; 21.01.2015
comment
Я тоже это вижу, может быть, это новая функция? Я попробовал пример как есть в pytest 2.6.4 и получил: _pytest \ python.py: 824: in параметризовать - if ids и len (ids)! = Len (argvalues): TypeError: объект типа 'функция' имеет нет len () - person Joe; 22.01.2015