Files
novalon-manage-system/novalon-manage-web/e2e/user-management-exceptions.spec.ts
T
张翔 e2ad1331cc feat: 添加测试框架和覆盖率报告功能
feat(测试): 新增Playwright和Vitest测试配置
feat(测试): 添加测试覆盖率报告生成功能
feat(测试): 实现前后端测试脚本集成

fix(测试): 修复测试密码不匹配问题
fix(测试): 修正URL等待策略
fix(测试): 调整错误消息选择器

refactor(测试): 重构测试目录结构
refactor(测试): 优化测试用例组织方式

docs: 更新测试报告文档
docs: 添加测试覆盖率报告模板

ci: 添加Docker测试环境配置
ci: 实现测试自动化脚本

chore: 更新依赖版本
chore: 添加测试相关配置文件
2026-03-25 09:03:37 +08:00

349 lines
12 KiB
TypeScript

import { test, expect } from '@playwright/test';
import { LoginPage } from './pages/LoginPage';
import { DashboardPage } from './pages/DashboardPage';
import { UserManagementPage } from './pages/UserManagementPage';
import { TestDataManager } from './utils/testDataManager';
import { TestHelper } from './utils/testHelper';
test.describe('用户管理异常场景测试', () => {
let loginPage: LoginPage;
let dashboardPage: DashboardPage;
let userManagementPage: UserManagementPage;
test.beforeEach(async ({ page }) => {
loginPage = new LoginPage(page);
dashboardPage = new DashboardPage(page);
userManagementPage = new UserManagementPage(page);
await loginPage.goto();
await loginPage.login('admin', 'admin123');
});
test('创建用户 - 重复用户名', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试创建重复用户名的用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: 'admin',
nickname: '重复用户',
email: 'duplicate@example.com',
phone: '13800138000',
password: 'Test123!@#',
confirmPassword: 'Test123!@#',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证错误消息', async () => {
await TestHelper.waitForErrorMessage(page);
const errorMessage = await TestHelper.getElementText(page, '.el-message__content');
expect(errorMessage).toContain('用户名已存在');
});
});
test('创建用户 - 无效邮箱格式', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试创建无效邮箱的用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: `testuser_${Date.now()}`,
nickname: '测试用户',
email: 'invalid-email',
phone: '13800138000',
password: 'Test123!@#',
confirmPassword: 'Test123!@#',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证表单验证错误', async () => {
const emailInput = page.locator('input[name="email"]');
const hasError = await emailInput.evaluate(el => el.classList.contains('is-error'));
expect(hasError).toBeTruthy();
});
});
test('创建用户 - 密码强度不足', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试创建密码强度不足的用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: `testuser_${Date.now()}`,
nickname: '测试用户',
email: 'test@example.com',
phone: '13800138000',
password: '123',
confirmPassword: '123',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证密码强度错误', async () => {
const passwordInput = page.locator('input[name="password"]');
const hasError = await passwordInput.evaluate(el => el.classList.contains('is-error'));
expect(hasError).toBeTruthy();
});
});
test('创建用户 - 密码不匹配', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试创建密码不匹配的用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: `testuser_${Date.now()}`,
nickname: '测试用户',
email: 'test@example.com',
phone: '13800138000',
password: 'Test123!@#',
confirmPassword: 'DifferentPassword',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证密码不匹配错误', async () => {
const confirmPasswordInput = page.locator('input[name="confirmPassword"]');
const hasError = await confirmPasswordInput.evaluate(el => el.classList.contains('is-error'));
expect(hasError).toBeTruthy();
});
});
test('创建用户 - 缺少必填字段', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试创建缺少必填字段的用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: '',
nickname: '',
email: '',
phone: '',
password: '',
confirmPassword: '',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证必填字段验证', async () => {
const submitButton = page.locator('.el-dialog__footer button[type="submit"]');
const isDisabled = await submitButton.evaluate(el => el.disabled);
expect(isDisabled).toBeTruthy();
});
});
test('创建用户 - 无效手机号格式', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试创建无效手机号的用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: `testuser_${Date.now()}`,
nickname: '测试用户',
email: 'test@example.com',
phone: '123',
password: 'Test123!@#',
confirmPassword: 'Test123!@#',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证手机号格式错误', async () => {
const phoneInput = page.locator('input[name="phone"]');
const hasError = await phoneInput.evaluate(el => el.classList.contains('is-error'));
expect(hasError).toBeTruthy();
});
});
test('编辑用户 - 不存在的用户ID', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试编辑不存在的用户', async () => {
await page.goto('/users/999999/edit');
await TestHelper.waitForPageLoad(page);
});
await test.step('验证404错误或重定向', async () => {
const currentUrl = page.url();
expect(currentUrl).toMatch(/(404|users)/);
});
});
test('删除用户 - 不存在的用户ID', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试删除不存在的用户', async () => {
const response = await page.request.delete('http://localhost:8084/api/users/999999');
expect(response.status()).toBe(404);
});
});
test('搜索用户 - 空搜索条件', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('执行空搜索', async () => {
await userManagementPage.search('');
await TestHelper.waitForPageLoad(page);
});
await test.step('验证显示所有用户', async () => {
const userCount = await userManagementPage.getUserCount();
expect(userCount).toBeGreaterThan(0);
});
});
test('搜索用户 - 不存在的用户名', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('搜索不存在的用户', async () => {
await userManagementPage.search('nonexistentuser123456');
await TestHelper.waitForPageLoad(page);
});
await test.step('验证无结果', async () => {
const userCount = await userManagementPage.getUserCount();
expect(userCount).toBe(0);
});
});
test('批量删除 - 未选择用户', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试批量删除未选择的用户', async () => {
await page.click('button:has-text("批量删除")');
});
await test.step('验证提示消息', async () => {
await TestHelper.waitForErrorMessage(page);
});
});
test('导出用户 - 无数据', async ({ page, request }) => {
await test.step('清空用户数据', async () => {
const response = await request.delete('http://localhost:8084/api/users/test/cleanup');
expect(response.ok()).toBeTruthy();
});
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试导出空数据', async () => {
const downloadPromise = page.waitForEvent('download');
await page.click('button:has-text("导出")');
const download = await downloadPromise;
expect(download.suggestedFilename()).toMatch(/users.*\.xlsx/);
});
});
test('分页 - 超出范围页码', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('尝试访问超出范围的页码', async () => {
await page.goto('/users?page=999999');
await TestHelper.waitForPageLoad(page);
});
await test.step('验证显示最后一页或第一页', async () => {
const currentPage = await userManagementPage.getCurrentPage();
expect(currentPage).toBeTruthy();
});
});
test('网络错误 - 创建用户时断网', async ({ page }) => {
await test.step('导航到用户管理页面', async () => {
await dashboardPage.navigateToUserManagement();
await TestHelper.waitForPageLoad(page);
});
await test.step('模拟网络错误', async () => {
await page.route('**/api/users', route => route.abort('failed'));
});
await test.step('尝试创建用户', async () => {
await userManagementPage.clickCreateUser();
await TestHelper.waitForElementVisible(page, '.el-dialog');
const userData = {
username: `testuser_${Date.now()}`,
nickname: '测试用户',
email: 'test@example.com',
phone: '13800138000',
password: 'Test123!@#',
confirmPassword: 'Test123!@#',
};
await userManagementPage.fillUserForm(userData);
await userManagementPage.submitForm();
});
await test.step('验证网络错误提示', async () => {
await TestHelper.waitForErrorMessage(page);
});
});
});