test: separate performance budget from e2e gate #46
@@ -41,9 +41,11 @@ Unit specs colocated в `src/**/*.spec.ts`; HTTP/integration — `test/`.
|
|||||||
Полный `npm run verify` включает lint, оба typecheck, Jest и build.
|
Полный `npm run verify` включает lint, оба typecheck, Jest и build.
|
||||||
`npm run test:openapi-contract` — отдельный required check при wire contract change.
|
`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 получает новую временную
|
`npm run test:sqlite` — только auth/cards. Каждая suite получает новую временную
|
||||||
базу со штатными migrations. Прямой Jest без runner отклоняется до DB-запросов.
|
базу со штатными 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`
|
`prisma.config.ts` исключает влияние унаследованного `RUST_LOG=warn/error`
|
||||||
на fresh migration; точная Prisma version принадлежит manifest/lockfile. Подробности и регрессия запуска —
|
на fresh migration; точная Prisma version принадлежит manifest/lockfile. Подробности и регрессия запуска —
|
||||||
[Backend README](../../README.md#реальная-sqlite-и-сохранность-данных).
|
[Backend README](../../README.md#реальная-sqlite-и-сохранность-данных).
|
||||||
|
|||||||
@@ -63,9 +63,12 @@ npm run verify
|
|||||||
Он запускает zero-warning lint,
|
Он запускает zero-warning lint,
|
||||||
application/test typechecks, Jest с покрытием и build. `npm run lint:fix` — отдельная
|
application/test typechecks, Jest с покрытием и build. `npm run lint:fix` — отдельная
|
||||||
записывающая команда. `npm run test:cov` также доступен отдельно; общего числового
|
записывающая команда. `npm run test:cov` также доступен отдельно; общего числового
|
||||||
threshold нет. `npm run test:e2e` отдельно проверяет все HTTP suites на новых базах
|
threshold нет. `npm run test:e2e` отдельно проверяет функциональные HTTP suites
|
||||||
и соответствие генерируемого OpenAPI настроенному приложению. Для полной backend-проверки
|
на новых базах и соответствие генерируемого 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`,
|
Nest 12 поставляется как ESM. Скрипты Jest включают `--experimental-vm-modules`,
|
||||||
включая watch/coverage/debug; SQLite runner включает тот же флаг. TypeScript 6
|
включая watch/coverage/debug; SQLite runner включает тот же флаг. TypeScript 6
|
||||||
@@ -81,7 +84,7 @@ TypeScript 7 требует поддержки со стороны `ts-jest` и
|
|||||||
Новый запуск отменяет устаревший для того же PR/ветки и типа события
|
Новый запуск отменяет устаревший для того же PR/ветки и типа события
|
||||||
(требуется Gitea 1.26+). Ежедневно в 05:47 UTC выполняется только `security`.
|
(требуется Gitea 1.26+). Ежедневно в 05:47 UTC выполняется только `security`.
|
||||||
Job `verify` запускает `npm ci`, генерацию Prisma client,
|
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 записывается в лог.
|
backend и его зависимости; OpenAPI генерируется во время проверки, SHA записывается в лог.
|
||||||
Успешный unit gate не заменяет SQLite/e2e; ошибка любой suite завершает job с FAIL.
|
Успешный unit gate не заменяет SQLite/e2e; ошибка любой suite завершает job с FAIL.
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
"test:cov": "npm test -- --coverage",
|
"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: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: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:sqlite": "node test/sqlite.cjs",
|
||||||
"test:container": "node test/container-smoke.cjs",
|
"test:container": "node test/container-smoke.cjs",
|
||||||
"test:durability": "node test/bank-cards-durability.cjs",
|
"test:durability": "node test/bank-cards-durability.cjs",
|
||||||
|
|||||||
+3
-1
@@ -7,12 +7,13 @@ const cwd = resolve(__dirname, '..');
|
|||||||
const available = readdirSync(__dirname)
|
const available = readdirSync(__dirname)
|
||||||
.filter((name) => name.endsWith('.e2e-spec.ts'))
|
.filter((name) => name.endsWith('.e2e-spec.ts'))
|
||||||
.sort();
|
.sort();
|
||||||
|
const performanceSuites = new Set(['tbank-read-baseline.e2e-spec.ts']);
|
||||||
const requested = process.argv.slice(2);
|
const requested = process.argv.slice(2);
|
||||||
const suites =
|
const suites =
|
||||||
requested.length === 0
|
requested.length === 0
|
||||||
? ['app.e2e-spec.ts', 'bank-cards.e2e-spec.ts']
|
? ['app.e2e-spec.ts', 'bank-cards.e2e-spec.ts']
|
||||||
: requested.length === 1 && requested[0] === '--all'
|
: requested.length === 1 && requested[0] === '--all'
|
||||||
? available
|
? available.filter((suite) => !performanceSuites.has(suite))
|
||||||
: requested;
|
: requested;
|
||||||
if (suites.some((suite) => !available.includes(suite))) {
|
if (suites.some((suite) => !available.includes(suite))) {
|
||||||
throw new Error('Unknown e2e suite');
|
throw new Error('Unknown e2e suite');
|
||||||
@@ -63,6 +64,7 @@ function run(args, env) {
|
|||||||
WL_E2E_DIRECTORY: dir,
|
WL_E2E_DIRECTORY: dir,
|
||||||
NODE_ENV: 'development',
|
NODE_ENV: 'development',
|
||||||
NODE_OPTIONS: '--experimental-vm-modules',
|
NODE_OPTIONS: '--experimental-vm-modules',
|
||||||
|
LOG_LEVEL: 'error',
|
||||||
};
|
};
|
||||||
console.log(`SQLite ${suite}: ${dir}`);
|
console.log(`SQLite ${suite}: ${dir}`);
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user