From 9e6bb74d710179163fc4f61de70183da0bf636a2 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sat, 23 Jan 2016 18:08:18 +0100 Subject: [PATCH 01/11] reformat monkeypatch core plugin/its tests --- _pytest/monkeypatch.py | 14 +++++++------- testing/test_monkeypatch.py | 32 +++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/_pytest/monkeypatch.py b/_pytest/monkeypatch.py index 5f9720f1f..97aa67c6c 100644 --- a/_pytest/monkeypatch.py +++ b/_pytest/monkeypatch.py @@ -5,7 +5,6 @@ import re from py.builtin import _basestring - RE_IMPORT_ERROR_NAME = re.compile("^No module named (.*)$") @@ -32,7 +31,6 @@ def pytest_funcarg__monkeypatch(request): return mpatch - def derive_importpath(import_path, raising): import pytest if not isinstance(import_path, _basestring) or "." not in import_path: @@ -79,15 +77,17 @@ def derive_importpath(import_path, raising): return attr, obj - class Notset: def __repr__(self): return "" + notset = Notset() + class monkeypatch: """ Object keeping a record of setattr/item/env/syspath changes. """ + def __init__(self): self._setattr = [] self._setitem = [] @@ -114,14 +114,14 @@ class monkeypatch: if value is notset: if not isinstance(target, _basestring): raise TypeError("use setattr(target, name, value) or " - "setattr(target, value) with target being a dotted " - "import string") + "setattr(target, value) with target being a dotted " + "import string") value = name name, target = derive_importpath(target, raising) oldval = getattr(target, name, notset) if raising and oldval is notset: - raise AttributeError("%r has no attribute %r" %(target, name)) + raise AttributeError("%r has no attribute %r" % (target, name)) # avoid class descriptors like staticmethod/classmethod if inspect.isclass(target): @@ -233,7 +233,7 @@ class monkeypatch: try: del dictionary[name] except KeyError: - pass # was already deleted, so we have the desired state + pass # was already deleted, so we have the desired state else: dictionary[name] = value self._setitem[:] = [] diff --git a/testing/test_monkeypatch.py b/testing/test_monkeypatch.py index 49db0bada..99437fe68 100644 --- a/testing/test_monkeypatch.py +++ b/testing/test_monkeypatch.py @@ -1,9 +1,11 @@ -import os, sys +import os +import sys import textwrap import pytest from _pytest.monkeypatch import monkeypatch as MonkeyPatch + def pytest_funcarg__mp(request): cwd = os.getcwd() sys_path = list(sys.path) @@ -15,9 +17,11 @@ def pytest_funcarg__mp(request): request.addfinalizer(cleanup) return MonkeyPatch() + def test_setattr(): class A: x = 1 + monkeypatch = MonkeyPatch() pytest.raises(AttributeError, "monkeypatch.setattr(A, 'notexists', 2)") monkeypatch.setattr(A, 'y', 2, raising=False) @@ -34,9 +38,10 @@ def test_setattr(): assert A.x == 1 A.x = 5 - monkeypatch.undo() # double-undo makes no modification + monkeypatch.undo() # double-undo makes no modification assert A.x == 5 + class TestSetattrWithImportPath: def test_string_expression(self, monkeypatch): monkeypatch.setattr("os.path.abspath", lambda x: "hello2") @@ -75,9 +80,11 @@ class TestSetattrWithImportPath: monkeypatch.undo() assert os.path.abspath + def test_delattr(): class A: x = 1 + monkeypatch = MonkeyPatch() monkeypatch.delattr(A, 'x') assert not hasattr(A, 'x') @@ -93,6 +100,7 @@ def test_delattr(): monkeypatch.undo() assert A.x == 1 + def test_setitem(): d = {'x': 1} monkeypatch = MonkeyPatch() @@ -110,6 +118,7 @@ def test_setitem(): monkeypatch.undo() assert d['x'] == 5 + def test_setitem_deleted_meanwhile(): d = {} monkeypatch = MonkeyPatch() @@ -118,6 +127,7 @@ def test_setitem_deleted_meanwhile(): monkeypatch.undo() assert not d + @pytest.mark.parametrize("before", [True, False]) def test_setenv_deleted_meanwhile(before): key = "qwpeoip123" @@ -133,6 +143,7 @@ def test_setenv_deleted_meanwhile(before): else: assert key not in os.environ + def test_delitem(): d = {'x': 1} monkeypatch = MonkeyPatch() @@ -149,6 +160,7 @@ def test_delitem(): monkeypatch.undo() assert d == {'hello': 'world', 'x': 1} + def test_setenv(): monkeypatch = MonkeyPatch() monkeypatch.setenv('XYZ123', 2) @@ -157,6 +169,7 @@ def test_setenv(): monkeypatch.undo() assert 'XYZ123' not in os.environ + def test_delenv(): name = 'xyz1234' assert name not in os.environ @@ -177,6 +190,7 @@ def test_delenv(): if name in os.environ: del os.environ[name] + def test_setenv_prepend(): import os monkeypatch = MonkeyPatch() @@ -187,6 +201,7 @@ def test_setenv_prepend(): monkeypatch.undo() assert 'XYZ123' not in os.environ + def test_monkeypatch_plugin(testdir): reprec = testdir.inline_runsource(""" def test_method(monkeypatch): @@ -195,6 +210,7 @@ def test_monkeypatch_plugin(testdir): res = reprec.countoutcomes() assert tuple(res) == (1, 0, 0), res + def test_syspath_prepend(mp): old = list(sys.path) mp.syspath_prepend('world') @@ -206,6 +222,7 @@ def test_syspath_prepend(mp): mp.undo() assert sys.path == old + def test_syspath_prepend_double_undo(mp): mp.syspath_prepend('hello world') mp.undo() @@ -213,20 +230,24 @@ def test_syspath_prepend_double_undo(mp): mp.undo() assert sys.path[-1] == 'more hello world' + def test_chdir_with_path_local(mp, tmpdir): mp.chdir(tmpdir) assert os.getcwd() == tmpdir.strpath + def test_chdir_with_str(mp, tmpdir): mp.chdir(tmpdir.strpath) assert os.getcwd() == tmpdir.strpath + def test_chdir_undo(mp, tmpdir): cwd = os.getcwd() mp.chdir(tmpdir) mp.undo() assert os.getcwd() == cwd + def test_chdir_double_undo(mp, tmpdir): mp.chdir(tmpdir.strpath) mp.undo() @@ -234,6 +255,7 @@ def test_chdir_double_undo(mp, tmpdir): mp.undo() assert os.getcwd() == tmpdir.strpath + def test_issue185_time_breaks(testdir): testdir.makepyfile(""" import time @@ -247,6 +269,7 @@ def test_issue185_time_breaks(testdir): *1 passed* """) + def test_importerror(testdir): p = testdir.mkpydir("package") p.join("a.py").write(textwrap.dedent("""\ @@ -275,11 +298,12 @@ class SampleNewInherit(SampleNew): class SampleOld: - #oldstyle on python2 + # oldstyle on python2 @staticmethod def hello(): return True + class SampleOldInherit(SampleOld): pass @@ -296,5 +320,3 @@ def test_issue156_undo_staticmethod(Sample): monkeypatch.undo() assert Sample.hello() - - From 60e9698530c7cda7d46cd8046ab26b48d22a2aa6 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sat, 23 Jan 2016 19:12:10 +0100 Subject: [PATCH 02/11] fix issue 1338 --- _pytest/monkeypatch.py | 77 ++++++++++++++++++------------------- testing/test_monkeypatch.py | 8 ++++ 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/_pytest/monkeypatch.py b/_pytest/monkeypatch.py index 97aa67c6c..74e29d94f 100644 --- a/_pytest/monkeypatch.py +++ b/_pytest/monkeypatch.py @@ -31,50 +31,47 @@ def pytest_funcarg__monkeypatch(request): return mpatch +def resolve(name): + # simplified from zope.dottedname + parts = name.split('.') + + used = parts.pop(0) + found = __import__(used) + for part in parts: + used += '.' + part + try: + found = getattr(found, part) + except AttributeError: + try: + __import__(used) + except ImportError as ex: + expected = ex.message.split()[-1] + if expected == used: + raise + else: + raise ImportError( + 'import error in %s: %s' % (used, ex) + ) + try: + found = getattr(found, part) + except AttributeError: + raise AttributeError( + '%r object at %s has no attribute %r' %( + type(found).__name__, used, part + ) + ) + return found + + def derive_importpath(import_path, raising): - import pytest if not isinstance(import_path, _basestring) or "." not in import_path: raise TypeError("must be absolute import path string, not %r" % (import_path,)) - rest = [] - target = import_path - target_parts = set(target.split(".")) - while target: - try: - obj = __import__(target, None, None, "__doc__") - except ImportError as ex: - if hasattr(ex, 'name'): - # Python >= 3.3 - failed_name = ex.name - else: - match = RE_IMPORT_ERROR_NAME.match(ex.args[0]) - assert match - failed_name = match.group(1) - - if "." not in target: - __tracebackhide__ = True - pytest.fail("could not import any sub part: %s" % - import_path) - elif failed_name != target \ - and not any(p == failed_name for p in target_parts): - # target is importable but causes ImportError itself - __tracebackhide__ = True - pytest.fail("import error in %s: %s" % (target, ex.args[0])) - target, name = target.rsplit(".", 1) - rest.append(name) - else: - assert rest - try: - while len(rest) > 1: - attr = rest.pop() - obj = getattr(obj, attr) - attr = rest[0] - if raising: - getattr(obj, attr) - except AttributeError: - __tracebackhide__ = True - pytest.fail("object %r has no attribute %r" % (obj, attr)) - return attr, obj + module, attr = import_path.rsplit('.', 1) + target = resolve(module) + if raising: + getattr(target, attr) + return attr, target class Notset: diff --git a/testing/test_monkeypatch.py b/testing/test_monkeypatch.py index 99437fe68..7270309a9 100644 --- a/testing/test_monkeypatch.py +++ b/testing/test_monkeypatch.py @@ -320,3 +320,11 @@ def test_issue156_undo_staticmethod(Sample): monkeypatch.undo() assert Sample.hello() + +def test_issue1338_name_resolving(): + pytest.importorskip('requests') + monkeypatch = MonkeyPatch() + try: + monkeypatch.delattr('requests.sessions.Session.request') + finally: + monkeypatch.undo() \ No newline at end of file From b825af2e661a584b1dac1e6c4758d51cf9072657 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sat, 23 Jan 2016 19:31:17 +0100 Subject: [PATCH 03/11] pass trough annotated exceptions --- _pytest/monkeypatch.py | 24 +++++++++++++++--------- testing/test_monkeypatch.py | 6 +++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/_pytest/monkeypatch.py b/_pytest/monkeypatch.py index 74e29d94f..475004539 100644 --- a/_pytest/monkeypatch.py +++ b/_pytest/monkeypatch.py @@ -2,6 +2,7 @@ import os, sys import re +import pytest from py.builtin import _basestring @@ -52,17 +53,22 @@ def resolve(name): raise ImportError( 'import error in %s: %s' % (used, ex) ) - try: - found = getattr(found, part) - except AttributeError: - raise AttributeError( - '%r object at %s has no attribute %r' %( - type(found).__name__, used, part - ) - ) + found = annotated_getattr(found, part, used) return found +def annotated_getattr(obj, name, ann): + try: + obj = getattr(obj, name) + except AttributeError: + raise AttributeError( + '%r object at %s has no attribute %r' % ( + type(obj).__name__, ann, name + ) + ) + return obj + + def derive_importpath(import_path, raising): if not isinstance(import_path, _basestring) or "." not in import_path: raise TypeError("must be absolute import path string, not %r" % @@ -70,7 +76,7 @@ def derive_importpath(import_path, raising): module, attr = import_path.rsplit('.', 1) target = resolve(module) if raising: - getattr(target, attr) + annotated_getattr(target, attr, ann=module) return attr, target diff --git a/testing/test_monkeypatch.py b/testing/test_monkeypatch.py index 7270309a9..048c942c8 100644 --- a/testing/test_monkeypatch.py +++ b/testing/test_monkeypatch.py @@ -62,11 +62,11 @@ class TestSetattrWithImportPath: pytest.raises(TypeError, lambda: monkeypatch.setattr(None, None)) def test_unknown_import(self, monkeypatch): - pytest.raises(pytest.fail.Exception, + pytest.raises(ImportError, lambda: monkeypatch.setattr("unkn123.classx", None)) def test_unknown_attr(self, monkeypatch): - pytest.raises(pytest.fail.Exception, + pytest.raises(AttributeError, lambda: monkeypatch.setattr("os.path.qweqwe", None)) def test_unknown_attr_non_raising(self, monkeypatch): @@ -283,7 +283,7 @@ def test_importerror(testdir): """)) result = testdir.runpytest() result.stdout.fnmatch_lines(""" - *import error in package.a.x: No module named {0}doesnotexist{0}* + *import error in package.a: No module named {0}doesnotexist{0}* """.format("'" if sys.version_info > (3, 0) else "")) From d028fe1e662a5cf9e3561c606444f103a611a558 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sat, 23 Jan 2016 20:29:54 +0100 Subject: [PATCH 04/11] remove unused import --- _pytest/monkeypatch.py | 1 - 1 file changed, 1 deletion(-) diff --git a/_pytest/monkeypatch.py b/_pytest/monkeypatch.py index 475004539..43b8c2fe1 100644 --- a/_pytest/monkeypatch.py +++ b/_pytest/monkeypatch.py @@ -2,7 +2,6 @@ import os, sys import re -import pytest from py.builtin import _basestring From cd9e30b2215604bd601d00ecbb9989002aac9be5 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 00:40:27 +0100 Subject: [PATCH 05/11] work around python 2/3 difference by using str(exception) --- _pytest/monkeypatch.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_pytest/monkeypatch.py b/_pytest/monkeypatch.py index 43b8c2fe1..4431d25b3 100644 --- a/_pytest/monkeypatch.py +++ b/_pytest/monkeypatch.py @@ -45,7 +45,8 @@ def resolve(name): try: __import__(used) except ImportError as ex: - expected = ex.message.split()[-1] + # str is used for py2 vs py3 + expected = str(ex).split()[-1] if expected == used: raise else: From cb6181255e5f88aeaecb0eab4d510747862d3738 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 00:45:59 +0100 Subject: [PATCH 06/11] changelog --- CHANGELOG | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG b/CHANGELOG index e0f64a11b..9c3064bc4 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ 2.8.7.dev1 ---------- +- fix #1338: use predictable object resolution for monkeypatch' 2.8.6 ----- From 2d05f831fed55911bb3dd4a5cf905aeee8cdcc88 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 12:28:14 +0100 Subject: [PATCH 07/11] monkeypatch: unnest handling code this avoid python3 nested exceptions --- _pytest/monkeypatch.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/_pytest/monkeypatch.py b/_pytest/monkeypatch.py index 4431d25b3..d4c169d37 100644 --- a/_pytest/monkeypatch.py +++ b/_pytest/monkeypatch.py @@ -42,18 +42,23 @@ def resolve(name): try: found = getattr(found, part) except AttributeError: - try: - __import__(used) - except ImportError as ex: - # str is used for py2 vs py3 - expected = str(ex).split()[-1] - if expected == used: - raise - else: - raise ImportError( - 'import error in %s: %s' % (used, ex) - ) - found = annotated_getattr(found, part, used) + pass + else: + continue + # we use explicit un-nesting of the handling block in order + # to avoid nested exceptions on python 3 + try: + __import__(used) + except ImportError as ex: + # str is used for py2 vs py3 + expected = str(ex).split()[-1] + if expected == used: + raise + else: + raise ImportError( + 'import error in %s: %s' % (used, ex) + ) + found = annotated_getattr(found, part, used) return found From 56c5db6e12714cec27c1c480eb078c795d3a7389 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 12:30:38 +0100 Subject: [PATCH 08/11] add requests dependency to tox.ini to ensure all monkeypatch tests run --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 90468dbcf..64d84b2f3 100644 --- a/tox.ini +++ b/tox.ini @@ -12,6 +12,7 @@ passenv = USER USERNAME deps= nose mock + requests [testenv:py26] commands= py.test --lsof -rfsxX {posargs:testing} From 64d7d0021840639c121ae87008abc9dcd3d5cdad Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 17:59:48 +0100 Subject: [PATCH 09/11] Prepare 2.8.7 release --- CHANGELOG | 4 ++-- _pytest/__init__.py | 2 +- doc/en/announce/release-2.8.7.rst | 28 +++++++++++++++++++++++++++ doc/en/assert.rst | 4 ++-- doc/en/cache.rst | 6 +++--- doc/en/capture.rst | 2 +- doc/en/doctest.rst | 2 +- doc/en/example/markers.rst | 28 +++++++++++++-------------- doc/en/example/nonpython.rst | 6 +++--- doc/en/example/parametrize.rst | 21 +++++++++----------- doc/en/example/pythoncollection.rst | 6 +++--- doc/en/example/reportingdemo.rst | 2 +- doc/en/example/simple.rst | 30 ++++++++++++++--------------- doc/en/fixture.rst | 10 +++++----- doc/en/getting-started.rst | 4 ++-- doc/en/parametrize.rst | 4 ++-- doc/en/skipping.rst | 2 +- doc/en/tmpdir.rst | 2 +- doc/en/unittest.rst | 2 +- 19 files changed, 95 insertions(+), 70 deletions(-) create mode 100644 doc/en/announce/release-2.8.7.rst diff --git a/CHANGELOG b/CHANGELOG index 9c3064bc4..b3f797849 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,7 @@ -2.8.7.dev1 +2.8.7 ---------- -- fix #1338: use predictable object resolution for monkeypatch' +- fix #1338: use predictable object resolution for monkeypatch 2.8.6 ----- diff --git a/_pytest/__init__.py b/_pytest/__init__.py index 641025873..fc34d84ac 100644 --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.8.7.dev1' +__version__ = '2.8.7' diff --git a/doc/en/announce/release-2.8.7.rst b/doc/en/announce/release-2.8.7.rst new file mode 100644 index 000000000..d9137e447 --- /dev/null +++ b/doc/en/announce/release-2.8.7.rst @@ -0,0 +1,28 @@ +pytest-2.8.6 +============ + +pytest is a mature Python testing tool with more than a 1100 tests +against itself, passing on many different interpreters and platforms. +This release is supposed to be drop-in compatible to 2.8.5. + +See below for the changes and see docs at: + + http://pytest.org + +As usual, you can upgrade from pypi via:: + + pip install -U pytest + +Thanks to all who contributed to this release, among them: + + Ronny Pfannschmidt + + +Happy testing, +The py.test Development Team + + +2.8.7 (compared to 2.8.6) +------------------------- + +- fix #1338: use predictable object resolution for monkeypatch \ No newline at end of file diff --git a/doc/en/assert.rst b/doc/en/assert.rst index 795f52586..367938f77 100644 --- a/doc/en/assert.rst +++ b/doc/en/assert.rst @@ -26,7 +26,7 @@ you will see the return value of the function call:: $ py.test test_assert1.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -146,7 +146,7 @@ if you run this module:: $ py.test test_assert2.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/cache.rst b/doc/en/cache.rst index 3c3b5eb22..fa3f78d7e 100644 --- a/doc/en/cache.rst +++ b/doc/en/cache.rst @@ -80,7 +80,7 @@ If you then run it with ``--lf``:: $ py.test --lf ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 run-last-failure: rerun last 2 failures rootdir: $REGENDOC_TMPDIR, inifile: collected 50 items @@ -121,7 +121,7 @@ of ``FF`` and dots):: $ py.test --ff ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 run-last-failure: rerun last 2 failures first rootdir: $REGENDOC_TMPDIR, inifile: collected 50 items @@ -226,7 +226,7 @@ You can always peek at the content of the cache using the $ py.test --cache-clear ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/capture.rst b/doc/en/capture.rst index 3a246f5a5..457568b82 100644 --- a/doc/en/capture.rst +++ b/doc/en/capture.rst @@ -64,7 +64,7 @@ of the failing function and hide the other one:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/doctest.rst b/doc/en/doctest.rst index 0befa6702..610955824 100644 --- a/doc/en/doctest.rst +++ b/doc/en/doctest.rst @@ -46,7 +46,7 @@ then you can just invoke ``py.test`` without command line options:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 1 items diff --git a/doc/en/example/markers.rst b/doc/en/example/markers.rst index 95554189b..49faf887f 100644 --- a/doc/en/example/markers.rst +++ b/doc/en/example/markers.rst @@ -31,7 +31,7 @@ You can then restrict a test run to only run tests marked with ``webtest``:: $ py.test -v -m webtest ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -45,7 +45,7 @@ Or the inverse, running all tests except the webtest ones:: $ py.test -v -m "not webtest" ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -66,7 +66,7 @@ tests based on their module, class, method, or function name:: $ py.test -v test_server.py::TestClass::test_method ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 5 items @@ -79,7 +79,7 @@ You can also select on the class:: $ py.test -v test_server.py::TestClass ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -92,7 +92,7 @@ Or select multiple nodes:: $ py.test -v test_server.py::TestClass test_server.py::test_send_http ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 8 items @@ -130,7 +130,7 @@ select tests based on their names:: $ py.test -v -k http # running with the above defined example module ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -144,7 +144,7 @@ And you can also run all tests except the ones that match the keyword:: $ py.test -k "not send_http" -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -160,7 +160,7 @@ Or to select "http" and "quick" tests:: $ py.test -k "http or quick" -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -350,7 +350,7 @@ the test needs:: $ py.test -E stage2 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -362,7 +362,7 @@ and here is one that specifies exactly the environment needed:: $ py.test -E stage1 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -481,7 +481,7 @@ then you will see two test skipped and two executed tests as expected:: $ py.test -rs # this option reports skip reasons ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -495,7 +495,7 @@ Note that if you specify a platform via the marker-command line option like this $ py.test -m linux2 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -547,7 +547,7 @@ We can now use the ``-m option`` to select one set:: $ py.test -m interface --tb=short ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -569,7 +569,7 @@ or to select both "event" and "interface" tests:: $ py.test -m "interface or event" --tb=short ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items diff --git a/doc/en/example/nonpython.rst b/doc/en/example/nonpython.rst index d2b15ab69..756e25255 100644 --- a/doc/en/example/nonpython.rst +++ b/doc/en/example/nonpython.rst @@ -27,7 +27,7 @@ now execute the test specification:: nonpython $ py.test test_simple.yml ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collected 2 items @@ -59,7 +59,7 @@ consulted when reporting in ``verbose`` mode:: nonpython $ py.test -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collecting ... collected 2 items @@ -81,7 +81,7 @@ interesting to just look at the collection tree:: nonpython $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collected 2 items diff --git a/doc/en/example/parametrize.rst b/doc/en/example/parametrize.rst index 79d38ee2f..4423ea257 100644 --- a/doc/en/example/parametrize.rst +++ b/doc/en/example/parametrize.rst @@ -130,7 +130,7 @@ objects, they are still using the default pytest representation:: $ py.test test_time.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 6 items @@ -181,7 +181,7 @@ this is a fully self-contained example which you can run with:: $ py.test test_scenarios.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -194,7 +194,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia $ py.test --collect-only test_scenarios.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -259,7 +259,7 @@ Let's first see how it looks like at collection time:: $ py.test test_backends.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -320,7 +320,7 @@ The result of this test will be successful:: $ py.test test_indirect_list.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -369,7 +369,7 @@ argument sets to use for each test function. Let's run it:: $ py.test -q F.. ======= FAILURES ======== - _______ TestClass.test_equals[2-1] ________ + _______ TestClass.test_equals[1-2] ________ self = , a = 1, b = 2 @@ -397,11 +397,8 @@ is to be run with different sets of arguments for its three arguments: Running it results in some skips if we don't have all the python interpreters installed and otherwise runs all combinations (5 interpreters times 5 interpreters times 3 objects to serialize/deserialize):: . $ py.test -rs -q multipython.py - ssssssssssss...ssssssssssss - ======= short test summary info ======== - SKIP [12] $REGENDOC_TMPDIR/CWD/multipython.py:22: 'python2.6' not found - SKIP [12] $REGENDOC_TMPDIR/CWD/multipython.py:22: 'python3.3' not found - 3 passed, 24 skipped in 0.12 seconds + ........................... + 27 passed in 0.12 seconds Indirect parametrization of optional implementations/imports -------------------------------------------------------------------- @@ -448,7 +445,7 @@ If you run this with reporting for skips enabled:: $ py.test -rs test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/example/pythoncollection.rst b/doc/en/example/pythoncollection.rst index e7166e6e9..f8af169f9 100644 --- a/doc/en/example/pythoncollection.rst +++ b/doc/en/example/pythoncollection.rst @@ -82,7 +82,7 @@ then the test collection looks like this:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: setup.cfg collected 2 items @@ -128,7 +128,7 @@ You can always peek at the collection tree without running tests like this:: . $ py.test --collect-only pythoncollection.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 3 items @@ -182,7 +182,7 @@ interpreters and will leave out the setup.py file:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 0 items diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst index 824fd7598..6e79b3072 100644 --- a/doc/en/example/reportingdemo.rst +++ b/doc/en/example/reportingdemo.rst @@ -13,7 +13,7 @@ get on the terminal - we are working on that): assertion $ py.test failure_demo.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/assertion, inifile: collected 42 items diff --git a/doc/en/example/simple.rst b/doc/en/example/simple.rst index 627fb19ab..8d793d6dc 100644 --- a/doc/en/example/simple.rst +++ b/doc/en/example/simple.rst @@ -108,7 +108,7 @@ directory with the above conftest.py:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -156,7 +156,7 @@ and when running it will see a skipped "slow" test:: $ py.test -rs # "-rs" means report details on the little 's' ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -170,7 +170,7 @@ Or run it including the ``slow`` marked test:: $ py.test --runslow ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -262,7 +262,7 @@ which will add the string to the test header accordingly:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 project deps: mylib-1.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -286,7 +286,7 @@ which will add info only when run with "--v":: $ py.test -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache info1: did you know that ... did you? @@ -299,7 +299,7 @@ and nothing when run plainly:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -332,7 +332,7 @@ Now we can profile which test functions execute the slowest:: $ py.test --durations=3 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -394,11 +394,14 @@ If we run this:: $ py.test -rx ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items test_step.py .Fx. + ======= short test summary info ======== + XFAIL test_step.py::TestUserHandling::()::test_deletion + reason: previous test failed (test_modification) ======= FAILURES ======== _______ TestUserHandling.test_modification ________ @@ -410,9 +413,6 @@ If we run this:: E assert 0 test_step.py:9: AssertionError - ======= short test summary info ======== - XFAIL test_step.py::TestUserHandling::()::test_deletion - reason: previous test failed (test_modification) ======= 1 failed, 2 passed, 1 xfailed in 0.12 seconds ======== We'll see that ``test_deletion`` was not executed because ``test_modification`` @@ -465,7 +465,7 @@ We can run this:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 7 items @@ -479,7 +479,7 @@ We can run this:: file $REGENDOC_TMPDIR/b/test_error.py, line 1 def test_root(db): # no db here, will error out fixture 'db' not found - available fixtures: capsys, capfd, pytestconfig, tmpdir_factory, monkeypatch, record_xml_property, cache, tmpdir, recwarn + available fixtures: record_xml_property, pytestconfig, cache, capsys, recwarn, monkeypatch, tmpdir, capfd, tmpdir_factory use 'py.test --fixtures [testpath]' for help on them. $REGENDOC_TMPDIR/b/test_error.py:1 @@ -569,7 +569,7 @@ and run them:: $ py.test test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -660,7 +660,7 @@ and run it:: $ py.test -s test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items diff --git a/doc/en/fixture.rst b/doc/en/fixture.rst index 54d2eda18..398e091d8 100644 --- a/doc/en/fixture.rst +++ b/doc/en/fixture.rst @@ -75,7 +75,7 @@ marked ``smtp`` fixture function. Running the test looks like this:: $ py.test test_smtpsimple.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -193,7 +193,7 @@ inspect what is going on and can now run the tests:: $ py.test test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -480,7 +480,7 @@ Running the above tests results in the following test IDs being used:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 10 items @@ -531,7 +531,7 @@ Here we declare an ``app`` fixture which receives the previously defined $ py.test -v test_appsetup.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 2 items @@ -597,7 +597,7 @@ Let's run the tests in verbose mode and with looking at the print-output:: $ py.test -v -s test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 8 items diff --git a/doc/en/getting-started.rst b/doc/en/getting-started.rst index a4814d196..d15beb994 100644 --- a/doc/en/getting-started.rst +++ b/doc/en/getting-started.rst @@ -27,7 +27,7 @@ Installation options:: To check your installation has installed the correct version:: $ py.test --version - This is pytest version 2.8.5, imported from $PYTHON_PREFIX/lib/python3.4/site-packages/pytest.py + This is pytest version 2.8.7, imported from $PYTHON_PREFIX/lib/python3.4/site-packages/pytest.py If you get an error checkout :ref:`installation issues`. @@ -49,7 +49,7 @@ That's it. You can execute the test function now:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/parametrize.rst b/doc/en/parametrize.rst index 7d2ce39b7..7bc0e4bb4 100644 --- a/doc/en/parametrize.rst +++ b/doc/en/parametrize.rst @@ -55,7 +55,7 @@ them in turn:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -103,7 +103,7 @@ Let's run this:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items diff --git a/doc/en/skipping.rst b/doc/en/skipping.rst index cb7730a19..b08227c70 100644 --- a/doc/en/skipping.rst +++ b/doc/en/skipping.rst @@ -165,7 +165,7 @@ Running it with the report-on-xfail option gives this output:: example $ py.test -rx xfail_demo.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/example, inifile: collected 7 items diff --git a/doc/en/tmpdir.rst b/doc/en/tmpdir.rst index db776932b..1da211384 100644 --- a/doc/en/tmpdir.rst +++ b/doc/en/tmpdir.rst @@ -29,7 +29,7 @@ Running this would result in a passed test except for the last $ py.test test_tmpdir.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/unittest.rst b/doc/en/unittest.rst index f06e97c7f..7d9ef909b 100644 --- a/doc/en/unittest.rst +++ b/doc/en/unittest.rst @@ -88,7 +88,7 @@ the ``self.db`` values in the traceback:: $ py.test test_unittest_db.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.7, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items From 3315b3a12fdd9ef8e05d4efb6d6bea52aa750668 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 23:23:15 +0100 Subject: [PATCH 10/11] finalize changelog for 2.8.7 --- doc/en/announce/release-2.8.7.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/en/announce/release-2.8.7.rst b/doc/en/announce/release-2.8.7.rst index d9137e447..d98d73106 100644 --- a/doc/en/announce/release-2.8.7.rst +++ b/doc/en/announce/release-2.8.7.rst @@ -1,6 +1,9 @@ -pytest-2.8.6 +pytest-2.8.7 ============ +This is a hotfix release to solve a regression +in the builtin monkeypatch plugin that got introduced in 2.8.6. + pytest is a mature Python testing tool with more than a 1100 tests against itself, passing on many different interpreters and platforms. This release is supposed to be drop-in compatible to 2.8.5. From 6c3e6401d4361af66c76d6e74da775c805157df0 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Sun, 24 Jan 2016 23:56:56 +0100 Subject: [PATCH 11/11] begin 2.8.8 cycle --- CHANGELOG | 5 ++++- _pytest/__init__.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b3f797849..4bd2fee28 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,8 @@ +2.8.2.dev1 +----- + 2.8.7 ----------- +----- - fix #1338: use predictable object resolution for monkeypatch diff --git a/_pytest/__init__.py b/_pytest/__init__.py index fc34d84ac..2d23a02ec 100644 --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.8.7' +__version__ = '2.8.8.dev1'