34 lines
1.4 KiB
Python
34 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
import traceback
|
|
from typing import Any, Callable
|
|
|
|
import allure # pyright: ignore[reportMissingImports]
|
|
from allure_commons.types import AttachmentType # pyright: ignore[reportMissingImports]
|
|
|
|
|
|
def before_scenario(context: Any, scenario: Any) -> None: # noqa: ARG001
|
|
# Стек очистки: функции вызываются в обратном порядке (LIFO).
|
|
context._cleanup_fns: list[Callable[[], None]] = [] # type: ignore[attr-defined]
|
|
# Свежие фабрики данных на сценарий (иначе кешируются place_id/account_id после cleanup).
|
|
for attr in ("kvs_test_data", "kvs_subscription_test_data"):
|
|
if hasattr(context, attr):
|
|
delattr(context, attr)
|
|
|
|
|
|
def after_scenario(context: Any, scenario: Any) -> None: # noqa: ARG001
|
|
cleanup_fns: list[Callable[[], None]] = getattr(context, "_cleanup_fns", [])
|
|
while cleanup_fns:
|
|
fn = cleanup_fns.pop()
|
|
try:
|
|
with allure.step(f"Cleanup: {getattr(fn, '__name__', 'cleanup')}"):
|
|
fn()
|
|
except Exception:
|
|
# Cleanup не должен скрывать причину падения сценария, но полезно приложить traceback в Allure.
|
|
allure.attach(
|
|
traceback.format_exc(),
|
|
name="Cleanup error",
|
|
attachment_type=AttachmentType.TEXT,
|
|
)
|
|
|