perf: filter_result_ms не включает таймаут ожидания поиска на сборке «до»

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-29 00:28:30 +04:00
parent 85c544b350
commit 5dc6662767
3 changed files with 19 additions and 4 deletions

View File

@ -69,3 +69,8 @@ export class ByteCounter {
return this.firstBytes;
}
}
/** filter_result_ms: от fill до стабилизации; ответ поиска (если был) не должен быть позже конца; таймаут ожидания (respAt=null) не учитывается. */
export function filterResultMs(startAt: number, stableAt: number, respAt: number | null): number {
return Math.max(stableAt, respAt ?? 0) - startAt;
}

View File

@ -29,7 +29,7 @@ import { attachNetlog } from '../lib/netlog';
import { append, runDir } from '../lib/results';
import { scrollThrough, type Axis } from '../lib/scroll';
import { shouldTrace } from '../lib/trace';
import { ByteCounter, SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR, countPagesRequested, isSvod2SearchUrl, placeholderShare, svod2RespRe } from '../lib/svod2';
import { ByteCounter, SVOD2_DATA_ROW_SELECTOR, SVOD2_PLACEHOLDER_SELECTOR, countPagesRequested, filterResultMs as filterResultMsOf, isSvod2SearchUrl, placeholderShare, svod2RespRe } from '../lib/svod2';
const CONTAINER = '.MuiTableContainer-root'; // MRT: muiTableContainerProps (RealtimeTable.jsx), SummaryTable, Svod2Page
const MIN_ROWS = 20;
@ -233,13 +233,16 @@ async function measure(browser: import('@playwright/test').Browser, o: RunOpts)
const input = page.locator('.MuiInputBase-root:has(.MuiInputAdornment-positionStart) input').first();
const tFilter = Date.now();
// свод 2 «после»: поиск уходит на сервер; нет запроса (сборка «до») - идём дальше
// ожидание ответа идёт параллельно со стабилизацией: таймаут 5 с на «до» в метрику не попадает
let respAt: number | null = null;
const searchResp = t.kind === 'svod2'
? page.waitForResponse((r) => isSvod2SearchUrl(r.url()), { timeout: 5_000 }).catch(() => null)
? page.waitForResponse((r) => isSvod2SearchUrl(r.url()), { timeout: 5_000 }).then(() => { respAt = Date.now(); }, () => {})
: null;
await input.fill('1');
if (searchResp) await searchResp;
stable = await awaitStable(page, 120_000);
if (t.kind === 'svod2') filterResultMs = Date.now() - tFilter;
const stableAt = Date.now();
if (searchResp) await searchResp;
if (t.kind === 'svod2') filterResultMs = filterResultMsOf(tFilter, stableAt, respAt);
effect = (await signature(page)) !== sigBefore;
if (!stable) reason = 'filter did not stabilize in 120s';
else if (!effect) reason = 'filter_no_effect';

View File

@ -6,6 +6,7 @@ import {
isSvod2SearchUrl,
svod2RespRe,
countPagesRequested,
filterResultMs,
SVOD2_DATA_ROW_SELECTOR,
SVOD2_PLACEHOLDER_SELECTOR,
} from '../lib/svod2.ts';
@ -62,3 +63,9 @@ test('селекторы', () => {
assert.equal(SVOD2_DATA_ROW_SELECTOR, 'tbody tr:not([data-svod2-placeholder])');
assert.equal(SVOD2_PLACEHOLDER_SELECTOR, 'tbody tr[data-svod2-placeholder]');
});
test('filterResultMs: нет запроса поиска - только стабилизация', () => {
assert.equal(filterResultMs(1000, 1700, null), 700);
assert.equal(filterResultMs(1000, 1700, 1200), 700);
assert.equal(filterResultMs(1000, 1700, 1900), 900);
});