2 new commits in pytest:
https://bitbucket.org/hpk42/pytest/commits/6a5904c4816c/
Changeset: 6a5904c4816c
Branch: issue498
User: hpk42
Date: 2014-04-07 13:29:57
Summary: fix issue498: if a fixture finalizer fails, make sure that the
fixture
is still invalidated.
Affected #: 3 files
diff -r 393981dc0f1da8a2699ed4c8bc43f3644af592f9 -r
6a5904c4816cebd3e146a4277c0ad5021b131753 CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
NEXT (2.6)
-----------------------------------
+- fix issue498: if a fixture finalizer fails, make sure that
+ the fixture is still invalidated.
+
- fix issue453: the result of the pytest_assertrepr_compare hook now gets
it's newlines escaped so that format_exception does not blow up.
diff -r 393981dc0f1da8a2699ed4c8bc43f3644af592f9 -r
6a5904c4816cebd3e146a4277c0ad5021b131753 _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1778,13 +1778,15 @@
self._finalizer.append(finalizer)
def finish(self):
- while self._finalizer:
- func = self._finalizer.pop()
- func()
try:
- del self.cached_result
- except AttributeError:
- pass
+ while self._finalizer:
+ func = self._finalizer.pop()
+ func()
+ finally:
+ # even if finalization fails, we invalidate
+ # the cached fixture value
+ if hasattr(self, "cached_result"):
+ del self.cached_result
def execute(self, request):
# get required arguments and register our own finish()
diff -r 393981dc0f1da8a2699ed4c8bc43f3644af592f9 -r
6a5904c4816cebd3e146a4277c0ad5021b131753 testing/python/fixture.py
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -2087,6 +2087,35 @@
"*1 error*",
])
+ def test_issue498_fixture_finalizer_failing(self, testdir):
+ testdir.makepyfile("""
+ import pytest
+ @pytest.fixture
+ def fix1(request):
+ def f():
+ raise KeyError
+ request.addfinalizer(f)
+ return object()
+
+ l = []
+ def test_1(fix1):
+ l.append(fix1)
+ def test_2(fix1):
+ l.append(fix1)
+ def test_3():
+ assert l[0] != l[1]
+ """)
+ result = testdir.runpytest()
+ result.stdout.fnmatch_lines("""
+ *ERROR*teardown*test_1*
+ *KeyError*
+ *ERROR*teardown*test_2*
+ *KeyError*
+ *3 pass*2 error*
+ """)
+
+
+
def test_setupfunc_missing_funcarg(self, testdir):
testdir.makepyfile("""
import pytest
https://bitbucket.org/hpk42/pytest/commits/81ac392651f5/
Changeset: 81ac392651f5
User: RonnyPfannschmidt
Date: 2014-04-07 13:51:03
Summary: Merged in hpk42/pytest-hpk/issue498 (pull request #151)
fix issue498: if a fixture finalizer fails, make sure that the fixture
Affected #: 3 files
diff -r c15664850085ac1b38d81b5fb3b30cd48c25f2db -r
81ac392651f55934e99828e279c38990e76a873e CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,9 @@
NEXT (2.6)
-----------------------------------
+- fix issue498: if a fixture finalizer fails, make sure that
+ the fixture is still invalidated.
+
- fix issue453: the result of the pytest_assertrepr_compare hook now gets
it's newlines escaped so that format_exception does not blow up.
diff -r c15664850085ac1b38d81b5fb3b30cd48c25f2db -r
81ac392651f55934e99828e279c38990e76a873e _pytest/python.py
--- a/_pytest/python.py
+++ b/_pytest/python.py
@@ -1778,13 +1778,15 @@
self._finalizer.append(finalizer)
def finish(self):
- while self._finalizer:
- func = self._finalizer.pop()
- func()
try:
- del self.cached_result
- except AttributeError:
- pass
+ while self._finalizer:
+ func = self._finalizer.pop()
+ func()
+ finally:
+ # even if finalization fails, we invalidate
+ # the cached fixture value
+ if hasattr(self, "cached_result"):
+ del self.cached_result
def execute(self, request):
# get required arguments and register our own finish()
diff -r c15664850085ac1b38d81b5fb3b30cd48c25f2db -r
81ac392651f55934e99828e279c38990e76a873e testing/python/fixture.py
--- a/testing/python/fixture.py
+++ b/testing/python/fixture.py
@@ -2087,6 +2087,35 @@
"*1 error*",
])
+ def test_issue498_fixture_finalizer_failing(self, testdir):
+ testdir.makepyfile("""
+ import pytest
+ @pytest.fixture
+ def fix1(request):
+ def f():
+ raise KeyError
+ request.addfinalizer(f)
+ return object()
+
+ l = []
+ def test_1(fix1):
+ l.append(fix1)
+ def test_2(fix1):
+ l.append(fix1)
+ def test_3():
+ assert l[0] != l[1]
+ """)
+ result = testdir.runpytest()
+ result.stdout.fnmatch_lines("""
+ *ERROR*teardown*test_1*
+ *KeyError*
+ *ERROR*teardown*test_2*
+ *KeyError*
+ *3 pass*2 error*
+ """)
+
+
+
def test_setupfunc_missing_funcarg(self, testdir):
testdir.makepyfile("""
import pytest
Repository URL: https://bitbucket.org/hpk42/pytest/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
_______________________________________________
pytest-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pytest-commit