Skip to content

Commit

Permalink
Merge pull request #2791 from OfirOshir/features
Browse files Browse the repository at this point in the history
bugfix for issue #2491
  • Loading branch information
RonnyPfannschmidt authored Oct 25, 2017
2 parents 083084f + d96869f commit f743e95
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 9 deletions.
12 changes: 6 additions & 6 deletions _pytest/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -423,12 +423,12 @@ def import_plugin(self, modname):
try:
__import__(importspec)
except ImportError as e:
new_exc = ImportError('Error importing plugin "%s": %s' % (modname, safe_str(e.args[0])))
# copy over name and path attributes
for attr in ('name', 'path'):
if hasattr(e, attr):
setattr(new_exc, attr, getattr(e, attr))
raise new_exc
new_exc_type = ImportError
new_exc_message = 'Error importing plugin "%s": %s' % (modname, safe_str(e.args[0]))
new_exc = new_exc_type(new_exc_message)

six.reraise(new_exc_type, new_exc, sys.exc_info()[2])

except Exception as e:
import pytest
if not hasattr(pytest, 'skip') or not isinstance(e, pytest.skip.Exception):
Expand Down
4 changes: 4 additions & 0 deletions changelog/2491.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
If an exception happens while loading a plugin, pytest no longer hides the original traceback.
In python2 it will show the original traceback with a new message that explains in which plugin.
In python3 it will show 2 canonized exceptions, the original exception while loading the plugin
in addition to an exception that PyTest throws about loading a plugin.
11 changes: 8 additions & 3 deletions testing/test_pluginmanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,12 +199,17 @@ def test_importplugin_error_message(testdir, pytestpm):
testdir.syspathinsert(testdir.tmpdir)
testdir.makepyfile(qwe="""
# encoding: UTF-8
raise ImportError(u'Not possible to import: ☺')
def test_traceback():
raise ImportError(u'Not possible to import: ☺')
test_traceback()
""")
with pytest.raises(ImportError) as excinfo:
pytestpm.import_plugin("qwe")
expected = '.*Error importing plugin "qwe": Not possible to import: .'
assert py.std.re.match(expected, str(excinfo.value))

expected_message = '.*Error importing plugin "qwe": Not possible to import: .'
expected_traceback = ".*in test_traceback"
assert py.std.re.match(expected_message, str(excinfo.value))
assert py.std.re.match(expected_traceback, str(excinfo.traceback[-1]))


class TestPytestPluginManager(object):
Expand Down

0 comments on commit f743e95

Please sign in to comment.