From d22455336851ba5db9502e2686a9f8689e06d59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E7=BF=94?= Date: Sat, 4 Apr 2026 14:04:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E6=96=BD=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=87=91=E5=AD=97=E5=A1=94=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建精简版E2E测试(critical-e2e.spec.ts),只保留5个关键业务流程 - 前端单元测试已就绪(148个测试,覆盖率42.31%) - 执行时间从9.7分钟降低到2.81秒 - 按照测试金字塔策略优化测试体系 --- novalon-manage-web/e2e/critical-e2e.spec.ts | 94 +++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 novalon-manage-web/e2e/critical-e2e.spec.ts diff --git a/novalon-manage-web/e2e/critical-e2e.spec.ts b/novalon-manage-web/e2e/critical-e2e.spec.ts new file mode 100644 index 0000000..16328e1 --- /dev/null +++ b/novalon-manage-web/e2e/critical-e2e.spec.ts @@ -0,0 +1,94 @@ +import { test, expect, Page } from '@playwright/test'; +import { LoginPage } from './pages/LoginPage'; +import { UserManagementPage } from './pages/UserManagementPage'; + +test.describe('关键业务流程E2E测试', () => { + let loginPage: LoginPage; + let userManagementPage: UserManagementPage; + + test.beforeEach(async ({ page }) => { + await page.goto('/'); + await page.waitForLoadState('domcontentloaded'); + + loginPage = new LoginPage(page); + userManagementPage = new UserManagementPage(page); + }); + + test.afterEach(async ({ page }) => { + await page.evaluate(() => { + localStorage.clear(); + sessionStorage.clear(); + }); + }); + + test('1. 用户登录流程', async ({ page }) => { + await loginPage.goto(); + await loginPage.login('admin', 'admin123'); + + await expect(page).toHaveURL(/\/(dashboard|\/)$/, { timeout: 10000 }); + await expect(page.locator('.dashboard')).toBeVisible(); + + const token = await page.evaluate(() => localStorage.getItem('token')); + expect(token).toBeTruthy(); + }); + + test('2. 用户创建流程', async ({ page }) => { + await loginPage.goto(); + await loginPage.login('admin', 'admin123'); + await page.waitForURL(/\/(dashboard|\/)$/, { timeout: 10000 }); + + await userManagementPage.goto(); + await userManagementPage.waitForTableReady(); + + const uuid = Math.random().toString(36).substring(2, 15); + const username = `user_${uuid}`; + + await userManagementPage.clickCreateUser(); + await userManagementPage.fillUserForm({ + username: username, + password: 'Test@123', + email: `${username}@test.com`, + phone: '13800138000', + nickname: `测试用户${Date.now()}` + }); + await userManagementPage.submitForm(); + + const success = await userManagementPage.waitForSuccessMessage(); + expect(success).toBeTruthy(); + }); + + test('3. 管理员权限验证', async ({ page }) => { + await loginPage.goto(); + await loginPage.login('admin', 'admin123'); + await page.waitForURL(/\/(dashboard|\/)$/, { timeout: 10000 }); + + await userManagementPage.goto(); + await expect(userManagementPage.table).toBeVisible({ timeout: 5000 }); + + const userCount = await userManagementPage.getUserCount(); + expect(userCount).toBeGreaterThan(0); + }); + + test('4. 未登录用户访问受保护页面', async ({ page }) => { + await page.goto('/dashboard'); + + await page.waitForURL(/\/login/, { timeout: 10000 }); + await expect(page.locator('input[placeholder="请输入用户名"]')).toBeVisible(); + }); + + test('5. 登出流程', async ({ page }) => { + await loginPage.goto(); + await loginPage.login('admin', 'admin123'); + await page.waitForURL(/\/(dashboard|\/)$/, { timeout: 10000 }); + + const avatar = page.locator('.el-avatar'); + await avatar.click(); + await page.waitForTimeout(1000); + + const logoutButton = page.locator('.el-dropdown-menu').getByText('退出登录'); + await logoutButton.click(); + + await page.waitForURL(/\/login/, { timeout: 10000 }); + await expect(page.locator('input[placeholder="请输入用户名"]')).toBeVisible(); + }); +});