@@ -120,6 +120,8 @@ def runtestprotocol(
120120) -> List [TestReport ]:
121121 hasrequest = hasattr (item , "_request" )
122122 if hasrequest and not item ._request : # type: ignore[attr-defined]
123+ # This only happens if the item is re-run, as is done by
124+ # pytest-rerunfailures.
123125 item ._initrequest () # type: ignore[attr-defined]
124126 rep = call_and_report (item , "setup" , log )
125127 reports = [rep ]
@@ -151,7 +153,7 @@ def show_test_item(item: Item) -> None:
151153
152154def pytest_runtest_setup (item : Item ) -> None :
153155 _update_current_test_var (item , "setup" )
154- item .session ._setupstate .prepare (item )
156+ item .session ._setupstate .setup (item )
155157
156158
157159def pytest_runtest_call (item : Item ) -> None :
@@ -417,7 +419,7 @@ class SetupState:
417419
418420 []
419421
420- During the setup phase of item1, prepare (item1) is called. What it does
422+ During the setup phase of item1, setup (item1) is called. What it does
421423 is:
422424
423425 push session to stack, run session.setup()
@@ -441,7 +443,7 @@ class SetupState:
441443
442444 [session]
443445
444- During the setup phase of item2, prepare (item2) is called. What it does
446+ During the setup phase of item2, setup (item2) is called. What it does
445447 is:
446448
447449 push mod2 to stack, run mod2.setup()
@@ -477,23 +479,26 @@ def __init__(self) -> None:
477479 ],
478480 ] = {}
479481
480- def prepare (self , item : Item ) -> None :
482+ def setup (self , item : Item ) -> None :
481483 """Setup objects along the collector chain to the item."""
484+ needed_collectors = item .listchain ()
485+
482486 # If a collector fails its setup, fail its entire subtree of items.
483487 # The setup is not retried for each item - the same exception is used.
484- for col , (finalizers , prepare_exc ) in self .stack .items ():
485- if prepare_exc :
486- raise prepare_exc
488+ for col , (finalizers , exc ) in self .stack .items ():
489+ assert col in needed_collectors , "previous item was not torn down properly"
490+ if exc :
491+ raise exc
487492
488- needed_collectors = item .listchain ()
489493 for col in needed_collectors [len (self .stack ) :]:
490494 assert col not in self .stack
495+ # Push onto the stack.
491496 self .stack [col ] = ([col .teardown ], None )
492497 try :
493498 col .setup ()
494- except TEST_OUTCOME as e :
495- self .stack [col ] = (self .stack [col ][0 ], e )
496- raise e
499+ except TEST_OUTCOME as exc :
500+ self .stack [col ] = (self .stack [col ][0 ], exc )
501+ raise exc
497502
498503 def addfinalizer (self , finalizer : Callable [[], object ], node : Node ) -> None :
499504 """Attach a finalizer to the given node.
@@ -517,7 +522,7 @@ def teardown_exact(self, nextitem: Optional[Item]) -> None:
517522 while self .stack :
518523 if list (self .stack .keys ()) == needed_collectors [: len (self .stack )]:
519524 break
520- node , (finalizers , prepare_exc ) = self .stack .popitem ()
525+ node , (finalizers , _ ) = self .stack .popitem ()
521526 while finalizers :
522527 fin = finalizers .pop ()
523528 try :
0 commit comments