Merge pull request #7257 from DahlitzFlorian/fix-issue-6956

Prevent pytest from printing ConftestImportFailure traceback
This commit is contained in:
Anthony Sottile 2020-05-27 13:49:43 -07:00 committed by GitHub
commit b3db440d4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 16 additions and 8 deletions

View File

@ -0,0 +1 @@
Prevent pytest from printing ConftestImportFailure traceback to stdout.

View File

@ -19,6 +19,7 @@ from _pytest._code.code import ReprExceptionInfo
from _pytest.compat import cached_property from _pytest.compat import cached_property
from _pytest.compat import TYPE_CHECKING from _pytest.compat import TYPE_CHECKING
from _pytest.config import Config from _pytest.config import Config
from _pytest.config import ConftestImportFailure
from _pytest.config import PytestPluginManager from _pytest.config import PytestPluginManager
from _pytest.deprecated import NODE_USE_FROM_PARENT from _pytest.deprecated import NODE_USE_FROM_PARENT
from _pytest.fixtures import FixtureDef from _pytest.fixtures import FixtureDef
@ -28,7 +29,6 @@ from _pytest.mark.structures import Mark
from _pytest.mark.structures import MarkDecorator from _pytest.mark.structures import MarkDecorator
from _pytest.mark.structures import NodeKeywords from _pytest.mark.structures import NodeKeywords
from _pytest.outcomes import fail from _pytest.outcomes import fail
from _pytest.outcomes import Failed
from _pytest.store import Store from _pytest.store import Store
if TYPE_CHECKING: if TYPE_CHECKING:
@ -331,8 +331,10 @@ class Node(metaclass=NodeMeta):
pass pass
def _repr_failure_py( def _repr_failure_py(
self, excinfo: ExceptionInfo[Union[Failed, FixtureLookupError]], style=None self, excinfo: ExceptionInfo[BaseException], style=None,
) -> Union[str, ReprExceptionInfo, ExceptionChainRepr, FixtureLookupErrorRepr]: ) -> Union[str, ReprExceptionInfo, ExceptionChainRepr, FixtureLookupErrorRepr]:
if isinstance(excinfo.value, ConftestImportFailure):
excinfo = ExceptionInfo(excinfo.value.excinfo)
if isinstance(excinfo.value, fail.Exception): if isinstance(excinfo.value, fail.Exception):
if not excinfo.value.pytrace: if not excinfo.value.pytrace:
return str(excinfo.value) return str(excinfo.value)

View File

@ -1251,7 +1251,7 @@ def test_syntax_error_with_non_ascii_chars(testdir):
result.stdout.fnmatch_lines(["*ERROR collecting*", "*SyntaxError*", "*1 error in*"]) result.stdout.fnmatch_lines(["*ERROR collecting*", "*SyntaxError*", "*1 error in*"])
def test_collecterror_with_fulltrace(testdir): def test_collect_error_with_fulltrace(testdir):
testdir.makepyfile("assert 0") testdir.makepyfile("assert 0")
result = testdir.runpytest("--fulltrace") result = testdir.runpytest("--fulltrace")
result.stdout.fnmatch_lines( result.stdout.fnmatch_lines(
@ -1259,15 +1259,12 @@ def test_collecterror_with_fulltrace(testdir):
"collected 0 items / 1 error", "collected 0 items / 1 error",
"", "",
"*= ERRORS =*", "*= ERRORS =*",
"*_ ERROR collecting test_collecterror_with_fulltrace.py _*", "*_ ERROR collecting test_collect_error_with_fulltrace.py _*",
"",
"*/_pytest/python.py:*: ",
"_ _ _ _ _ _ _ _ *",
"", "",
"> assert 0", "> assert 0",
"E assert 0", "E assert 0",
"", "",
"test_collecterror_with_fulltrace.py:1: AssertionError", "test_collect_error_with_fulltrace.py:1: AssertionError",
"*! Interrupted: 1 error during collection !*", "*! Interrupted: 1 error during collection !*",
] ]
) )

View File

@ -396,6 +396,14 @@ class TestReportSerialization:
# for same reasons as previous test, ensure we don't blow up here # for same reasons as previous test, ensure we don't blow up here
loaded_report.longrepr.toterminal(tw_mock) loaded_report.longrepr.toterminal(tw_mock)
def test_report_prevent_ConftestImportFailure_hiding_exception(self, testdir):
sub_dir = testdir.tmpdir.join("ns").ensure_dir()
sub_dir.join("conftest").new(ext=".py").write("import unknown")
result = testdir.runpytest_subprocess(".")
result.stdout.fnmatch_lines(["E *Error: No module named 'unknown'"])
result.stdout.no_fnmatch_line("ERROR - *ConftestImportFailure*")
class TestHooks: class TestHooks:
"""Test that the hooks are working correctly for plugins""" """Test that the hooks are working correctly for plugins"""