@@ -1412,9 +1412,10 @@ def __init__(self, session: "Session") -> None:
14121412 self .config : Config = session .config
14131413 self ._arg2fixturedefs : Dict [str , List [FixtureDef [Any ]]] = {}
14141414 self ._holderobjseen : Set [object ] = set ()
1415- self ._nodeid_and_autousenames : List [Tuple [str , List [str ]]] = [
1416- ("" , self .config .getini ("usefixtures" ))
1417- ]
1415+ # A mapping from a nodeid to a list of autouse fixtures it defines.
1416+ self ._nodeid_autousenames : Dict [str , List [str ]] = {
1417+ "" : self .config .getini ("usefixtures" ),
1418+ }
14181419 session .config .pluginmanager .register (self , "funcmanage" )
14191420
14201421 def _get_direct_parametrize_args (self , node : nodes .Node ) -> List [str ]:
@@ -1476,18 +1477,12 @@ def pytest_plugin_registered(self, plugin: _PluggyPlugin) -> None:
14761477
14771478 self .parsefactories (plugin , nodeid )
14781479
1479- def _getautousenames (self , nodeid : str ) -> List [str ]:
1480- """Return a list of fixture names to be used."""
1481- autousenames : List [str ] = []
1482- for baseid , basenames in self ._nodeid_and_autousenames :
1483- if nodeid .startswith (baseid ):
1484- if baseid :
1485- i = len (baseid )
1486- nextchar = nodeid [i : i + 1 ]
1487- if nextchar and nextchar not in ":/" :
1488- continue
1489- autousenames .extend (basenames )
1490- return autousenames
1480+ def _getautousenames (self , nodeid : str ) -> Iterator [str ]:
1481+ """Return the names of autouse fixtures applicable to nodeid."""
1482+ for parentnodeid in nodes .iterparentnodeids (nodeid ):
1483+ basenames = self ._nodeid_autousenames .get (parentnodeid )
1484+ if basenames :
1485+ yield from basenames
14911486
14921487 def getfixtureclosure (
14931488 self ,
@@ -1503,7 +1498,7 @@ def getfixtureclosure(
15031498 # (discovering matching fixtures for a given name/node is expensive).
15041499
15051500 parentid = parentnode .nodeid
1506- fixturenames_closure = self ._getautousenames (parentid )
1501+ fixturenames_closure = list ( self ._getautousenames (parentid ) )
15071502
15081503 def merge (otherlist : Iterable [str ]) -> None :
15091504 for arg in otherlist :
@@ -1648,7 +1643,7 @@ def parsefactories(
16481643 autousenames .append (name )
16491644
16501645 if autousenames :
1651- self ._nodeid_and_autousenames . append (( nodeid or "" , autousenames ) )
1646+ self ._nodeid_autousenames . setdefault ( nodeid or "" , []). extend ( autousenames )
16521647
16531648 def getfixturedefs (
16541649 self , argname : str , nodeid : str
@@ -1668,6 +1663,7 @@ def getfixturedefs(
16681663 def _matchfactories (
16691664 self , fixturedefs : Iterable [FixtureDef [Any ]], nodeid : str
16701665 ) -> Iterator [FixtureDef [Any ]]:
1666+ parentnodeids = set (nodes .iterparentnodeids (nodeid ))
16711667 for fixturedef in fixturedefs :
1672- if nodes . ischildnode ( fixturedef .baseid , nodeid ) :
1668+ if fixturedef .baseid in parentnodeids :
16731669 yield fixturedef
0 commit comments