1 new commit in pytest: https://bitbucket.org/hpk42/pytest/commits/39a686b8775f/ Changeset: 39a686b8775f User: hpk42 Date: 2013-07-17 10:29:11 Summary: SO-17664702: call fixture finalizers even if the fixture function partially failed (finalizers would not always be called before) Affected #: 5 files
diff -r 6b10ac6e0a44682ce1ba97e06eb61b1c90774938 -r 39a686b8775f100730751756e1b638e7a305e182 CHANGELOG --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ Changes between 2.3.5 and 2.4.DEV ----------------------------------- +- SO-17664702: call fixture finalizers even if the fixture function + partially failed (finalizers would not always be called before) + - color the last line red or green depending if failures/errors occured or everything passed. thanks Christian Theunert. diff -r 6b10ac6e0a44682ce1ba97e06eb61b1c90774938 -r 39a686b8775f100730751756e1b638e7a305e182 _pytest/__init__.py --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.4.0.dev6' +__version__ = '2.4.0.dev7' diff -r 6b10ac6e0a44682ce1ba97e06eb61b1c90774938 -r 39a686b8775f100730751756e1b638e7a305e182 _pytest/python.py --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1290,15 +1290,21 @@ # route request.addfinalizer to fixturedef mp.setattr(self, "addfinalizer", fixturedef.addfinalizer) - # perform the fixture call - val = fixturedef.execute(request=self) + try: + # perform the fixture call + val = fixturedef.execute(request=self) + finally: + # if the fixture function failed it might still have + # registered finalizers so we can register - # prepare finalization according to scope - # (XXX analyse exact finalizing mechanics / cleanup) - self.session._setupstate.addfinalizer(fixturedef.finish, self.node) - self._fixturemanager.addargfinalizer(fixturedef.finish, argname) - for subargname in fixturedef.argnames: # XXX all deps? - self._fixturemanager.addargfinalizer(fixturedef.finish, subargname) + # prepare finalization according to scope + # (XXX analyse exact finalizing mechanics / cleanup) + self.session._setupstate.addfinalizer(fixturedef.finish, + self.node) + self._fixturemanager.addargfinalizer(fixturedef.finish, argname) + for subargname in fixturedef.argnames: # XXX all deps? + self._fixturemanager.addargfinalizer(fixturedef.finish, + subargname) mp.undo() return val diff -r 6b10ac6e0a44682ce1ba97e06eb61b1c90774938 -r 39a686b8775f100730751756e1b638e7a305e182 setup.py --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ name='pytest', description='py.test: simple powerful testing with Python', long_description = long_description, - version='2.4.0.dev6', + version='2.4.0.dev7', url='http://pytest.org', license='MIT license', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], diff -r 6b10ac6e0a44682ce1ba97e06eb61b1c90774938 -r 39a686b8775f100730751756e1b638e7a305e182 testing/python/fixture.py --- a/testing/python/fixture.py +++ b/testing/python/fixture.py @@ -309,6 +309,39 @@ print(ss.stack) assert teardownlist == [1] + def test_request_addfinalizer_failing_setup(self, testdir): + testdir.makepyfile(""" + import pytest + l = [1] + @pytest.fixture + def myfix(request): + request.addfinalizer(l.pop) + assert 0 + def test_fix(myfix): + pass + def test_finalizer_ran(): + assert not l + """) + reprec = testdir.inline_run("-s") + reprec.assertoutcome(failed=1, passed=1) + + def test_request_addfinalizer_failing_setup_module(self, testdir): + testdir.makepyfile(""" + import pytest + l = [1, 2] + @pytest.fixture(scope="module") + def myfix(request): + request.addfinalizer(l.pop) + request.addfinalizer(l.pop) + assert 0 + def test_fix(myfix): + pass + """) + reprec = testdir.inline_run("-s") + mod = reprec.getcalls("pytest_runtest_setup")[0].item.module + assert not mod.l + + def test_request_addfinalizer_partial_setup_failure(self, testdir): p = testdir.makepyfile(""" l = [] 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 pytest-commit@python.org http://mail.python.org/mailman/listinfo/pytest-commit