Skip to content

Commit 0b14350

Browse files
authored
Merge pull request #7929 from bluetech/xunit-quadratic-1
python: fix quadratic behavior in collection of items using xunit fixtures
2 parents 0d9e27a + 50114d4 commit 0b14350

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

bench/xunit.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
for i in range(5000):
2+
exec(
3+
f"""
4+
class Test{i}:
5+
@classmethod
6+
def setup_class(cls): pass
7+
def test_1(self): pass
8+
def test_2(self): pass
9+
def test_3(self): pass
10+
"""
11+
)

src/_pytest/python.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,12 @@ def _inject_setup_module_fixture(self) -> None:
522522
if setup_module is None and teardown_module is None:
523523
return
524524

525-
@fixtures.fixture(autouse=True, scope="module")
525+
@fixtures.fixture(
526+
autouse=True,
527+
scope="module",
528+
# Use a unique name to speed up lookup.
529+
name=f"xunit_setup_module_fixture_{self.obj.__name__}",
530+
)
526531
def xunit_setup_module_fixture(request) -> Generator[None, None, None]:
527532
if setup_module is not None:
528533
_call_with_optional_argument(setup_module, request.module)
@@ -546,7 +551,12 @@ def _inject_setup_function_fixture(self) -> None:
546551
if setup_function is None and teardown_function is None:
547552
return
548553

549-
@fixtures.fixture(autouse=True, scope="function")
554+
@fixtures.fixture(
555+
autouse=True,
556+
scope="function",
557+
# Use a unique name to speed up lookup.
558+
name=f"xunit_setup_function_fixture_{self.obj.__name__}",
559+
)
550560
def xunit_setup_function_fixture(request) -> Generator[None, None, None]:
551561
if request.instance is not None:
552562
# in this case we are bound to an instance, so we need to let
@@ -789,7 +799,12 @@ def _inject_setup_class_fixture(self) -> None:
789799
if setup_class is None and teardown_class is None:
790800
return
791801

792-
@fixtures.fixture(autouse=True, scope="class")
802+
@fixtures.fixture(
803+
autouse=True,
804+
scope="class",
805+
# Use a unique name to speed up lookup.
806+
name=f"xunit_setup_class_fixture_{self.obj.__qualname__}",
807+
)
793808
def xunit_setup_class_fixture(cls) -> Generator[None, None, None]:
794809
if setup_class is not None:
795810
func = getimfunc(setup_class)
@@ -813,7 +828,12 @@ def _inject_setup_method_fixture(self) -> None:
813828
if setup_method is None and teardown_method is None:
814829
return
815830

816-
@fixtures.fixture(autouse=True, scope="function")
831+
@fixtures.fixture(
832+
autouse=True,
833+
scope="function",
834+
# Use a unique name to speed up lookup.
835+
name=f"xunit_setup_method_fixture_{self.obj.__qualname__}",
836+
)
817837
def xunit_setup_method_fixture(self, request) -> Generator[None, None, None]:
818838
method = request.function
819839
if setup_method is not None:

0 commit comments

Comments
 (0)