Загрузка данных
на ревью возникли вопросы и змечание к коду.
На вопросы надо ответить простым языком, а замечания исправить
список:
1)
with _step(f"Сверка статуса СОУ: Администрирование vs Состояние МТ " f"(tuId={tu_id}, '{tu_name}')"):
expected_enabled = sou_status == SouAdminStatus.RUNNING
Требуется пояснение, несильно понятно что чему равно и зачем
2) везде обращаемся по точкам в объекте, это хрупко если там где то None
Пример
tus = admin_reply.replyContent.basicInfo.tus if admin_reply.replyContent else []
Исправить в нашем новом коде
3)
def _is_configurator_flow_active() -> bool:
from utils.helpers import lds_configurator_utils as lds_cfg
лучше избегать таких вариантов написания, используя стандартные импорты
4) не пойму разницу между if и else
Типа есть аллюр степ или нет, так его и вынести можно в этот блок
async def connect(ws_client: WebSocketClient, ws_invoke_type: str, ws_invoke_params: Any = None) -> None:
"""
Подключение к заданной подписке
"""
try:
if _is_configurator_flow_active():
await ws_client.invoke(ws_invoke_type, ws_invoke_params)
else:
with allure.step(f"Вызов {ws_invoke_type} c параметрами {ws_invoke_params}"):
await ws_client.invoke(ws_invoke_type, ws_invoke_params)
except (asyncio.TimeoutError, ConnectionError, ConnectionResetError, OSError) as error:
if _is_configurator_flow_active():
raise
fail(f"Не удалось отправить сообщение типа: {ws_invoke_type} c параметрами {ws_invoke_params}. Ошибка: {error}")
Аналогично для connect_and_get_msg
5) разве autouse=True не на каждый тест распространяется?
@pytest.fixture(autouse=True)
def require_suite_infra(request):
"""
Блокирует тесты набора, если infra-setup не завершился успешно.
"""
if not request.node.get_closest_marker("test_suite_name"):
return
cfg = request.config.group_state
if cfg.get("current_suite") and not cfg.get("suite_infra_ready"):
pytest.exit(
"[SETUP] [ERROR] Инфраструктура набора не готова (suite_infra_ready=False). " "Тесты не запускаются."
)
6) что такое coro_factory ? и в чем причинно-следственная связь использования ?
def _run_lds_configurator_ws(coro_factory) -> None:
"""Запускает async WS-сценарий lds-configurator"""
lds_cfg_utils.set_configurator_flow_active(True)
lds_ws_parser.suppress_recv_logging = True
try:
asyncio.run(coro_factory())
finally:
lds_ws_parser.suppress_recv_logging = False
lds_cfg_utils.set_configurator_flow_active(False)
про блок finally "Тут тоже пояснения, что происходит
Файнали такая вещь капризная, надо точно знать что туда кладем"
7)
здесь и ниже побольше пояснялок, конфтест все таки, потом сложно будет вспомнить
async def _teardown() -> None:
ws_host = get_ws_host()
token = get_token()
async with WebSocketClient(ws_host, token) as client:
client.suppress_recv_logging = True
await lds_configurator_scenarios.lds_configurator_teardown(client, tu_id, admin_tu_name)
try:
_run_lds_configurator_ws(_teardown)
except BaseException as error:
logger.warning(
"[TEARDOWN] [ALERT] LDS Configurator teardown завершился с ошибкой для tuId=%s: %s",
tu_id,
error,
)
finally:
cfg["resolved_tu_id"] = None
cfg["use_lds_configurator"] = False
cfg["admin_tu_name"] = None
8) Пояснения что происходит
# 1) teardown стенда: LDS Configurator + остановка имитатора
try:
group_state = getattr(session.config, "group_state", {})
_run_lds_configurator_teardown_if_needed(group_state)
stand_manager = group_state.get("stand_manager")