e2ad1331cc
feat(测试): 新增Playwright和Vitest测试配置 feat(测试): 添加测试覆盖率报告生成功能 feat(测试): 实现前后端测试脚本集成 fix(测试): 修复测试密码不匹配问题 fix(测试): 修正URL等待策略 fix(测试): 调整错误消息选择器 refactor(测试): 重构测试目录结构 refactor(测试): 优化测试用例组织方式 docs: 更新测试报告文档 docs: 添加测试覆盖率报告模板 ci: 添加Docker测试环境配置 ci: 实现测试自动化脚本 chore: 更新依赖版本 chore: 添加测试相关配置文件
349 lines
12 KiB
TypeScript
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);
|
|
});
|
|
});
|
|
});
|