In which py.test callout can I find both 'item' and 'report' data?
pytest, python
Solution
There is a little undocumented somewhat unofficial method with which hook implementations can interact with other hook implementations, for example to post-process their result. In your concrete case you might do something like:
@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
Notes:
- 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
The multicall API is very seldomly really and i suspect there could be solutions for your use case that don't require it.
HTH, Holger
Problem
pytest_runtest_makereport() gets two arguments, item and call. From item, I can find the funcarg I created for this test, and from call, I can find the exception info (if any): ``` def pytest_runtest_makereport (item, call): my_funcarg = item.funcargs['name'] my_funcarg.excinfo = call.excinfo ``` Unfortunately, excinfo is populated for both failures and for skips. To distinguish, I need to look at the report argument to 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 ``` That's great info, but I can't correlate it to the funcarg I created for the test. I have looked at the report argument (a TestReport report), and I can't find any way to get back to the item passed to pytest_runtest_makereport(), or the funcarg I created. Where can I get access to both?