Merge pull request #7929 from bluetech/xunit-quadratic-1

python: fix quadratic behavior in collection of items using xunit fixtures
This commit is contained in:
Ran Benita 2020-10-23 23:10:25 +03:00 committed by GitHub
commit 0b14350f23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 4 deletions

11
bench/xunit.py Normal file
View File

@ -0,0 +1,11 @@
for i in range(5000):
exec(
f"""
class Test{i}:
@classmethod
def setup_class(cls): pass
def test_1(self): pass
def test_2(self): pass
def test_3(self): pass
"""
)

View File

@ -522,7 +522,12 @@ class Module(nodes.File, PyCollector):
if setup_module is None and teardown_module is None:
return
@fixtures.fixture(autouse=True, scope="module")
@fixtures.fixture(
autouse=True,
scope="module",
# Use a unique name to speed up lookup.
name=f"xunit_setup_module_fixture_{self.obj.__name__}",
)
def xunit_setup_module_fixture(request) -> Generator[None, None, None]:
if setup_module is not None:
_call_with_optional_argument(setup_module, request.module)
@ -546,7 +551,12 @@ class Module(nodes.File, PyCollector):
if setup_function is None and teardown_function is None:
return
@fixtures.fixture(autouse=True, scope="function")
@fixtures.fixture(
autouse=True,
scope="function",
# Use a unique name to speed up lookup.
name=f"xunit_setup_function_fixture_{self.obj.__name__}",
)
def xunit_setup_function_fixture(request) -> Generator[None, None, None]:
if request.instance is not None:
# in this case we are bound to an instance, so we need to let
@ -789,7 +799,12 @@ class Class(PyCollector):
if setup_class is None and teardown_class is None:
return
@fixtures.fixture(autouse=True, scope="class")
@fixtures.fixture(
autouse=True,
scope="class",
# Use a unique name to speed up lookup.
name=f"xunit_setup_class_fixture_{self.obj.__qualname__}",
)
def xunit_setup_class_fixture(cls) -> Generator[None, None, None]:
if setup_class is not None:
func = getimfunc(setup_class)
@ -813,7 +828,12 @@ class Class(PyCollector):
if setup_method is None and teardown_method is None:
return
@fixtures.fixture(autouse=True, scope="function")
@fixtures.fixture(
autouse=True,
scope="function",
# Use a unique name to speed up lookup.
name=f"xunit_setup_method_fixture_{self.obj.__qualname__}",
)
def xunit_setup_method_fixture(self, request) -> Generator[None, None, None]:
method = request.function
if setup_method is not None: