From 43ed9ba142355e3e0eed2e5cdd5d04ab30572206 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Wed, 13 May 2026 14:45:14 +0300 Subject: [PATCH] =?UTF-8?q?feat(web-test):=20M7.5=20=E2=80=94=20title=20sl?= =?UTF-8?q?ide=20=D0=B2=20beforeEach=20=D0=B4=D0=BB=D1=8F=20--record?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _hooks.mjs v0.4: beforeEach под условием ctx.isRecording() показывает title slide с testInfo.name + displayName первичного контекста как subtitle, ждёт 1.5с через ctx.wait() и убирает. В обычном регрессе (без --record) — ветка скипается, overhead ноль. Под --record: 01-navigation 12.1s → 13.9s (+1.8с на слайд). Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/web-test/_hooks.mjs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/tests/web-test/_hooks.mjs b/tests/web-test/_hooks.mjs index 52a21416..f625fb8c 100644 --- a/tests/web-test/_hooks.mjs +++ b/tests/web-test/_hooks.mjs @@ -1,4 +1,4 @@ -// _hooks.mjs v0.3 — автономный тестовый стенд для web-test + testlevel-хуки +// _hooks.mjs v0.4 — автономный тестовый стенд для web-test + testlevel-хуки + title slides // // `prepare()` поднимает изолированный стенд по smart-логике: // 1) Если нужно пересоздавать БД (config-rebuild или --reload-data) — web-stop @@ -324,9 +324,31 @@ export async function afterAll(_ctx) { _state.events.push('afterAll'); } +// Длительность показа title slide перед телом теста (секунды). Эмпирически +// 1.5с хватает чтобы в записанном видео слайд успел зацепиться кадром, +// и не слишком долго на тестах вроде 14-routing (~2.5с целиком). +const TITLE_SLIDE_SEC = 1.5; + export async function beforeEach(ctx) { _state.beforeEach++; _state.events.push(`beforeEach:${ctx.testInfo?.file || '?'}`); + + // M7.5: title slide для `--record`-прогонов. Под обычным регрессом + // (isRecording === false) пропускаем — лишние ~1.5s × N тестов + // не нужны. + if (ctx.isRecording?.()) { + const info = ctx.testInfo; + const primary = info.contexts?.[info.primaryContext]; + const subtitle = primary?.displayName || ''; + try { + await ctx.showTitleSlide(info.name, { subtitle }); + await ctx.wait(TITLE_SLIDE_SEC); + await ctx.hideTitleSlide(); + } catch { + // Не валим тест из-за оформления — recorder/page-state могут + // не сложиться в редких сценариях (race на старте контекста). + } + } } export async function afterEach(ctx) {