diff --git a/CHANGELOG b/CHANGELOG index 4cb5ccf8e..675d95a8e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,8 @@ Changes between 2.3.1 and 2.3.2.dev - fix issue205 - conftests in subdirs customizing pytest_pycollect_makemodule now work properly +- fix teardown-ordering for parametrized setups + - fix exception message check of test_nose.py to pass on python33 as well - fix issue206 - fix test_assertrewrite.py to work when a global diff --git a/_pytest/__init__.py b/_pytest/__init__.py index cad6f4d5e..74fe8cc06 100644 --- a/_pytest/__init__.py +++ b/_pytest/__init__.py @@ -1,2 +1,2 @@ # -__version__ = '2.3.2.dev5' +__version__ = '2.3.2.dev6' diff --git a/_pytest/python.py b/_pytest/python.py index 2b8344ce2..aaeaa17ee 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -1531,7 +1531,7 @@ class FixtureManager: item.session._setupstate._callfinalizers((name, param)) l = self._arg2finish.get(name) if l is not None: - for fin in l: + for fin in reversed(l): fin() def parsefactories(self, node_or_obj, nodeid=None, unittest=False): diff --git a/setup.py b/setup.py index fcc9f6fab..4610fca47 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ def main(): name='pytest', description='py.test: simple powerful testing with Python', long_description = long_description, - version='2.3.2.dev5', + version='2.3.2.dev6', url='http://pytest.org', license='MIT license', platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'], diff --git a/testing/test_python.py b/testing/test_python.py index 03c7155b4..7d4527ecb 100644 --- a/testing/test_python.py +++ b/testing/test_python.py @@ -2763,6 +2763,43 @@ class TestFixtureMarker: reprec = testdir.inline_run("-v") reprec.assertoutcome(passed=12+1) + def test_parametrized_fixture_teardown_order(self, testdir): + testdir.makepyfile(""" + import pytest + @pytest.fixture(params=[1,2], scope="class") + def param1(request): + return request.param + + l = [] + + class TestClass: + @classmethod + @pytest.fixture(scope="class", autouse=True) + def setup1(self, request, param1): + l.append(1) + request.addfinalizer(self.teardown1) + @classmethod + def teardown1(self): + assert l.pop() == 1 + @pytest.fixture(scope="class", autouse=True) + def setup2(self, request, param1): + l.append(2) + request.addfinalizer(self.teardown2) + @classmethod + def teardown2(self): + assert l.pop() == 2 + def test(self): + pass + + def test_finish(): + assert not l + """) + result = testdir.runpytest("-v") + result.stdout.fnmatch_lines(""" + *3 passed* + """) + assert "error" not in result.stdout.str() + def test_parametrize_separated_lifecycle(self, testdir): testdir.makepyfile(""" import pytest