From 1876c5600884057bccf0c2c3223592e70c364f9c Mon Sep 17 00:00:00 2001 From: Stev_Wang <304865932@qq.com> Date: Mon, 2 Nov 2026 17:21:55 +0800 Subject: [PATCH] =?UTF-8?q?test(ci):=20=E5=A2=9E=E5=8A=A0=20Playwright=20?= =?UTF-8?q?=E5=86=92=E7=83=9F=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 覆盖登录进入工作台、403/404 错误页、模块切换与面包屑联动,并接入 CI 产物归档。 --- e2e/smoke.spec.ts | 38 ++++++++++++++++++++++++++++++++++++++ playwright.config.ts | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 e2e/smoke.spec.ts create mode 100644 playwright.config.ts diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts new file mode 100644 index 0000000..d69ff94 --- /dev/null +++ b/e2e/smoke.spec.ts @@ -0,0 +1,38 @@ +import { expect, type Page, test } from '@playwright/test'; + +async function signIn(page: Page): Promise { + await page.goto('/login'); + await page.getByPlaceholder('请输入账号或邮箱').fill('admin'); + await page.getByPlaceholder('请输入密码').fill('demo1234'); + await page.getByTestId('login-submit').click(); + await expect(page.getByTestId('app-shell')).toBeVisible(); +} + +test('登录页打开并进入工作台', async ({ page }) => { + await page.goto('/login'); + await expect(page.getByRole('heading', { name: '登录灵犀' })).toBeVisible(); + await signIn(page); + await expect(page).toHaveURL('/'); + await expect(page.getByRole('heading', { name: '工作台', exact: true })).toBeVisible(); + await expect(page.getByRole('navigation', { name: '模块导航' })).toBeVisible(); +}); + +test('403 页可演示', async ({ page }) => { + await page.goto('/403'); + await expect(page.getByTestId('error-403')).toBeVisible(); + await expect(page.getByRole('heading', { name: '没有访问权限' })).toBeVisible(); +}); + +test('模块切换与侧边栏、面包屑联动', async ({ page }) => { + await signIn(page); + await page.getByRole('button', { name: '素材', exact: true }).click(); + await expect(page).toHaveURL(/\/material/); + await page.getByRole('link', { name: '快筛', exact: true }).click(); + await expect(page.getByRole('heading', { name: '快筛' })).toBeVisible(); + await expect(page.getByRole('navigation', { name: '面包屑' })).toContainText('素材'); +}); + +test('未知路由展示 404', async ({ page }) => { + await page.goto('/404'); + await expect(page.getByTestId('error-404')).toBeVisible(); +}); diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..25ccf46 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,36 @@ +import { defineConfig, devices } from '@playwright/test'; + +const channel = process.env.CI ? undefined : 'chrome'; + +export default defineConfig({ + testDir: './e2e', + timeout: 60_000, + expect: { timeout: 10_000 }, + fullyParallel: true, + forbidOnly: Boolean(process.env.CI), + retries: process.env.CI ? 2 : 0, + reporter: process.env.CI + ? [['list'], ['html', { open: 'never' }], ['junit', { outputFile: 'test-results/e2e.xml' }]] + : [['list'], ['html', { open: 'never' }]], + use: { + baseURL: 'http://127.0.0.1:4173', + trace: 'on-first-retry', + screenshot: 'only-on-failure', + channel, + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'], channel }, + }, + ], + webServer: { + command: 'node node_modules/vite/bin/vite.js preview --host 127.0.0.1 --port 4173 --strictPort', + cwd: 'apps/web', + url: 'http://127.0.0.1:4173/login', + reuseExistingServer: false, + timeout: 60_000, + stdout: 'ignore', + stderr: 'pipe', + }, +});