From 325ac2f913f7259c56d4a8fee3e8cd317fb6074d Mon Sep 17 00:00:00 2001 From: zichun Date: Fri, 15 May 2026 17:37:46 +0800 Subject: [PATCH] test(frontend): Playwright E2E spec + config (fixme 标记,留待手工验收) --- frontend/playwright.config.ts | 21 +++++++++++++++++++++ frontend/tests/e2e/login.spec.ts | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 0 deletions(-) create mode 100644 frontend/playwright.config.ts create mode 100644 frontend/tests/e2e/login.spec.ts diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts new file mode 100644 index 0000000..543fc73 --- /dev/null +++ b/frontend/playwright.config.ts @@ -0,0 +1,21 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests/e2e', + timeout: 30000, + retries: 0, + use: { + baseURL: 'http://localhost:5173', + headless: true, + trace: 'on-first-retry', + }, + webServer: { + command: 'npm run dev', + url: 'http://localhost:5173', + reuseExistingServer: !process.env.CI, + timeout: 60000, + }, + projects: [ + { name: 'chromium', use: { ...devices['Desktop Chrome'] } }, + ], +}); diff --git a/frontend/tests/e2e/login.spec.ts b/frontend/tests/e2e/login.spec.ts new file mode 100644 index 0000000..a2a709c --- /dev/null +++ b/frontend/tests/e2e/login.spec.ts @@ -0,0 +1,39 @@ +import { test, expect } from '@playwright/test'; + +/** + * E2E 测试需要: + * - 后端运行在 :9090(cd backend && mvn spring-boot:run) + * - 前端 dev server :5173 由 playwright.config webServer 自动起 + * - `npx playwright install chromium` 完成浏览器 binary 下载 + * + * 本 plan Task 10 当前 .fixme(),FE 完成 review 时纳入 nice-to-have; + * 由开发者手动 `npx playwright install && npm run e2e` 跑一次完整链路验收。 + */ + +test.fixme('successLogin_redirectsToUsers', async ({ page }) => { + await page.goto('/login'); + await page.getByPlaceholder('请输入你的用户名').fill('alice'); + await page.getByPlaceholder('请输入你的密码').fill('Password1!'); + await page.getByTestId('login-submit').click(); + await expect(page).toHaveURL(/.*\/users/); +}); + +test.fixme('badPassword_showsError', async ({ page }) => { + await page.goto('/login'); + await page.getByPlaceholder('请输入你的用户名').fill('alice'); + await page.getByPlaceholder('请输入你的密码').fill('WRONG'); + await page.getByTestId('login-submit').click(); + await expect(page.getByText('用户名或密码错误')).toBeVisible(); +}); + +test.fixme('unknownCompany_showsError', async ({ page }) => { + await page.goto('/login'); + // 通过 evaluate 把 form value 改成不存在的 companyCode + await page.evaluate(() => { + // 实际 UI 操作:通过 AntD Select 选不存在的项;这里 spec 留 placeholder + }); + await page.getByPlaceholder('请输入你的用户名').fill('alice'); + await page.getByPlaceholder('请输入你的密码').fill('Password1!'); + await page.getByTestId('login-submit').click(); + await expect(page.getByText('公司不存在或已删除')).toBeVisible(); +}); -- libgit2 0.22.2