-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Description
Context
Currently, one of the ways to use pytest.fail
is to include all of the necessary information in the reason
field and disabling the traceback with pytrace = False
. While this does suppress tracebacks of the exception itself and any exceptions in the context, it still prints the context. I use this in python-trio/pytest-trio#136 for example to report full tracebacks when a timeout happens (capturing all async tasks). Currently, this implementation prints the set of tracebacks twice as an internal exception (which also contains the tracebacks) is converted to a test failure with pytest.fail
.
Feature request
I would like to have a way to suppress this context as well, either by default if pytrace = False
is set, or with another option. This is the behavior I would have expected from pytrace
in the first place.
Alternatives
It is possible to do some juggling with the exceptions to remove the context as follows:
import pytest
def test_fail():
try:
import some_missing_package
except ImportError:
try:
pytest.fail(reason="You need to install some_missing_package for this test to succeed", pytrace=False)
except BaseException as e:
e.__cause__ = None
raise
I think this would be reasonable to implement in a plugin for example, but might be a bit to cumbersome/obscure for use in tests. But that is not where my use case lies, so this might a case of the XY problem. Another solution would be to use a report hook to customize the reporting of certain special exceptions.
It might be that these alternatives are acceptable (I presume that this case is not a common occurrence) and adding this feature is not worth the maintenance/testing/change in behavior. But I believe it is still worth considering at least.