perf: разбор библиотеки сценариев один раз на прогон тестов
This commit is contained in:
parent
d26cf2365d
commit
fb9c27977d
1 changed files with 25 additions and 0 deletions
|
|
@ -5,8 +5,10 @@
|
||||||
логинятся через `dev-token` — так же, как `make lesson` (tasks/lct-23-auth-roles.md).
|
логинятся через `dev-token` — так же, как `make lesson` (tasks/lct-23-auth-roles.md).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import copy
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
|
from pathlib import Path
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
os.environ.setdefault("DEV_AUTH_BYPASS", "true")
|
os.environ.setdefault("DEV_AUTH_BYPASS", "true")
|
||||||
|
|
@ -43,6 +45,29 @@ def _dev_auth():
|
||||||
yield
|
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)
|
@pytest.fixture(autouse=True)
|
||||||
def _fresh_engine():
|
def _fresh_engine():
|
||||||
"""Движок базы — на тест, а не на процесс.
|
"""Движок базы — на тест, а не на процесс.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue