Загрузка данных
from utils.helpers.pytest_auth import (
clear_suite_auth,
ensure_auth_for_fixture,
ensure_suite_auth,
init_http_stand_client,
init_ws_stand_client,
)
from utils.helpers.pytest_skip_utils import (
decorate_skipped_test_in_allure,
get_skip_reason_marker,
is_marked_as_skipped,
resolve_skip_reason,
)
4. Сортирует тесты по test_suite_name для группировки по наборам данных
5. Помечает маркером skip_reason тесты, у которых в конфигурации теста задан skip_reason (CaseMarkers.skip_reason)
# Конфиг теста = None - исключаем тест из прогона
deselected_items.append(item)
continue
# Скип по причине из конфигурации теста: тест остаётся в прогоне, но будет пропущен
# фикстурой skip_reason_guard и попадёт в отчёт как skipped с причиной
if skip_reason := resolve_skip_reason(test_config):
item.add_marker(pytest.mark.skip_reason(reason=skip_reason))
logger.info("[SKIP] %s: %s", item.nodeid, skip_reason)
link_type="tms",
)
@pytest.fixture(autouse=True)
def skip_reason_guard(request, allure_suite_hierarchy, allure_tms_link):
"""
Скипает тест, если для него задан skip_reason в конфигурации теста (CaseMarkers.skip_reason).
Порядок фикстур важен, поэтому зависимости запрошены явно:
- allure_suite_hierarchy и allure_tms_link должны отработать ДО скипа, иначе в отчёте
потеряются группировка по набору данных и линк на тест-кейс TestOps;
- require_suite_infra и offset_wait зависят от этой фикстуры, чтобы скипнутый тест
не ждал свой offset и не подменял причину скипа сообщением об инфраструктуре.
"""
if skip_reason := get_skip_reason_marker(request.node):
decorate_skipped_test_in_allure(request.node, skip_reason)
pytest.skip(skip_reason)
# skip_reason_guard в аргументах require_suite_infra/offset_wait нужен только для порядка фикстур:
# скип теста должен сработать до проверки готовности инфраструктуры
@pytest.fixture(autouse=True)
def require_suite_infra(request, skip_reason_guard):
"""
Пропускает тесты набора, если 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.skip("[SETUP] [ERROR] Набор пропущен: инфраструктура не готова")
# skip_reason_guard в аргументах offset_wait нужен только для порядка фикстур:
# скипнутый тест не должен ждать свой offset
@pytest.fixture(autouse=True)
def offset_wait(request, skip_reason_guard):
- Извлекает все значения @pytest.mark.offset(...) (в минутах)
- Offset скипнутых тестов (маркер skip_reason) не учитывается: они не выполняются
- Если offsets найдены: возвращает max(offsets) + IMITATOR_FINISH_DELAY задержка остановки имитатора
- Иначе: если у текущего item есть @pytest.mark.imitator_duration — используется как fallback и логируется
- Если ничего не найдено — pytest.fail с понятным текстом
"""
suite_items = [
suite_item
for suite_item in item.session.items
if (marker := suite_item.get_closest_marker("test_suite_name")) and marker.args[0] == current_test_suite
]
offsets = []
for suite_item in suite_items:
# Скипнутый тест не выполняется - ждать его offset не нужно
if is_marked_as_skipped(suite_item):
continue
offset_marker = suite_item.get_closest_marker("offset")