fixtures: fix non-working package-scope parametrization reordering
The `.parent` was incorrectly removed in
a21fb87a90
, but it was actually correct
(well, it assumes that Module.path.parent == Package.path, which I'm not
sure is always correct, but that's a different matter). Restore it.
Fix #12328.
This commit is contained in:
parent
fa1d5be3e8
commit
1acf56d033
|
@ -0,0 +1 @@
|
||||||
|
Fix a regression in pytest 8.0.0 where package-scoped parameterized items were not correctly reordered to minimize setups/teardowns in some cases.
|
|
@ -187,7 +187,8 @@ def get_parametrized_fixture_keys(
|
||||||
if scope is Scope.Session:
|
if scope is Scope.Session:
|
||||||
scoped_item_path = None
|
scoped_item_path = None
|
||||||
elif scope is Scope.Package:
|
elif scope is Scope.Package:
|
||||||
scoped_item_path = item.path
|
# Package key = module's directory.
|
||||||
|
scoped_item_path = item.path.parent
|
||||||
elif scope is Scope.Module:
|
elif scope is Scope.Module:
|
||||||
scoped_item_path = item.path
|
scoped_item_path = item.path
|
||||||
elif scope is Scope.Class:
|
elif scope is Scope.Class:
|
||||||
|
|
|
@ -4274,6 +4274,39 @@ class TestScopeOrdering:
|
||||||
request = TopRequest(items[0], _ispytest=True)
|
request = TopRequest(items[0], _ispytest=True)
|
||||||
assert request.fixturenames == "s1 p1 m1 m2 c1 f2 f1".split()
|
assert request.fixturenames == "s1 p1 m1 m2 c1 f2 f1".split()
|
||||||
|
|
||||||
|
def test_parametrized_package_scope_reordering(self, pytester: Pytester) -> None:
|
||||||
|
"""A paramaterized package-scoped fixture correctly reorders items to
|
||||||
|
minimize setups & teardowns.
|
||||||
|
|
||||||
|
Regression test for #12328.
|
||||||
|
"""
|
||||||
|
pytester.makepyfile(
|
||||||
|
__init__="",
|
||||||
|
conftest="""
|
||||||
|
import pytest
|
||||||
|
@pytest.fixture(scope="package", params=["a", "b"])
|
||||||
|
def fix(request):
|
||||||
|
return request.param
|
||||||
|
""",
|
||||||
|
test_1="def test1(fix): pass",
|
||||||
|
test_2="def test2(fix): pass",
|
||||||
|
)
|
||||||
|
|
||||||
|
result = pytester.runpytest("--setup-plan")
|
||||||
|
assert result.ret == ExitCode.OK
|
||||||
|
result.stdout.fnmatch_lines(
|
||||||
|
[
|
||||||
|
" SETUP P fix['a']",
|
||||||
|
" test_1.py::test1[a] (fixtures used: fix, request)",
|
||||||
|
" test_2.py::test2[a] (fixtures used: fix, request)",
|
||||||
|
" TEARDOWN P fix['a']",
|
||||||
|
" SETUP P fix['b']",
|
||||||
|
" test_1.py::test1[b] (fixtures used: fix, request)",
|
||||||
|
" test_2.py::test2[b] (fixtures used: fix, request)",
|
||||||
|
" TEARDOWN P fix['b']",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
def test_multiple_packages(self, pytester: Pytester) -> None:
|
def test_multiple_packages(self, pytester: Pytester) -> None:
|
||||||
"""Complex test involving multiple package fixtures. Make sure teardowns
|
"""Complex test involving multiple package fixtures. Make sure teardowns
|
||||||
are executed in order.
|
are executed in order.
|
||||||
|
|
Loading…
Reference in New Issue