importorskip: display/include ImportError

This can provide useful information, e.g.

> could not import 'pyrepl.readline': curses library not found
This commit is contained in:
Daniel Hahler 2019-05-15 15:53:23 +02:00
parent 0f7c7a99bf
commit d19df5efa2
3 changed files with 14 additions and 5 deletions

View File

@ -0,0 +1 @@
``pytest.importorskip`` includes the ``ImportError`` now in the default ``reason``.

View File

@ -154,7 +154,7 @@ def importorskip(modname, minversion=None, reason=None):
__tracebackhide__ = True
compile(modname, "", "eval") # to catch syntaxerrors
should_skip = False
import_exc = None
with warnings.catch_warnings():
# make sure to ignore ImportWarnings that might happen because
@ -163,12 +163,12 @@ def importorskip(modname, minversion=None, reason=None):
warnings.simplefilter("ignore")
try:
__import__(modname)
except ImportError:
except ImportError as exc:
# Do not raise chained exception here(#1485)
should_skip = True
if should_skip:
import_exc = exc
if import_exc:
if reason is None:
reason = "could not import %r" % (modname,)
reason = "could not import %r: %s" % (modname, import_exc)
raise Skipped(reason, allow_module_level=True)
mod = sys.modules[modname]
if minversion is None:

View File

@ -1177,3 +1177,11 @@ def test_summary_list_after_errors(testdir):
"FAILED test_summary_list_after_errors.py::test_fail - assert 0",
]
)
def test_importorskip():
with pytest.raises(
pytest.skip.Exception,
match="^could not import 'doesnotexist': No module named .*",
):
pytest.importorskip("doesnotexist")