В каком вызове py.test я могу найти данные «item» и «report»?

pytest_runtest_makereport () получает два аргумента, элемент и вызов. По пункту я могу найти funcarg, который я создал для этого теста, а по вызову я могу найти информацию об исключении (если есть):

def pytest_runtest_makereport (item, call):
    my_funcarg = item.funcargs['name']
    my_funcarg.excinfo = call.excinfo

К сожалению, excinfo заполняется как для сбоев, так и для пропусков. Чтобы различить, мне нужно взглянуть на аргумент отчета для pytest_report_teststatus ():

def pytest_report_teststatus (report):
    if report.when == 'call':
        if report.failed:
            failed = True
        elif report.skipped:
            skipped = True
        else:
            passed = True

Это отличная информация, но я не могу соотнести ее с funcarg, который я создал для теста. Я посмотрел на аргумент отчета (отчет TestReport) и не могу найти какой-либо способ вернуться к элементу, переданному в pytest_runtest_makereport (), или к funcarg, который я создал.

Где я могу получить доступ к обоим?

Ответы на вопрос(2)

Решение Вопроса

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

@pytest.mark.tryfirst
def pytest_runtest_makereport(item, call, __multicall__):
    rep = __multicall__.execute()
    # your code follows and you can use rep.passed etc.
    return rep

Заметки:

a hook call will usually call multiple hook implementations the "tryfirst" marker instructs the hook call to have your implementation be invoked early the multicall parameter represents the ongoing hook call and can be used to call the remaining hook implementations and then
use their result for further processing you need to return "rep" here because you shadow the "real" creation

multicall API на самом деле очень редко, и я подозреваю, что могут быть решения для вашего случая использования, которые не требуют этого.

HTH, Хольгер

 Martin Del Vecchio18 июн. 2012 г., 17:59
Я наконец получил шанс попробовать это, и это работает как рекламируется. Спасибо!
 31 мая 2013 г., 19:27
@viperfx Я собирался сказать точно то же самое.
 03 авг. 2016 г., 13:43
@ pytest.mark.tryfirstdef pytest_runtest_makereport(item, call, __multicall__): rep = __multicall__.execute() # your code follows and you can use rep.passed etc. return rep это не вызывается при запуске с плагином xdist ни одного предложения, пожалуйста
 29 нояб. 2012 г., 15:38
Очень полезно для тестирования с селеном! Теперь я могу заставить pytest сделать снимок экрана, используя селен при неудачном тестировании.

__multicall__ обесценивается.

Это достигает того же результата, хотя:

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    outcome = yield
    rep = outcome.get_result()
    setattr(item, "rep_" + rep.when, rep)
    return rep

Ваш ответ на вопрос