From 55cc1e407345cd7a104192a016324398f391a6fe Mon Sep 17 00:00:00 2001 From: Tobias Deiminger Date: Thu, 16 Dec 2021 21:03:20 +0100 Subject: [PATCH] Let reorder_items use our new parameter key Fixes test reordering for indirect parameterization (see #8913). Prior to this commit, reorder_items considered the parameter index to tell if a parameter is "the same" and therefore can be shared. Looking at the index causes trouble if there are multiple parametrizations for the same fixture, basically because one index means different things in different parameter lists. This is fixed here by using the recently introduced parameter key as grouping criterion. Caution: The parameter key ends up inside the key of another dict, and therefore must be hashable. CallSpec2.param_keys is crafted sufficiently, it guarantees to contain comparable and hashable values. --- src/_pytest/fixtures.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/_pytest/fixtures.py b/src/_pytest/fixtures.py index 31dbdd4b3fc..655a8a037a8 100644 --- a/src/_pytest/fixtures.py +++ b/src/_pytest/fixtures.py @@ -252,18 +252,18 @@ def get_parametrized_fixture_keys(item: nodes.Item, scope: Scope) -> Iterator[_K # cs.indices.items() is random order of argnames. Need to # sort this so that different calls to # get_parametrized_fixture_keys will be deterministic. - for argname, param_index in sorted(cs.indices.items()): + for argname, param_key in sorted(cs.param_keys.items()): if cs._arg2scope[argname] != scope: continue if scope is Scope.Session: - key: _Key = (argname, param_index) + key: _Key = (argname, param_key) elif scope is Scope.Package: - key = (argname, param_index, item.path.parent) + key = (argname, param_key, item.path.parent) elif scope is Scope.Module: - key = (argname, param_index, item.path) + key = (argname, param_key, item.path) elif scope is Scope.Class: item_cls = item.cls # type: ignore[attr-defined] - key = (argname, param_index, item.path, item_cls) + key = (argname, param_key, item.path, item_cls) else: assert_never(scope) yield key