diff --git a/changelog/12008.bugfix.rst b/changelog/12008.bugfix.rst new file mode 100644 index 00000000000..b9680b89236 --- /dev/null +++ b/changelog/12008.bugfix.rst @@ -0,0 +1 @@ +In :pr:`11220`, an unintended change in reordering was introduced by changing the way indices were assigned to direct params. More specifically, before that change, the indices of direct params to metafunc's callspecs were assigned after all parametrizations took place. Now, that change is reverted. diff --git a/src/_pytest/python.py b/src/_pytest/python.py index 9182ce7dfe9..094113bd1b4 100644 --- a/src/_pytest/python.py +++ b/src/_pytest/python.py @@ -464,6 +464,7 @@ def _genfunctions(self, name: str, funcobj) -> Iterator[Function]: if not metafunc._calls: yield Function.from_parent(self, name=name, fixtureinfo=fixtureinfo) else: + metafunc._recompute_direct_params_indices() # Direct parametrizations taking place in module/class-specific # `metafunc.parametrize` calls may have shadowed some fixtures, so make sure # we update what the function really needs a.k.a its fixture closure. Note that @@ -1131,6 +1132,8 @@ def __init__( # Result of parametrize(). self._calls: list[CallSpec2] = [] + self._params_directness: dict[str, Literal["indirect", "direct"]] = {} + def parametrize( self, argnames: str | Sequence[str], @@ -1273,6 +1276,7 @@ def parametrize( name2pseudofixturedef_key, default ) arg_directness = self._resolve_args_directness(argnames, indirect) + self._params_directness.update(arg_directness) for argname in argnames: if arg_directness[argname] == "indirect": continue @@ -1445,6 +1449,12 @@ def _validate_if_using_arg_names( pytrace=False, ) + def _recompute_direct_params_indices(self) -> None: + for argname, param_type in self._params_directness.items(): + if param_type == "direct": + for i, callspec in enumerate(self._calls): + callspec.indices[argname] = i + def _find_parametrized_scope( argnames: Sequence[str], diff --git a/testing/example_scripts/issue_519.py b/testing/example_scripts/issue_519.py index 138c07e95be..da5f5ad6aa9 100644 --- a/testing/example_scripts/issue_519.py +++ b/testing/example_scripts/issue_519.py @@ -23,13 +23,13 @@ def checked_order(): assert order == [ ("issue_519.py", "fix1", "arg1v1"), ("test_one[arg1v1-arg2v1]", "fix2", "arg2v1"), - ("test_one[arg1v1-arg2v2]", "fix2", "arg2v2"), ("test_two[arg1v1-arg2v1]", "fix2", "arg2v1"), + ("test_one[arg1v1-arg2v2]", "fix2", "arg2v2"), ("test_two[arg1v1-arg2v2]", "fix2", "arg2v2"), ("issue_519.py", "fix1", "arg1v2"), ("test_one[arg1v2-arg2v1]", "fix2", "arg2v1"), - ("test_one[arg1v2-arg2v2]", "fix2", "arg2v2"), ("test_two[arg1v2-arg2v1]", "fix2", "arg2v1"), + ("test_one[arg1v2-arg2v2]", "fix2", "arg2v2"), ("test_two[arg1v2-arg2v2]", "fix2", "arg2v2"), ] diff --git a/testing/python/metafunc.py b/testing/python/metafunc.py index 2dd85607e71..be224d9e20b 100644 --- a/testing/python/metafunc.py +++ b/testing/python/metafunc.py @@ -1005,14 +1005,14 @@ def test3(arg1): result.stdout.re_match_lines( [ r" ", - r" ", r" ", + r" ", + r" ", r" ", + r" ", r" ", - r" ", r" ", r" ", - r" ", r" ", ] )