From b65ea939840947fbead0681ace3c1d51325e6906 Mon Sep 17 00:00:00 2001 From: XingfenD Date: Tue, 15 Sep 2026 12:00:45 +0800 Subject: [PATCH] test(frontend): playwright e2e scaffolding (config + scripts) --- .gitignore | 3 ++ frontend/package-lock.json | 60 +++++++++++++++++++++++++++++++++++ frontend/package.json | 4 +++ frontend/playwright.config.ts | 11 +++++++ 4 files changed, 78 insertions(+) create mode 100644 frontend/playwright.config.ts diff --git a/.gitignore b/.gitignore index 46229b5..a6e6f37 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ tasks/ .playwright*/ frontend/tsconfig.tsbuildinfo +playwright-report/ +test-results/ +dist-stats/ diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 4017c27..43e2238 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -25,7 +25,9 @@ "tw-animate-css": "^1.4.0" }, "devDependencies": { + "@axe-core/playwright": "^4.13.0", "@eslint/js": "^10.0.1", + "@playwright/test": "^1.63.0", "@tailwindcss/vite": "^4.3.3", "@testing-library/dom": "^10.4.2", "@testing-library/jest-dom": "^7.0.1", @@ -126,6 +128,19 @@ "node": "20 || >=22" } }, + "node_modules/@axe-core/playwright": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.13.0.tgz", + "integrity": "sha512-6YLx+kxXu5GJceG4ozFg+33a2EMTdjYwWGloJ3sb9Kta5pp+ZNS53uxGVog5JetIY8s++P5UrtX+cri+u0VAVg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "axe-core": "~4.13.0" + }, + "peerDependencies": { + "playwright-core": ">= 1.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", @@ -2467,6 +2482,22 @@ "url": "https://github.com/sponsors/oxc-project" } }, + "node_modules/@playwright/test": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz", + "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.63.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/@radix-ui/number": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.3.tgz", @@ -9556,6 +9587,35 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/playwright": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.63.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/playwright-core": { + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 85c71fb..d80dc3b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,6 +6,8 @@ "scripts": { "test": "vitest run", "dev": "vite", + "e2e": "playwright test", + "e2e:ui": "playwright test --ui", "build": "tsc --noEmit && vite build", "preview": "vite preview", "check": "tsc --noEmit && eslint . && prettier --check . && vitest run && vite build", @@ -36,7 +38,9 @@ "tw-animate-css": "^1.4.0" }, "devDependencies": { + "@axe-core/playwright": "^4.13.0", "@eslint/js": "^10.0.1", + "@playwright/test": "^1.63.0", "@tailwindcss/vite": "^4.3.3", "@testing-library/dom": "^10.4.2", "@testing-library/jest-dom": "^7.0.1", diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts new file mode 100644 index 0000000..2cd6cae --- /dev/null +++ b/frontend/playwright.config.ts @@ -0,0 +1,11 @@ +import { defineConfig, devices } from "@playwright/test"; + +export default defineConfig({ + testDir: "e2e", + timeout: 60_000, + use: { + baseURL: process.env.E2E_BASE_URL ?? "http://localhost:5173", + trace: "retain-on-failure", + }, + projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }], +});