@@ -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