Skip to content

Commit

Permalink
Merged in hpk42/pytest-patches/prefer_installed (pull request #275)
Browse files Browse the repository at this point in the history
change test module importing behaviour to append to sys.path
  • Loading branch information
flub committed Apr 21, 2015
2 parents bac1ccd + 5c8e5ac commit 31af381
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 13 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -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)
-----------------------------
Expand Down
2 changes: 1 addition & 1 deletion _pytest/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#
__version__ = '2.8.0.dev1'
__version__ = '2.8.0.dev2'
6 changes: 2 additions & 4 deletions _pytest/pytester.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ def __init__(self, request):
break
self.tmpdir = tmpdir
self.plugins = []
self._syspathremove = []
self._savesyspath = list(sys.path)
self.chdir() # always chdir
self.request.addfinalizer(self.finalize)

Expand All @@ -270,8 +270,7 @@ def finalize(self):
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
Expand Down Expand Up @@ -370,7 +369,6 @@ def syspathinsert(self, path=None):
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."""
Expand Down
3 changes: 2 additions & 1 deletion _pytest/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,7 @@ def collect(self):
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"))
Expand Down Expand Up @@ -2062,3 +2062,4 @@ def get_scope_node(node, scope):
return node.session
raise ValueError("unknown scope")
return node.getparent(cls)

10 changes: 5 additions & 5 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,12 @@ def get_version():
def has_environment_marker_support():
"""
Tests that setuptools has support for PEP-426 environment marker support.
The first known release to support it is 0.7 (and the earliest on PyPI seems to be 0.7.2
The first known release to support it is 0.7 (and the earliest on PyPI seems to be 0.7.2
so we're using that), see: http://pythonhosted.org/setuptools/history.html#id142
References:
* https://wheel.readthedocs.org/en/latest/index.html#defining-conditional-dependencies
* https://www.python.org/dev/peps/pep-0426/#environment-markers
"""
Expand All @@ -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']
Expand Down
20 changes: 20 additions & 0 deletions testing/python/collect.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import sys
from textwrap import dedent
import pytest, py

class TestModule:
Expand All @@ -23,6 +25,24 @@ def test_import_duplicate(self, testdir):
"*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)
Expand Down
4 changes: 2 additions & 2 deletions testing/python/integration.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand All @@ -248,7 +248,7 @@ def test_hello():
assert not reprec.getfailedcollections()
calls = reprec.getreports("pytest_runtest_logreport")
assert not calls

def test_class_and_method(self, testdir):
testdir.makepyfile("""
__test__ = True
Expand Down
1 change: 1 addition & 0 deletions testing/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 31af381

Please sign in to comment.