runner: add a safety assert to SetupState.prepare

This ensures that the teardown for the previous item was done properly
for this (next) item, i.e. there are no leftover teardowns.
This commit is contained in:
Ran Benita 2021-01-31 01:49:25 +02:00
parent 80c223474c
commit f674f6da9f
2 changed files with 7 additions and 4 deletions

View File

@ -509,9 +509,9 @@ def pytest_runtest_teardown(item: "Item", nextitem: Optional["Item"]) -> None:
:param nextitem:
The scheduled-to-be-next test item (None if no further test item is
scheduled). This argument can be used to perform exact teardowns,
i.e. calling just enough finalizers so that nextitem only needs to
call setup-functions.
scheduled). This argument is used to perform exact teardowns, i.e.
calling just enough finalizers so that nextitem only needs to call
setup functions.
"""

View File

@ -479,15 +479,18 @@ class SetupState:
def prepare(self, item: Item) -> None:
"""Setup objects along the collector chain to the item."""
needed_collectors = item.listchain()
# If a collector fails its setup, fail its entire subtree of items.
# The setup is not retried for each item - the same exception is used.
for col, (finalizers, prepare_exc) in self.stack.items():
assert col in needed_collectors, "previous item was not torn down properly"
if prepare_exc:
raise prepare_exc
needed_collectors = item.listchain()
for col in needed_collectors[len(self.stack) :]:
assert col not in self.stack
# Push onto the stack.
self.stack[col] = ([col.teardown], None)
try:
col.setup()