Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Raise CollectError if import test module fails #1520

Merged
merged 1 commit into from
Apr 26, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@
parametrize.
Thanks `@palaviv`_ for the complete PR (`#1474`_).

*
* Fix `#1426`_ Make ImportError during collection more explicit by reminding
the user to check the name of the test module/package(s).
Thanks `@omarkohl`_ for the complete PR (`#1520`_).

.. _@milliams: https://github.com/milliams
.. _@novas0x2a: https://github.com/novas0x2a
Expand All @@ -49,6 +51,7 @@
.. _@palaviv: https://github.com/palaviv
.. _@omarkohl: https://github.com/omarkohl

.. _#1426: https://github.com/pytest-dev/pytest/issues/1426
.. _#1428: https://github.com/pytest-dev/pytest/pull/1428
.. _#1444: https://github.com/pytest-dev/pytest/pull/1444
.. _#1441: https://github.com/pytest-dev/pytest/pull/1441
Expand All @@ -57,6 +60,7 @@
.. _#1468: https://github.com/pytest-dev/pytest/pull/1468
.. _#1474: https://github.com/pytest-dev/pytest/pull/1474
.. _#1502: https://github.com/pytest-dev/pytest/pull/1502
.. _#1520: https://github.com/pytest-dev/pytest/pull/1520
.. _#372: https://github.com/pytest-dev/pytest/issues/372

2.9.2.dev1
Expand Down
8 changes: 8 additions & 0 deletions _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,14 @@ def _importtestmodule(self):
"unique basename for your test file modules"
% e.args
)
except ImportError:
exc_class, exc, _ = sys.exc_info()
raise self.CollectError(
"ImportError while importing test module '%s'.\n"
"Original error message:\n'%s'\n"
"Make sure your test modules/packages have valid Python names."
% (self.fspath, exc or exc_class)
)
#print "imported test module", mod
self.config.pluginmanager.consider_module(mod)
return mod
Expand Down
3 changes: 2 additions & 1 deletion testing/acceptance_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ def test_this():
result = testdir.runpytest(p)
result.stdout.fnmatch_lines([
#XXX on jython this fails: "> import import_fails",
"E ImportError: No module named *does_not_work*",
"ImportError while importing test module*",
"'No module named *does_not_work*",
])
assert result.ret == 1

Expand Down
18 changes: 15 additions & 3 deletions testing/python/collect.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,16 @@
import _pytest._code
import py
import pytest
from _pytest.main import EXIT_NOTESTSCOLLECTED
from _pytest.main import (
Collector,
EXIT_NOTESTSCOLLECTED
)


class TestModule:
def test_failing_import(self, testdir):
modcol = testdir.getmodulecol("import alksdjalskdjalkjals")
pytest.raises(ImportError, modcol.collect)
pytest.raises(ImportError, modcol.collect)
pytest.raises(Collector.CollectError, modcol.collect)

def test_import_duplicate(self, testdir):
a = testdir.mkdir("a")
Expand Down Expand Up @@ -60,6 +62,16 @@ def test_module_considers_pluginmanager_at_import(self, testdir):
modcol = testdir.getmodulecol("pytest_plugins='xasdlkj',")
pytest.raises(ImportError, lambda: modcol.obj)

def test_invalid_test_module_name(self, testdir):
a = testdir.mkdir('a')
a.ensure('test_one.part1.py')
result = testdir.runpytest("-rw")
result.stdout.fnmatch_lines([
"ImportError while importing test module*test_one.part1*",
"Make sure your test modules/packages have valid Python names.",
])


class TestClass:
def test_class_with_init_warning(self, testdir):
testdir.makepyfile("""
Expand Down
3 changes: 2 additions & 1 deletion testing/test_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ def test_collection_error(self, testdir):
assert "__import__" not in result.stdout.str(), "too long traceback"
result.stdout.fnmatch_lines([
"*ERROR collecting*",
"*mport*not_exists*"
"ImportError while importing test module*",
"'No module named *not_exists*",
])

def test_custom_repr_failure(self, testdir):
Expand Down
2 changes: 1 addition & 1 deletion testing/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def test_this():
reprec = testdir.inline_run(tfile)
l = reprec.getfailedcollections()
assert len(l) == 1
out = l[0].longrepr.reprcrash.message
out = str(l[0].longrepr)
assert out.find('does_not_work') != -1

def test_raises_output(self, testdir):
Expand Down
6 changes: 3 additions & 3 deletions testing/test_terminal.py
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,8 @@ def test_collectonly_error(self, testdir):
assert result.ret == 1
result.stdout.fnmatch_lines(_pytest._code.Source("""
*ERROR*
*import Errlk*
*ImportError*
*No module named *Errlk*
*1 error*
""").strip())

Expand Down Expand Up @@ -665,8 +665,8 @@ def test_collect_fail(self, testdir, option):
testdir.makepyfile("import xyz\n")
result = testdir.runpytest(*option.args)
result.stdout.fnmatch_lines([
"? import xyz",
"E ImportError: No module named *xyz*",
"ImportError while importing*",
"'No module named *xyz*",
"*1 error*",
])

Expand Down