fixtures: fix quadratic behavior in the number of autouse fixtures
It turns out all autouse fixtures are kept in a global list, and thinned out for a particular node using a linear scan of the entire list each time. Change the list to a dict, and only take the nodes we need.
This commit is contained in:
parent
d6becfa177
commit
470ea504e2
|
@ -0,0 +1 @@
|
||||||
|
Fixed quadratic behavior and improved performance of collection of items using autouse fixtures and xunit fixtures.
|
|
@ -1412,9 +1412,10 @@ class FixtureManager:
|
||||||
self.config: Config = session.config
|
self.config: Config = session.config
|
||||||
self._arg2fixturedefs: Dict[str, List[FixtureDef[Any]]] = {}
|
self._arg2fixturedefs: Dict[str, List[FixtureDef[Any]]] = {}
|
||||||
self._holderobjseen: Set[object] = set()
|
self._holderobjseen: Set[object] = set()
|
||||||
self._nodeid_and_autousenames: List[Tuple[str, List[str]]] = [
|
# A mapping from a nodeid to a list of autouse fixtures it defines.
|
||||||
("", self.config.getini("usefixtures"))
|
self._nodeid_autousenames: Dict[str, List[str]] = {
|
||||||
]
|
"": self.config.getini("usefixtures"),
|
||||||
|
}
|
||||||
session.config.pluginmanager.register(self, "funcmanage")
|
session.config.pluginmanager.register(self, "funcmanage")
|
||||||
|
|
||||||
def _get_direct_parametrize_args(self, node: nodes.Node) -> List[str]:
|
def _get_direct_parametrize_args(self, node: nodes.Node) -> List[str]:
|
||||||
|
@ -1478,9 +1479,9 @@ class FixtureManager:
|
||||||
|
|
||||||
def _getautousenames(self, nodeid: str) -> Iterator[str]:
|
def _getautousenames(self, nodeid: str) -> Iterator[str]:
|
||||||
"""Return the names of autouse fixtures applicable to nodeid."""
|
"""Return the names of autouse fixtures applicable to nodeid."""
|
||||||
parentnodeids = set(nodes.iterparentnodeids(nodeid))
|
for parentnodeid in nodes.iterparentnodeids(nodeid):
|
||||||
for baseid, basenames in self._nodeid_and_autousenames:
|
basenames = self._nodeid_autousenames.get(parentnodeid)
|
||||||
if baseid in parentnodeids:
|
if basenames:
|
||||||
yield from basenames
|
yield from basenames
|
||||||
|
|
||||||
def getfixtureclosure(
|
def getfixtureclosure(
|
||||||
|
@ -1642,7 +1643,7 @@ class FixtureManager:
|
||||||
autousenames.append(name)
|
autousenames.append(name)
|
||||||
|
|
||||||
if autousenames:
|
if autousenames:
|
||||||
self._nodeid_and_autousenames.append((nodeid or "", autousenames))
|
self._nodeid_autousenames.setdefault(nodeid or "", []).extend(autousenames)
|
||||||
|
|
||||||
def getfixturedefs(
|
def getfixturedefs(
|
||||||
self, argname: str, nodeid: str
|
self, argname: str, nodeid: str
|
||||||
|
|
Loading…
Reference in New Issue