af44c23f21
- 移除旧的测试套件和UAT测试文件 - 更新密码编码器配置使用BCrypt strength=12 - 添加用户角色关联表和相关服务 - 优化前端日期显示格式 - 清理无用资源和配置文件 - 增强测试数据管理和清理功能
833 lines
31 KiB
TypeScript
833 lines
31 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import { LoginPage } from './pages/LoginPage';
|
|
import { DashboardPage } from './pages/DashboardPage';
|
|
import { UserManagementPage } from './pages/UserManagementPage';
|
|
import { RoleManagementPage } from './pages/RoleManagementPage';
|
|
import { MenuManagementPage } from './pages/MenuManagementPage';
|
|
import { SystemConfigPage } from './pages/SystemConfigPage';
|
|
import { FileManagementPage } from './pages/FileManagementPage';
|
|
import { OperationLogPage } from './pages/OperationLogPage';
|
|
import { NotificationPage } from './pages/NotificationPage';
|
|
import { DictionaryManagementPage } from './pages/DictionaryManagementPage';
|
|
import { TestDataCleanup } from './utils/TestDataCleanup';
|
|
|
|
test.describe('UAT用户验收测试', () => {
|
|
let testDataCleanup: TestDataCleanup;
|
|
|
|
test.beforeEach(async ({ page }) => {
|
|
testDataCleanup = new TestDataCleanup(page);
|
|
});
|
|
|
|
test.afterEach(async ({ page }) => {
|
|
await testDataCleanup.cleanupAll();
|
|
});
|
|
|
|
test('UAT-001: 用户注册与首次登录场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const userManagementPage = new UserManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 管理员登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 创建新用户账号', async () => {
|
|
await dashboardPage.navigateToUserManagement();
|
|
await userManagementPage.clickCreateUser();
|
|
|
|
const userData = {
|
|
username: `newuser_${timestamp}`,
|
|
nickname: `新员工${timestamp}`,
|
|
email: `newuser_${timestamp}@example.com`,
|
|
phone: '13800138000',
|
|
password: 'Test123!@#',
|
|
confirmPassword: 'Test123!@#',
|
|
};
|
|
|
|
await userManagementPage.fillUserForm(userData);
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
|
|
testDataCleanup.trackUser(userData.username);
|
|
});
|
|
|
|
await test.step('3. 设置初始密码', async () => {
|
|
await userManagementPage.editUser(1);
|
|
const dialog = page.locator('.el-dialog');
|
|
const passwordInput = dialog.locator('.el-form-item').filter({ hasText: '密码' }).locator('input[type="password"]');
|
|
await passwordInput.fill('NewPass123!@#');
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('4. 分配基本角色', async () => {
|
|
await userManagementPage.editUser(1);
|
|
await page.click('.role-select');
|
|
await page.click('option:has-text("普通用户")');
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 新用户使用初始密码登录', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login(`newuser_${timestamp}`, 'NewPass123!@#');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('6. 验证密码修改提示', async () => {
|
|
await expect(page.locator('.password-change-notice')).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 修改密码', async () => {
|
|
await dashboardPage.navigateToProfile();
|
|
await page.fill('input[name="oldPassword"]', 'NewPass123!@#');
|
|
await page.fill('input[name="newPassword"]', 'FinalPass123!@#');
|
|
await page.fill('input[name="confirmPassword"]', 'FinalPass123!@#');
|
|
await page.click('button[type="submit"]');
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
});
|
|
|
|
await test.step('8. 验证登录成功', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login(`newuser_${timestamp}`, 'FinalPass123!@#');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
const username = await dashboardPage.getUsername();
|
|
expect(username).toContain(`newuser_${timestamp}`);
|
|
});
|
|
|
|
await test.step('9. 查看欢迎信息', async () => {
|
|
await expect(page.locator('.welcome-message')).toBeVisible();
|
|
await expect(page.locator('.welcome-message')).toContainText('欢迎');
|
|
});
|
|
|
|
await test.step('10. 查看系统通知', async () => {
|
|
await dashboardPage.navigateToNotification();
|
|
await expect(page.locator('.notification-list')).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test('UAT-002: 用户信息管理场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const userManagementPage = new UserManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 用户登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 导航到个人信息页面', async () => {
|
|
await dashboardPage.navigateToProfile();
|
|
await expect(page.locator('.profile-form')).toBeVisible();
|
|
});
|
|
|
|
await test.step('3. 查看当前信息', async () => {
|
|
const currentUsername = await page.locator('input[name="username"]').inputValue();
|
|
expect(currentUsername).toBe('admin');
|
|
});
|
|
|
|
await test.step('4. 修改昵称', async () => {
|
|
await page.fill('input[name="nickname"]', `管理员_${timestamp}`);
|
|
await page.click('button[type="submit"]');
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 修改邮箱', async () => {
|
|
await page.fill('input[name="email"]', `admin_${timestamp}@example.com`);
|
|
await page.click('button[type="submit"]');
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
});
|
|
|
|
await test.step('6. 修改手机号', async () => {
|
|
await page.fill('input[name="phone"]', '13900139000');
|
|
await page.click('button[type="submit"]');
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 上传头像', async () => {
|
|
const fileInput = page.locator('input[type="file"]');
|
|
await fileInput.setInputFiles('./e2e/fixtures/test-file.txt');
|
|
await page.click('button[type="submit"]');
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
});
|
|
|
|
await test.step('8. 保存修改', async () => {
|
|
await page.click('button:has-text("保存")');
|
|
await expect(page.locator('.success-message')).toBeVisible();
|
|
});
|
|
|
|
await test.step('9. 验证信息更新', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('input[name="nickname"]')).toHaveValue(`管理员_${timestamp}`);
|
|
});
|
|
|
|
await test.step('10. 查看操作日志', async () => {
|
|
await dashboardPage.navigateToOperationLog();
|
|
await expect(page.locator('table')).toContainText('个人信息');
|
|
});
|
|
});
|
|
|
|
test('UAT-003: 角色权限分配场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const roleManagementPage = new RoleManagementPage(page);
|
|
const userManagementPage = new UserManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 管理员登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 创建新角色', async () => {
|
|
await dashboardPage.navigateToRoleManagement();
|
|
await roleManagementPage.clickCreateRole();
|
|
|
|
const roleData = {
|
|
roleName: `业务角色_${timestamp}`,
|
|
roleKey: `business_role_${timestamp}`,
|
|
roleSort: '1',
|
|
status: '1',
|
|
remark: `业务操作角色_${timestamp}`,
|
|
};
|
|
|
|
await roleManagementPage.fillRoleForm(roleData);
|
|
await roleManagementPage.submitForm();
|
|
await expect(roleManagementPage.successMessage).toBeVisible();
|
|
|
|
testDataCleanup.trackRole(roleData.roleKey);
|
|
});
|
|
|
|
await test.step('3. 配置角色基本信息', async () => {
|
|
await roleManagementPage.editRole(1);
|
|
await page.fill('input[name="remark"]', `更新备注_${timestamp}`);
|
|
await roleManagementPage.submitForm();
|
|
await expect(roleManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('4. 分配菜单权限', async () => {
|
|
await roleManagementPage.openPermissionDialog(1);
|
|
await roleManagementPage.selectPermission('system:user:view');
|
|
await roleManagementPage.selectPermission('system:user:add');
|
|
await roleManagementPage.selectPermission('system:user:edit');
|
|
await roleManagementPage.submitPermissions();
|
|
await expect(roleManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 分配API权限', async () => {
|
|
await roleManagementPage.openPermissionDialog(1);
|
|
await roleManagementPage.selectPermission('api:user:list');
|
|
await roleManagementPage.selectPermission('api:user:create');
|
|
await roleManagementPage.submitPermissions();
|
|
await expect(roleManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('6. 保存角色配置', async () => {
|
|
await roleManagementPage.saveRole();
|
|
await expect(roleManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 为用户分配角色', async () => {
|
|
await dashboardPage.navigateToUserManagement();
|
|
await userManagementPage.editUser(1);
|
|
await page.click('.role-select');
|
|
await page.click('option:has-text("业务角色")');
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('8. 用户重新登录', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('9. 验证权限生效', async () => {
|
|
await dashboardPage.navigateToUserManagement();
|
|
await expect(page).toHaveURL(/.*users/);
|
|
await expect(page.locator('button:has-text("新增")')).toBeVisible();
|
|
});
|
|
|
|
await test.step('10. 查看权限日志', async () => {
|
|
await dashboardPage.navigateToOperationLog();
|
|
await expect(page.locator('table')).toContainText('权限');
|
|
});
|
|
});
|
|
|
|
test('UAT-004: 菜单管理场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const menuManagementPage = new MenuManagementPage(page);
|
|
const roleManagementPage = new RoleManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 管理员登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 创建父级菜单', async () => {
|
|
await dashboardPage.navigateToMenuManagement();
|
|
await menuManagementPage.clickCreateMenu();
|
|
|
|
const menuData = {
|
|
menuName: `业务菜单_${timestamp}`,
|
|
parentId: '0',
|
|
orderNum: '1',
|
|
menuType: 'M',
|
|
component: `business_${timestamp}`,
|
|
perms: `business:view_${timestamp}`,
|
|
status: '1',
|
|
};
|
|
|
|
await menuManagementPage.fillMenuForm(menuData);
|
|
await menuManagementPage.submitForm();
|
|
await expect(menuManagementPage.successMessage).toBeVisible();
|
|
|
|
testDataCleanup.trackMenu(`business_${timestamp}`);
|
|
});
|
|
|
|
await test.step('3. 创建子级菜单', async () => {
|
|
await menuManagementPage.clickCreateMenu();
|
|
|
|
const menuData = {
|
|
menuName: `业务操作_${timestamp}`,
|
|
parentId: '1',
|
|
orderNum: '1',
|
|
menuType: 'C',
|
|
component: `business_operation_${timestamp}`,
|
|
perms: `business:operation_${timestamp}`,
|
|
status: '1',
|
|
};
|
|
|
|
await menuManagementPage.fillMenuForm(menuData);
|
|
await menuManagementPage.submitForm();
|
|
await expect(menuManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('4. 配置菜单权限', async () => {
|
|
await menuManagementPage.editMenu(1);
|
|
await menuManagementPage.selectPermission('menu:view');
|
|
await menuManagementPage.selectPermission('menu:edit');
|
|
await menuManagementPage.submitForm();
|
|
await expect(menuManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 保存菜单配置', async () => {
|
|
await menuManagementPage.saveMenu();
|
|
await expect(menuManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('6. 为角色分配菜单权限', async () => {
|
|
await dashboardPage.navigateToRoleManagement();
|
|
await roleManagementPage.openPermissionDialog(1);
|
|
await roleManagementPage.selectPermission(`business:view_${timestamp}`);
|
|
await roleManagementPage.submitPermissions();
|
|
await expect(roleManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 用户登录系统', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('8. 验证菜单显示', async () => {
|
|
await expect(page.locator('.menu-item')).toContainText(`业务菜单_${timestamp}`);
|
|
});
|
|
|
|
await test.step('9. 验证菜单访问', async () => {
|
|
await page.click(`text=业务菜单_${timestamp}`);
|
|
await expect(page).toHaveURL(/.*business/);
|
|
});
|
|
|
|
await test.step('10. 验证菜单结构', async () => {
|
|
await dashboardPage.navigateToMenuManagement();
|
|
await expect(page.locator('table')).toContainText(`业务菜单_${timestamp}`);
|
|
await expect(page.locator('table')).toContainText(`业务操作_${timestamp}`);
|
|
});
|
|
});
|
|
|
|
test('UAT-005: 文件管理场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const fileManagementPage = new FileManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 用户登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 导航到文件管理页面', async () => {
|
|
await dashboardPage.navigateToFileManagement();
|
|
await expect(fileManagementPage.table).toBeVisible();
|
|
});
|
|
|
|
await test.step('3. 上传文件', async () => {
|
|
await fileManagementPage.clickUploadFile();
|
|
const fileInput = page.locator('input[type="file"]');
|
|
await fileInput.setInputFiles('./e2e/fixtures/test-file.txt');
|
|
await fileManagementPage.submitUpload();
|
|
await expect(fileManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('4. 验证文件上传成功', async () => {
|
|
await expect(page.locator('table')).toContainText('test-file.txt');
|
|
});
|
|
|
|
await test.step('5. 预览文件', async () => {
|
|
await fileManagementPage.previewFile(1);
|
|
await expect(page.locator('.file-preview')).toBeVisible();
|
|
await expect(page.locator('.file-preview')).toContainText('test');
|
|
});
|
|
|
|
await test.step('6. 下载文件', async () => {
|
|
const downloadPromise = page.waitForEvent('download');
|
|
await fileManagementPage.downloadFile(1);
|
|
const download = await downloadPromise;
|
|
expect(download.suggestedFilename()).toBe('test-file.txt');
|
|
});
|
|
|
|
await test.step('7. 验证文件内容', async () => {
|
|
await fileManagementPage.previewFile(1);
|
|
const content = await page.locator('.file-preview').textContent();
|
|
expect(content).toContain('test');
|
|
});
|
|
|
|
await test.step('8. 设置文件权限', async () => {
|
|
await fileManagementPage.editFile(1);
|
|
await page.selectOption('select[name="permission"]', 'private');
|
|
await fileManagementPage.submitForm();
|
|
await expect(fileManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('9. 删除文件', async () => {
|
|
await fileManagementPage.deleteFile(1);
|
|
await fileManagementPage.confirmDelete();
|
|
await expect(fileManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('10. 验证文件删除', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('table')).not.toContainText('test-file.txt');
|
|
});
|
|
});
|
|
|
|
test('UAT-006: 系统配置管理场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const systemConfigPage = new SystemConfigPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 管理员登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 导航到系统配置页面', async () => {
|
|
await dashboardPage.navigateToSystemConfig();
|
|
await expect(systemConfigPage.table).toBeVisible();
|
|
});
|
|
|
|
await test.step('3. 查看当前配置', async () => {
|
|
const configCount = await page.locator('table tbody tr').count();
|
|
expect(configCount).toBeGreaterThan(0);
|
|
});
|
|
|
|
await test.step('4. 修改配置项', async () => {
|
|
await systemConfigPage.editConfig(1);
|
|
await page.fill('input[name="configValue"]', `test_config_${timestamp}`);
|
|
await systemConfigPage.submitForm();
|
|
await expect(systemConfigPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 验证配置有效性', async () => {
|
|
await systemConfigPage.editConfig(1);
|
|
await expect(page.locator('input[name="configValue"]')).toHaveValue(`test_config_${timestamp}`);
|
|
});
|
|
|
|
await test.step('6. 保存配置', async () => {
|
|
await systemConfigPage.submitForm();
|
|
await expect(systemConfigPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 验证配置生效', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('table')).toContainText(`test_config_${timestamp}`);
|
|
});
|
|
|
|
await test.step('8. 刷新配置缓存', async () => {
|
|
await systemConfigPage.refreshCache();
|
|
await expect(systemConfigPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('9. 查看配置日志', async () => {
|
|
await dashboardPage.navigateToOperationLog();
|
|
await expect(page.locator('table')).toContainText('配置');
|
|
});
|
|
|
|
await test.step('10. 恢复默认配置', async () => {
|
|
await dashboardPage.navigateToSystemConfig();
|
|
await systemConfigPage.editConfig(1);
|
|
await page.fill('input[name="configValue"]', 'default_value');
|
|
await systemConfigPage.submitForm();
|
|
await expect(systemConfigPage.successMessage).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test('UAT-007: 审计日志查询场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const operationLogPage = new OperationLogPage(page);
|
|
|
|
await test.step('1. 审计员登录系统', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('2. 导航到审计日志页面', async () => {
|
|
await dashboardPage.navigateToOperationLog();
|
|
await expect(operationLogPage.table).toBeVisible();
|
|
});
|
|
|
|
await test.step('3. 查看操作日志', async () => {
|
|
await expect(page.locator('table')).toContainText('操作');
|
|
});
|
|
|
|
await test.step('4. 查看登录日志', async () => {
|
|
await operationLogPage.switchToLoginLog();
|
|
await expect(page.locator('table')).toContainText('登录');
|
|
});
|
|
|
|
await test.step('5. 查看异常日志', async () => {
|
|
await operationLogPage.switchToExceptionLog();
|
|
await expect(operationLogPage.table).toBeVisible();
|
|
});
|
|
|
|
await test.step('6. 搜索日志', async () => {
|
|
await operationLogPage.search('admin');
|
|
await page.waitForTimeout(2000);
|
|
await expect(page.locator('table')).toContainText('admin');
|
|
});
|
|
|
|
await test.step('7. 导出日志', async () => {
|
|
const downloadPromise = page.waitForEvent('download');
|
|
await operationLogPage.exportLogs();
|
|
const download = await downloadPromise;
|
|
expect(download.suggestedFilename()).toMatch(/logs.*\.xlsx/);
|
|
});
|
|
|
|
await test.step('8. 验证日志准确性', async () => {
|
|
const logCount = await page.locator('table tbody tr').count();
|
|
expect(logCount).toBeGreaterThan(0);
|
|
});
|
|
|
|
await test.step('9. 生成审计报告', async () => {
|
|
await operationLogPage.generateReport();
|
|
await expect(operationLogPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('10. 验证报告内容', async () => {
|
|
await expect(page.locator('.report-content')).toBeVisible();
|
|
});
|
|
});
|
|
|
|
test('UAT-008: 通知中心使用场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const notificationPage = new NotificationPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 管理员发布系统通知', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await dashboardPage.navigateToNotification();
|
|
await notificationPage.clickCreateNotification();
|
|
|
|
const notificationData = {
|
|
title: `系统通知_${timestamp}`,
|
|
content: `这是一条重要的系统通知_${timestamp}`,
|
|
type: 'system',
|
|
status: '1',
|
|
};
|
|
|
|
await notificationPage.fillNotificationForm(notificationData);
|
|
await notificationPage.submitForm();
|
|
await expect(notificationPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('2. 用户登录系统', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('3. 查看通知列表', async () => {
|
|
await dashboardPage.navigateToNotification();
|
|
await expect(page.locator('.notification-list')).toBeVisible();
|
|
await expect(page.locator('.notification-list')).toContainText(`系统通知_${timestamp}`);
|
|
});
|
|
|
|
await test.step('4. 查看通知详情', async () => {
|
|
await notificationPage.viewNotification(1);
|
|
await expect(page.locator('.notification-detail')).toBeVisible();
|
|
await expect(page.locator('.notification-detail')).toContainText(`系统通知_${timestamp}`);
|
|
});
|
|
|
|
await test.step('5. 标记通知已读', async () => {
|
|
await notificationPage.markAsRead(1);
|
|
await expect(notificationPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('6. 验证通知状态', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('.notification-item.read')).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 删除通知', async () => {
|
|
await notificationPage.deleteNotification(1);
|
|
await notificationPage.confirmDelete();
|
|
await expect(notificationPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('8. 验证通知删除', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('.notification-list')).not.toContainText(`系统通知_${timestamp}`);
|
|
});
|
|
|
|
await test.step('9. 验证通知推送', async () => {
|
|
await notificationPage.clickCreateNotification();
|
|
const notificationData = {
|
|
title: `推送通知_${timestamp}`,
|
|
content: `这是一条推送通知_${timestamp}`,
|
|
type: 'push',
|
|
status: '1',
|
|
};
|
|
await notificationPage.fillNotificationForm(notificationData);
|
|
await notificationPage.submitForm();
|
|
await expect(notificationPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('10. 查看通知历史', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('.notification-list')).toContainText(`推送通知_${timestamp}`);
|
|
});
|
|
});
|
|
|
|
test('UAT-009: 字典数据使用场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const dictionaryManagementPage = new DictionaryManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 管理员配置字典数据', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await dashboardPage.navigateToDictionary();
|
|
await dictionaryManagementPage.clickCreateDictType();
|
|
|
|
const dictTypeData = {
|
|
dictName: `业务字典_${timestamp}`,
|
|
dictType: `business_dict_${timestamp}`,
|
|
status: '1',
|
|
remark: `业务字典类型_${timestamp}`,
|
|
};
|
|
|
|
await dictionaryManagementPage.fillDictTypeForm(dictTypeData);
|
|
await dictionaryManagementPage.submitForm();
|
|
await expect(dictionaryManagementPage.successMessage).toBeVisible();
|
|
|
|
testDataCleanup.trackDictType(`business_dict_${timestamp}`);
|
|
});
|
|
|
|
await test.step('2. 用户登录系统', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('3. 查看字典数据', async () => {
|
|
await dashboardPage.navigateToDictionary();
|
|
await expect(page.locator('table')).toContainText(`业务字典_${timestamp}`);
|
|
});
|
|
|
|
await test.step('4. 使用字典数据', async () => {
|
|
await dictionaryManagementPage.clickCreateDictData();
|
|
const dictData = {
|
|
dictLabel: `业务数据1_${timestamp}`,
|
|
dictValue: `business_value1_${timestamp}`,
|
|
dictSort: '1',
|
|
status: '1',
|
|
};
|
|
await dictionaryManagementPage.fillDictDataForm(dictData);
|
|
await dictionaryManagementPage.submitForm();
|
|
await expect(dictionaryManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 验证数据正确性', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('table')).toContainText(`业务数据1_${timestamp}`);
|
|
});
|
|
|
|
await test.step('6. 管理员更新字典数据', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await dashboardPage.navigateToDictionary();
|
|
await dictionaryManagementPage.editDictData(1);
|
|
await page.fill('input[name="dictLabel"]', `更新数据_${timestamp}`);
|
|
await dictionaryManagementPage.submitForm();
|
|
await expect(dictionaryManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('7. 用户刷新页面', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('table')).toContainText(`更新数据_${timestamp}`);
|
|
});
|
|
|
|
await test.step('8. 验证数据更新', async () => {
|
|
await expect(page.locator('table')).toContainText(`更新数据_${timestamp}`);
|
|
});
|
|
|
|
await test.step('9. 验证数据缓存', async () => {
|
|
await dictionaryManagementPage.refreshCache();
|
|
await expect(dictionaryManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('10. 验证数据一致性', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('table')).toContainText(`更新数据_${timestamp}`);
|
|
});
|
|
});
|
|
|
|
test('UAT-010: 多用户协作场景', async ({ page }) => {
|
|
const loginPage = new LoginPage(page);
|
|
const dashboardPage = new DashboardPage(page);
|
|
const userManagementPage = new UserManagementPage(page);
|
|
const timestamp = Date.now();
|
|
|
|
await test.step('1. 创建测试用户A', async () => {
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await dashboardPage.navigateToUserManagement();
|
|
await userManagementPage.clickCreateUser();
|
|
const userData = {
|
|
username: `user_a_${timestamp}`,
|
|
nickname: `用户A_${timestamp}`,
|
|
email: `user_a_${timestamp}@example.com`,
|
|
phone: '13800138000',
|
|
password: 'Test123!@#',
|
|
confirmPassword: 'Test123!@#',
|
|
};
|
|
await userManagementPage.fillUserForm(userData);
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
|
|
testDataCleanup.trackUser(`user_a_${timestamp}`);
|
|
});
|
|
|
|
await test.step('2. 创建测试用户B', async () => {
|
|
await userManagementPage.clickCreateUser();
|
|
const userData = {
|
|
username: `user_b_${timestamp}`,
|
|
nickname: `用户B_${timestamp}`,
|
|
email: `user_b_${timestamp}@example.com`,
|
|
phone: '13800138000',
|
|
password: 'Test123!@#',
|
|
confirmPassword: 'Test123!@#',
|
|
};
|
|
await userManagementPage.fillUserForm(userData);
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
|
|
testDataCleanup.trackUser(`user_b_${timestamp}`);
|
|
});
|
|
|
|
await test.step('3. 多用户同时登录', async () => {
|
|
await loginPage.logout();
|
|
await loginPage.goto();
|
|
await loginPage.login('admin', 'admin123');
|
|
await expect(page).toHaveURL(/.*dashboard/);
|
|
});
|
|
|
|
await test.step('4. 用户A创建数据', async () => {
|
|
await dashboardPage.navigateToUserManagement();
|
|
await userManagementPage.clickCreateUser();
|
|
const userData = {
|
|
username: `data_a_${timestamp}`,
|
|
nickname: `数据A_${timestamp}`,
|
|
email: `data_a_${timestamp}@example.com`,
|
|
phone: '13800138000',
|
|
password: 'Test123!@#',
|
|
confirmPassword: 'Test123!@#',
|
|
};
|
|
await userManagementPage.fillUserForm(userData);
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('5. 用户B同时创建数据', async () => {
|
|
await userManagementPage.clickCreateUser();
|
|
const userData = {
|
|
username: `data_b_${timestamp}`,
|
|
nickname: `数据B_${timestamp}`,
|
|
email: `data_b_${timestamp}@example.com`,
|
|
phone: '13800138000',
|
|
password: 'Test123!@#',
|
|
confirmPassword: 'Test123!@#',
|
|
};
|
|
await userManagementPage.fillUserForm(userData);
|
|
await userManagementPage.submitForm();
|
|
await expect(userManagementPage.successMessage).toBeVisible();
|
|
});
|
|
|
|
await test.step('6. 验证数据一致性', async () => {
|
|
await page.reload();
|
|
await expect(page.locator('table')).toContainText(`data_a_${timestamp}`);
|
|
await expect(page.locator('table')).toContainText(`data_b_${timestamp}`);
|
|
});
|
|
|
|
await test.step('7. 验证并发处理', async () => {
|
|
const userCount = await userManagementPage.getUserCount();
|
|
expect(userCount).toBeGreaterThanOrEqual(2);
|
|
});
|
|
|
|
await test.step('8. 查看操作日志', async () => {
|
|
await dashboardPage.navigateToOperationLog();
|
|
await expect(page.locator('table')).toContainText('创建');
|
|
});
|
|
|
|
await test.step('9. 验证日志完整性', async () => {
|
|
const logCount = await page.locator('table tbody tr').count();
|
|
expect(logCount).toBeGreaterThan(0);
|
|
});
|
|
|
|
await test.step('10. 清理测试数据', async () => {
|
|
await dashboardPage.navigateToUserManagement();
|
|
await userManagementPage.search(`user_a_${timestamp}`);
|
|
await page.waitForTimeout(1000);
|
|
const rows = await page.locator('table tbody tr').count();
|
|
if (rows > 0) {
|
|
await userManagementPage.deleteUser(1);
|
|
await userManagementPage.confirmDelete();
|
|
}
|
|
});
|
|
});
|
|
}); |