From 01e2de6a041e75da739b8288d055b1dce82d38a2 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Wed, 7 Oct 2026 16:35:23 +0300 Subject: [PATCH] test: separate performance budget from e2e gate --- .ai/conventions/testing.md | 4 +++- README.md | 11 +++++++---- package.json | 1 + test/sqlite.cjs | 4 +++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.ai/conventions/testing.md b/.ai/conventions/testing.md index 69dd122..569ae9e 100644 --- a/.ai/conventions/testing.md +++ b/.ai/conventions/testing.md @@ -41,9 +41,11 @@ Unit specs colocated в `src/**/*.spec.ts`; HTTP/integration — `test/`. Полный `npm run verify` включает lint, оба typecheck, Jest и build. `npm run test:openapi-contract` — отдельный required check при wire contract change. -`npm run test:e2e` запускает все HTTP suites через изолированный SQLite runner; +`npm run test:e2e` запускает функциональные HTTP suites через изолированный SQLite runner; `npm run test:sqlite` — только auth/cards. Каждая suite получает новую временную базу со штатными migrations. Прямой Jest без runner отклоняется до DB-запросов. +Большой latency/load benchmark запускается отдельно через `npm run test:performance`: +его абсолютный wall-clock budget не является merge gate на shared runner. `prisma.config.ts` исключает влияние унаследованного `RUST_LOG=warn/error` на fresh migration; точная Prisma version принадлежит manifest/lockfile. Подробности и регрессия запуска — [Backend README](../../README.md#реальная-sqlite-и-сохранность-данных). diff --git a/README.md b/README.md index ce3cc41..400e68b 100644 --- a/README.md +++ b/README.md @@ -63,9 +63,12 @@ npm run verify Он запускает zero-warning lint, application/test typechecks, Jest с покрытием и build. `npm run lint:fix` — отдельная записывающая команда. `npm run test:cov` также доступен отдельно; общего числового -threshold нет. `npm run test:e2e` отдельно проверяет все HTTP suites на новых базах -и соответствие генерируемого OpenAPI настроенному приложению. Для полной backend-проверки -выполните обе команды. +threshold нет. `npm run test:e2e` отдельно проверяет функциональные HTTP suites +на новых базах и соответствие генерируемого OpenAPI настроенному приложению. +Для полной backend-проверки выполните обе команды. Тяжёлый synthetic benchmark +с 300 000 операций и 1 000 000 свечей запускается отдельно командой +`npm run test:performance`: его wall-clock budget зависит от выделенного runner CPU +и не является функциональным merge gate. Nest 12 поставляется как ESM. Скрипты Jest включают `--experimental-vm-modules`, включая watch/coverage/debug; SQLite runner включает тот же флаг. TypeScript 6 @@ -81,7 +84,7 @@ TypeScript 7 требует поддержки со стороны `ts-jest` и Новый запуск отменяет устаревший для того же PR/ветки и типа события (требуется Gitea 1.26+). Ежедневно в 05:47 UTC выполняется только `security`. Job `verify` запускает `npm ci`, генерацию Prisma client, -`npm run verify` и `npm run test:e2e`. Используется только checkout +`npm run verify` и функциональный `npm run test:e2e`. Используется только checkout backend и его зависимости; OpenAPI генерируется во время проверки, SHA записывается в лог. Успешный unit gate не заменяет SQLite/e2e; ошибка любой suite завершает job с FAIL. diff --git a/package.json b/package.json index 0efe5b0..caee37e 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "test:cov": "npm test -- --coverage", "test:debug": "node --experimental-vm-modules --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "npm run build && node test/sqlite.cjs --all", + "test:performance": "npm run build && node test/sqlite.cjs tbank-read-baseline.e2e-spec.ts", "test:sqlite": "node test/sqlite.cjs", "test:container": "node test/container-smoke.cjs", "test:durability": "node test/bank-cards-durability.cjs", diff --git a/test/sqlite.cjs b/test/sqlite.cjs index 6d13fe0..e0efc2f 100644 --- a/test/sqlite.cjs +++ b/test/sqlite.cjs @@ -7,12 +7,13 @@ const cwd = resolve(__dirname, '..'); const available = readdirSync(__dirname) .filter((name) => name.endsWith('.e2e-spec.ts')) .sort(); +const performanceSuites = new Set(['tbank-read-baseline.e2e-spec.ts']); const requested = process.argv.slice(2); const suites = requested.length === 0 ? ['app.e2e-spec.ts', 'bank-cards.e2e-spec.ts'] : requested.length === 1 && requested[0] === '--all' - ? available + ? available.filter((suite) => !performanceSuites.has(suite)) : requested; if (suites.some((suite) => !available.includes(suite))) { throw new Error('Unknown e2e suite'); @@ -63,6 +64,7 @@ function run(args, env) { WL_E2E_DIRECTORY: dir, NODE_ENV: 'development', NODE_OPTIONS: '--experimental-vm-modules', + LOG_LEVEL: 'error', }; console.log(`SQLite ${suite}: ${dir}`); try { -- 2.54.0