diff --git a/src/_pytest/python.py b/src/_pytest/python.py index 9182ce7df..f6da27aec 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -1297,10 +1297,11 @@ class Metafunc: # more than once) then we accumulate those calls generating the cartesian product # of all calls. newcalls = [] - for callspec in self._calls or [CallSpec2()]: + for callspec_index, callspec in enumerate(self._calls or [CallSpec2()]): for param_index, (param_id, param_set) in enumerate( zip(ids, parametersets) ): + param_index = callspec_index * len(parametersets) + param_index newcallspec = callspec.setmulti( argnames=argnames, valset=param_set.values, diff --git a/testing/python/fixtures.py b/testing/python/fixtures.py index bc091bb1f..dcdf057d1 100644 --- a/testing/python/fixtures.py +++ b/testing/python/fixtures.py @@ -2719,12 +2719,12 @@ class TestFixtureMarker: test_mod2.py::test_func2[s2] PASSED test_mod2.py::test_func3[s2-m1] PASSED test_mod2.py::test_func3b[s2-m1] PASSED - test_mod2.py::test_func4[m1] PASSED test_mod2.py::test_func3[s2-m2] PASSED test_mod2.py::test_func3b[s2-m2] PASSED - test_mod2.py::test_func4[m2] PASSED test_mod1.py::test_func1[m1] PASSED test_mod1.py::test_func1[m2] PASSED + test_mod2.py::test_func4[m1] PASSED + test_mod2.py::test_func4[m2] PASSED """ ) @@ -2770,10 +2770,10 @@ class TestFixtureMarker: test_dynamic_parametrized_ordering.py::test2[flavor1-vxlan] PASSED test_dynamic_parametrized_ordering.py::test[flavor1-vlan] PASSED test_dynamic_parametrized_ordering.py::test2[flavor1-vlan] PASSED - test_dynamic_parametrized_ordering.py::test[flavor2-vlan] PASSED - test_dynamic_parametrized_ordering.py::test2[flavor2-vlan] PASSED test_dynamic_parametrized_ordering.py::test[flavor2-vxlan] PASSED test_dynamic_parametrized_ordering.py::test2[flavor2-vxlan] PASSED + test_dynamic_parametrized_ordering.py::test[flavor2-vlan] PASSED + test_dynamic_parametrized_ordering.py::test2[flavor2-vlan] PASSED """ ) diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index 2dd85607e..21050fe78 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -1017,6 +1017,39 @@ class TestMetafunc: ] ) + def test_multi_parametrize_reordering(self, pytester: Pytester) -> None: + pytester.makepyfile( + """ + import pytest + + @pytest.mark.parametrize("arg2", ['a', 'b', 'c'], scope='class') + @pytest.mark.parametrize("arg1", [1, 2], scope='class') + class TestClass: + def test1(self, arg1, arg2): + pass + + def test2(self, arg1, arg2): + pass + """ + ) + result = pytester.runpytest("--collect-only") + result.stdout.re_match_lines( + [ + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + r" ", + ] + ) + def test_parametrize_multiple_times(self, pytester: Pytester) -> None: pytester.makepyfile( """