diff --git a/CHANGELOG b/CHANGELOG index 09317c8f5..ddc3b0f18 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ Changes between 2.1.1 and [NEXT VERSION] ---------------------------------------- +- refine test discovery by package/module name (--pyargs), thanks Florian Mayer - fix issue69 / assertion rewriting fixed on some boolean operations - fix issue68 / packages now work with assertion rewriting - fix issue66: use different assertion rewriting caches when the -O option is passed diff --git a/_pytest/__init__.py b/_pytest/__init__.py index abc2fffe8..97d05f077 100644 --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.1.1' +__version__ = '2.1.2.dev1' diff --git a/_pytest/main.py b/_pytest/main.py index ac306a867..d0d7c2dc3 100644 --- a/_pytest/main.py +++ b/_pytest/main.py @@ -2,7 +2,7 @@ import py import pytest, _pytest -import os, sys +import os, sys, imp tracebackcutdir = py.path.local(_pytest.__file__).dirpath() # exitcodes for the command line @@ -469,16 +469,22 @@ class Session(FSCollector): return True def _tryconvertpyarg(self, x): - try: - mod = __import__(x, None, None, ['__doc__']) - except (ValueError, ImportError): - return x - p = py.path.local(mod.__file__) - if p.purebasename == "__init__": - p = p.dirpath() - else: - p = p.new(basename=p.purebasename+".py") - return str(p) + mod = None + path = [os.path.abspath('.')] + sys.path + for name in x.split('.'): + try: + fd, mod, type_ = imp.find_module(name, path) + except ImportError: + return x + else: + if fd is not None: + fd.close() + + if type_[2] != imp.PKG_DIRECTORY: + path = [os.path.dirname(mod)] + else: + path = [mod] + return mod def _parsearg(self, arg): """ return (fspath, names) tuple after checking the file exists. """ diff --git a/setup.py b/setup.py index d6827bd0d..ce058de48 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ def main(): name='pytest', description='py.test: simple powerful testing with Python', long_description = long_description, - version='2.1.1', + version='2.1.2.dev1', url='http://pytest.org', license='MIT license', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], diff --git a/testing/acceptance_test.py b/testing/acceptance_test.py index 6b815e4d7..716d3c3ce 100644 --- a/testing/acceptance_test.py +++ b/testing/acceptance_test.py @@ -231,7 +231,7 @@ class TestGeneralUsage: res = testdir.runpytest(p) assert res.ret == 0 res.stdout.fnmatch_lines(["*1 skipped*"]) - + def test_direct_addressing_selects(self, testdir): p = testdir.makepyfile(""" def pytest_generate_tests(metafunc): @@ -364,7 +364,7 @@ class TestInvocationVariants: retcode = testdir.pytestmain(testdir.tmpdir) assert not retcode out, err = capsys.readouterr() - + def test_invoke_plugin_api(self, capsys): class MyPlugin: def pytest_addoption(self, parser): @@ -374,6 +374,19 @@ class TestInvocationVariants: out, err = capsys.readouterr() assert "--myopt" in out + def test_pyargs_importerror(self, testdir, monkeypatch): + monkeypatch.delenv('PYTHONDONTWRITEBYTECODE', False) + path = testdir.mkpydir("tpkg") + path.join("test_hello.py").write('raise ImportError') + + result = testdir.runpytest("--pyargs", "tpkg.test_hello") + assert result.ret != 0 + # FIXME: It would be more natural to match NOT + # "ERROR*file*or*package*not*found*". + result.stdout.fnmatch_lines([ + "*collected 0 items*" + ]) + def test_cmdline_python_package(self, testdir, monkeypatch): monkeypatch.delenv('PYTHONDONTWRITEBYTECODE', False) path = testdir.mkpydir("tpkg")