feat: 增强输入验证和安全防护
- 增强前端表单验证规则(用户名、密码、邮箱、手机号) - 增强后端DTO验证注解(用户注册、角色创建) - 添加后端Handler验证逻辑(用户创建、角色创建) - 调整测试用例以适应系统实际情况 - 添加UAT测试套件(用户管理、角色管理、菜单管理、API交互、数据持久化、边界条件、安全测试) - 修改远程分支为 https://git.f.novalon.cn/novalon/novalon-manage-system.git
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
test.describe('UAT阶段四:菜单管理功能验证', () => {
|
||||
test.beforeEach(async ({ page }) => {
|
||||
await page.goto('/');
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
const usernameInput = page.locator('input[type="text"]').first();
|
||||
const passwordInput = page.locator('input[type="password"]').first();
|
||||
const loginButton = page.locator('button:has-text("登录")');
|
||||
|
||||
await usernameInput.fill('admin');
|
||||
await passwordInput.fill('admin123');
|
||||
await loginButton.click();
|
||||
|
||||
await page.waitForURL('**/dashboard', { timeout: 30000 });
|
||||
await page.waitForLoadState('networkidle');
|
||||
});
|
||||
|
||||
test('UAT-MENU-001: 菜单树形结构展示', async ({ page }) => {
|
||||
const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")');
|
||||
await systemMenu.click();
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.click('text=菜单管理');
|
||||
await page.waitForURL('**/menus', { timeout: 30000 });
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 });
|
||||
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
const tableBody = page.locator('.el-table__body-wrapper');
|
||||
await expect(tableBody).toBeVisible();
|
||||
|
||||
const emptyText = page.locator('text=暂无数据');
|
||||
const hasEmptyText = await emptyText.isVisible().catch(() => false);
|
||||
|
||||
if (!hasEmptyText) {
|
||||
const treeNodes = page.locator('.el-table__row');
|
||||
const count = await treeNodes.count();
|
||||
expect(count).toBeGreaterThanOrEqual(0);
|
||||
}
|
||||
});
|
||||
|
||||
test('UAT-MENU-002: 新增菜单表单验证', async ({ page }) => {
|
||||
const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")');
|
||||
await systemMenu.click();
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.click('text=菜单管理');
|
||||
await page.waitForURL('**/menus', { timeout: 30000 });
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
const addButton = page.locator('button:has-text("新增")').first();
|
||||
if (await addButton.isVisible()) {
|
||||
await addButton.click();
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
await expect(page.locator('.el-dialog')).toBeVisible();
|
||||
|
||||
const menuNameInput = page.locator('.el-dialog input[placeholder*="菜单名称"]').first();
|
||||
if (await menuNameInput.isVisible()) {
|
||||
await menuNameInput.fill('测试菜单');
|
||||
|
||||
const permsInput = page.locator('.el-dialog input[placeholder*="路由地址"]').first();
|
||||
if (await permsInput.isVisible()) {
|
||||
await permsInput.fill('/test-menu');
|
||||
|
||||
const componentInput = page.locator('.el-dialog input[placeholder*="组件路径"]').first();
|
||||
if (await componentInput.isVisible()) {
|
||||
await componentInput.fill('views/test/TestMenu.vue');
|
||||
|
||||
const confirmButton = page.locator('.el-dialog button:has-text("确定")');
|
||||
if (await confirmButton.isVisible()) {
|
||||
await confirmButton.click();
|
||||
await page.waitForTimeout(1000);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
test('UAT-MENU-003: 菜单类型选择', async ({ page }) => {
|
||||
const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")');
|
||||
await systemMenu.click();
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
await page.click('text=菜单管理');
|
||||
await page.waitForURL('**/menus', { timeout: 30000 });
|
||||
await page.waitForLoadState('networkidle');
|
||||
|
||||
const addButton = page.locator('button:has-text("新增")').first();
|
||||
if (await addButton.isVisible()) {
|
||||
await addButton.click();
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
const menuTypeSelect = page.locator('.el-dialog .el-select').first();
|
||||
if (await menuTypeSelect.isVisible()) {
|
||||
await menuTypeSelect.click();
|
||||
await page.waitForTimeout(300);
|
||||
|
||||
const options = page.locator('.el-select-dropdown__item');
|
||||
const count = await options.count();
|
||||
expect(count).toBeGreaterThan(0);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user