perf: разбор библиотеки сценариев один раз на прогон тестов

This commit is contained in:
gglamer 2026-09-26 19:27:52 +00:00
commit fb9c27977d

View file

@ -5,8 +5,10 @@
логинятся через `dev-token` — так же, как `make lesson` (tasks/lct-23-auth-roles.md).
"""
import copy
import os
import socket
from pathlib import Path
from urllib.parse import urlparse
os.environ.setdefault("DEV_AUTH_BYPASS", "true")
@ -43,6 +45,29 @@ def _dev_auth():
yield
@pytest.fixture(autouse=True, scope="session")
def _parsed_yaml_once():
"""Каждый `TestClient` на старте перечитывает всю библиотеку сценариев:
~200 YAML — это 0.2 с на тест и минута на прогон. Разбор кешируется на
сессию; проверка схемы и сборка эталона идут по-прежнему на каждый старт.
Копия — чтобы правка словаря в одном тесте не протекла в другой.
"""
from app.scenarios import loader
original = loader._read_yaml
cache: dict[tuple[Path, int], dict] = {}
def cached(path: Path) -> dict:
key = (path.resolve(), path.stat().st_mtime_ns)
if key not in cache:
cache[key] = original(path)
return copy.deepcopy(cache[key])
loader._read_yaml = cached
yield
loader._read_yaml = original
@pytest.fixture(autouse=True)
def _fresh_engine():
"""Движок базы — на тест, а не на процесс.