From 6546d1f7257d986c2598dd2ebd2bbd8d04285585 Mon Sep 17 00:00:00 2001 From: Florian Dahlitz Date: Mon, 25 May 2020 13:53:56 +0200 Subject: [PATCH] Prevent pytest from printing ConftestImportFailure traceback --- changelog/6956.bugfix.rst | 1 + src/_pytest/nodes.py | 3 +++ testing/python/collect.py | 9 +++------ testing/test_reports.py | 12 ++++++++++++ 4 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 changelog/6956.bugfix.rst diff --git a/changelog/6956.bugfix.rst b/changelog/6956.bugfix.rst new file mode 100644 index 000000000..a88ef94b6 --- /dev/null +++ b/changelog/6956.bugfix.rst @@ -0,0 +1 @@ +Prevent pytest from printing ConftestImportFailure traceback to stdout. diff --git a/src/_pytest/nodes.py b/src/_pytest/nodes.py index 2f5f9bdb8..4c2a0a3a7 100644 --- a/src/_pytest/nodes.py +++ b/src/_pytest/nodes.py @@ -19,6 +19,7 @@ from _pytest._code.code import ReprExceptionInfo from _pytest.compat import cached_property from _pytest.compat import TYPE_CHECKING from _pytest.config import Config +from _pytest.config import ConftestImportFailure from _pytest.config import PytestPluginManager from _pytest.deprecated import NODE_USE_FROM_PARENT from _pytest.fixtures import FixtureDef @@ -340,6 +341,8 @@ class Node(metaclass=NodeMeta): return excinfo.value.formatrepr() if self.config.getoption("fulltrace", False): style = "long" + if excinfo.type is ConftestImportFailure: # type: ignore + excinfo = ExceptionInfo.from_exc_info(excinfo.value.excinfo) # type: ignore else: tb = _pytest._code.Traceback([excinfo.traceback[-1]]) self._prunetraceback(excinfo) diff --git a/testing/python/collect.py b/testing/python/collect.py index 2807cacc9..cbc798ad8 100644 --- a/testing/python/collect.py +++ b/testing/python/collect.py @@ -1251,7 +1251,7 @@ def test_syntax_error_with_non_ascii_chars(testdir): 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") result = testdir.runpytest("--fulltrace") result.stdout.fnmatch_lines( @@ -1259,15 +1259,12 @@ def test_collecterror_with_fulltrace(testdir): "collected 0 items / 1 error", "", "*= ERRORS =*", - "*_ ERROR collecting test_collecterror_with_fulltrace.py _*", - "", - "*/_pytest/python.py:*: ", - "_ _ _ _ _ _ _ _ *", + "*_ ERROR collecting test_collect_error_with_fulltrace.py _*", "", "> 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 !*", ] ) diff --git a/testing/test_reports.py b/testing/test_reports.py index 13f593215..64d86e953 100644 --- a/testing/test_reports.py +++ b/testing/test_reports.py @@ -396,6 +396,18 @@ class TestReportSerialization: # for same reasons as previous test, ensure we don't blow up here 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 ModuleNotFoundError: No module named 'unknown'"] + ) + result.stdout.no_fnmatch_line( + "ERROR - _pytest.config.ConftestImportFailure: ModuleNotFoundError:*" + ) + class TestHooks: """Test that the hooks are working correctly for plugins"""