change test module importing behaviour to append to sys.path

instead of prepending.  This better allows to run test modules
against installated versions of a package even if the package
under test has the same import root.  In this example::

   testing/__init__.py
   testing/test_pkg_under_test.py
   pkg_under_test/

the tests will preferrably run against the installed version
of pkg_under_test whereas before they would always pick
up the local version.

--HG--
branch : prefer_installed
This commit is contained in:
holger krekel 2015-04-17 22:25:35 +02:00
parent fb07a09964
commit 5c8e5acf9d
8 changed files with 46 additions and 13 deletions

View File

@ -1,6 +1,19 @@
2.8.0.dev (compared to 2.7.X)
-----------------------------
- change test module importing behaviour to append to sys.path
instead of prepending. This better allows to run test modules
against installated versions of a package even if the package
under test has the same import root. In this example::
testing/__init__.py
testing/test_pkg_under_test.py
pkg_under_test/
the tests will preferrably run against the installed version
of pkg_under_test whereas before they would always pick
up the local version. Thanks Holger Krekel.
2.7.1.dev (compared to 2.7.0)
-----------------------------

View File

@ -1,2 +1,2 @@
#
__version__ = '2.8.0.dev1'
__version__ = '2.8.0.dev2'

View File

@ -254,7 +254,7 @@ class TmpTestdir:
break
self.tmpdir = tmpdir
self.plugins = []
self._syspathremove = []
self._savesyspath = list(sys.path)
self.chdir() # always chdir
self.request.addfinalizer(self.finalize)
@ -270,8 +270,7 @@ class TmpTestdir:
has finished.
"""
for p in self._syspathremove:
sys.path.remove(p)
sys.path[:] = self._savesyspath
if hasattr(self, '_olddir'):
self._olddir.chdir()
# delete modules that have been loaded from tmpdir
@ -370,7 +369,6 @@ class TmpTestdir:
if path is None:
path = self.tmpdir
sys.path.insert(0, str(path))
self._syspathremove.append(str(path))
def mkdir(self, name):
"""Create a new (sub)directory."""

View File

@ -485,7 +485,7 @@ class Module(pytest.File, PyCollector):
def _importtestmodule(self):
# we assume we are only called once per module
try:
mod = self.fspath.pyimport(ensuresyspath=True)
mod = self.fspath.pyimport(ensuresyspath="append")
except SyntaxError:
raise self.CollectError(
py.code.ExceptionInfo().getrepr(style="short"))
@ -2057,3 +2057,4 @@ def get_scope_node(node, scope):
return node.session
raise ValueError("unknown scope")
return node.getparent(cls)

View File

@ -48,7 +48,7 @@ def has_environment_marker_support():
def main():
install_requires = ['py>=1.4.25']
install_requires = ['py>=1.4.27.dev2']
extras_require = {}
if has_environment_marker_support():
extras_require[':python_version=="2.6" or python_version=="3.0" or python_version=="3.1"'] = ['argparse']

View File

@ -1,3 +1,5 @@
import sys
from textwrap import dedent
import pytest, py
class TestModule:
@ -23,6 +25,24 @@ class TestModule:
"*HINT*",
])
def test_import_appends_for_import(self, testdir, monkeypatch):
syspath = list(sys.path)
monkeypatch.setattr(sys, "path", syspath)
root1 = testdir.mkdir("root1")
root2 = testdir.mkdir("root2")
root1.ensure("x456.py")
root2.ensure("x456.py")
p = root2.join("test_x456.py")
p.write(dedent("""\
import x456
def test():
assert x456.__file__.startswith(%r)
""" % str(root1)))
syspath.insert(0, str(root1))
with root2.as_cwd():
reprec = testdir.inline_run()
reprec.assertoutcome(passed=1)
def test_syntax_error_in_module(self, testdir):
modcol = testdir.getmodulecol("this is a syntax error")
pytest.raises(modcol.CollectError, modcol.collect)

View File

@ -238,7 +238,7 @@ def test_pytestconfig_is_session_scoped():
class TestNoselikeTestAttribute:
def test_module(self, testdir):
def test_module_with_global_test(self, testdir):
testdir.makepyfile("""
__test__ = False
def test_hello():

View File

@ -772,6 +772,7 @@ def test_default_markers(testdir):
])
def test_importplugin_issue375(testdir):
testdir.syspathinsert(testdir.tmpdir)
testdir.makepyfile(qwe="import aaaa")
excinfo = pytest.raises(ImportError, lambda: importplugin("qwe"))
assert "qwe" not in str(excinfo.value)