From 9629fee975a60c9685b66fef78354cb10d102429 Mon Sep 17 00:00:00 2001 From: Alan Agius <17563226+alan-agius4@users.noreply.github.com> Date: Tue, 18 Nov 2025 09:34:39 +0000 Subject: [PATCH] test: improve vitest e2e test stability and performance - Use Chrome binary from `rules_browsers` for Playwright in Vitest browser tests for hermetic testing and avoids re-downloads of chrome. - Batch `ng generate` commands in e2e tests to improve performance. - Remove now redundant chromium install commands from e2e tests. --- .../e2e/tests/vitest/browser-no-globals.ts | 4 +- .../e2e/tests/vitest/browser-playwright.ts | 4 +- .../tests/vitest/larger-project-coverage.ts | 69 +++++++++++-------- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/tests/legacy-cli/e2e/tests/vitest/browser-no-globals.ts b/tests/legacy-cli/e2e/tests/vitest/browser-no-globals.ts index 21135ff42f83..b25f8168c5f7 100644 --- a/tests/legacy-cli/e2e/tests/vitest/browser-no-globals.ts +++ b/tests/legacy-cli/e2e/tests/vitest/browser-no-globals.ts @@ -1,7 +1,7 @@ import assert from 'node:assert/strict'; import { writeFile } from '../../utils/fs'; import { installPackage } from '../../utils/packages'; -import { exec, ng } from '../../utils/process'; +import { ng } from '../../utils/process'; import { applyVitestBuilder } from '../../utils/vitest'; /** @@ -14,8 +14,6 @@ export default async function (): Promise { await installPackage('playwright@1'); await installPackage('@vitest/browser-playwright@4'); - await exec('npx', 'playwright', 'install', 'chromium', '--only-shell'); - await writeFile( 'src/app/app.spec.ts', ` diff --git a/tests/legacy-cli/e2e/tests/vitest/browser-playwright.ts b/tests/legacy-cli/e2e/tests/vitest/browser-playwright.ts index 9b22b81736e4..fa9ec43aabf3 100644 --- a/tests/legacy-cli/e2e/tests/vitest/browser-playwright.ts +++ b/tests/legacy-cli/e2e/tests/vitest/browser-playwright.ts @@ -1,6 +1,6 @@ import assert from 'node:assert/strict'; import { applyVitestBuilder } from '../../utils/vitest'; -import { exec, ng } from '../../utils/process'; +import { ng } from '../../utils/process'; import { installPackage } from '../../utils/packages'; import { writeFile } from '../../utils/fs'; @@ -8,8 +8,6 @@ export default async function (): Promise { await applyVitestBuilder(); await installPackage('playwright@1'); await installPackage('@vitest/browser-playwright@4'); - await exec('npx', 'playwright', 'install', 'chromium', '--only-shell'); - await ng('generate', 'component', 'my-comp'); await writeFile( diff --git a/tests/legacy-cli/e2e/tests/vitest/larger-project-coverage.ts b/tests/legacy-cli/e2e/tests/vitest/larger-project-coverage.ts index 17e642014d8d..4b5d5cc72bfa 100644 --- a/tests/legacy-cli/e2e/tests/vitest/larger-project-coverage.ts +++ b/tests/legacy-cli/e2e/tests/vitest/larger-project-coverage.ts @@ -2,7 +2,6 @@ import { ng } from '../../utils/process'; import { applyVitestBuilder } from '../../utils/vitest'; import assert from 'node:assert'; import { installPackage } from '../../utils/packages'; -import { exec } from '../../utils/process'; import { updateJsonFile } from '../../utils/project'; import { readFile } from '../../utils/fs'; @@ -27,33 +26,7 @@ export default async function () { const artifactCount = 100; const initialTestCount = 1; - const generatedFiles: string[] = []; - - // Generate a mix of components, services, and pipes - for (let i = 0; i < artifactCount; i++) { - const type = i % 3; - const name = `test-artifact${i}`; - let generateType; - let fileSuffix; - - switch (type) { - case 0: - generateType = 'component'; - fileSuffix = '.ts'; - break; - case 1: - generateType = 'service'; - fileSuffix = '.ts'; - break; - default: - generateType = 'pipe'; - fileSuffix = '-pipe.ts'; - break; - } - - await ng('generate', generateType, name, '--skip-tests=false'); - generatedFiles.push(`${name}${fileSuffix}`); - } + const generatedFiles = await generateArtifactsInBatches(artifactCount); const totalTests = initialTestCount + artifactCount; const expectedMessage = new RegExp(`${totalTests} passed`); @@ -78,7 +51,6 @@ export default async function () { // Setup for browser mode await installPackage('playwright@1'); await installPackage('@vitest/browser-playwright@4'); - await exec('npx', 'playwright', 'install', 'chromium', '--only-shell'); // Run tests in browser mode with coverage const { stdout: browserStdout } = await ng( @@ -102,3 +74,42 @@ export default async function () { assert.ok(found, `Expected ${file} to be in the browser coverage report.`); } } + +async function generateArtifactsInBatches(artifactCount: number): Promise { + const BATCH_SIZE = 5; + const generatedFiles: string[] = []; + let commands: Promise[] = []; + + for (let i = 0; i < artifactCount; i++) { + const type = i % 3; + const name = `test-artifact-${i}`; + + let generateType: string; + let fileSuffix: string; + + switch (type) { + case 0: + generateType = 'component'; + fileSuffix = '.ts'; + break; + case 1: + generateType = 'service'; + fileSuffix = '.ts'; + break; + default: + generateType = 'pipe'; + fileSuffix = '-pipe.ts'; + break; + } + + commands.push(ng('generate', generateType, name, '--skip-tests=false')); + generatedFiles.push(`${name}${fileSuffix}`); + + if (commands.length === BATCH_SIZE || i === artifactCount - 1) { + await Promise.all(commands); + commands = []; + } + } + + return generatedFiles; +}