feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,251 @@
|
||||
/**
|
||||
* 端到端业务流程集成测试
|
||||
* 测试完整的用户旅程和数据流
|
||||
*/
|
||||
|
||||
import { test, expect } from '../shared/fixtures/test-fixtures';
|
||||
import { testLogger } from '../shared/utils/test-logger';
|
||||
import { testReporter } from '../shared/utils/test-reporter';
|
||||
|
||||
test.describe('完整用户旅程测试 @integration @e2e', () => {
|
||||
test.beforeAll(async () => {
|
||||
testReporter.startReport();
|
||||
});
|
||||
|
||||
test.afterAll(async () => {
|
||||
testReporter.generateAllReports('test-results/integration');
|
||||
});
|
||||
|
||||
test('管理员完整工作流程', async ({
|
||||
loginPage,
|
||||
dashboardPage,
|
||||
userManagementPage,
|
||||
roleManagementPage,
|
||||
menuManagementPage,
|
||||
testData
|
||||
}) => {
|
||||
testLogger.startTest('管理员完整工作流程');
|
||||
|
||||
// 1. 登录系统
|
||||
testLogger.startStep('管理员登录');
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
await dashboardPage.waitForLoad();
|
||||
const pageTitle = await dashboardPage.getPageTitle();
|
||||
expect(pageTitle).toContain('仪表盘');
|
||||
await dashboardPage.takeScreenshot('admin-workflow-01-dashboard');
|
||||
testLogger.endStep('管理员登录', 'passed');
|
||||
|
||||
// 2. 创建新角色
|
||||
testLogger.startStep('创建新角色');
|
||||
await roleManagementPage.navigate();
|
||||
const roleData = testData.generateRoleData();
|
||||
await roleManagementPage.createRole(roleData);
|
||||
await roleManagementPage.takeScreenshot('admin-workflow-02-role-created');
|
||||
testLogger.endStep('创建新角色', 'passed');
|
||||
|
||||
// 3. 创建新用户
|
||||
testLogger.startStep('创建新用户');
|
||||
await userManagementPage.navigate();
|
||||
await userManagementPage.clickAddUser();
|
||||
const userData = testData.generateUserData();
|
||||
await userManagementPage.fillUserForm(userData);
|
||||
await userManagementPage.submitForm();
|
||||
await userManagementPage.takeScreenshot('admin-workflow-03-user-created');
|
||||
testLogger.endStep('创建新用户', 'passed');
|
||||
|
||||
// 4. 搜索并验证用户
|
||||
testLogger.startStep('搜索验证用户');
|
||||
await userManagementPage.searchUser(userData.username);
|
||||
const isUserFound = await userManagementPage.isUserInTable(userData.username);
|
||||
expect(isUserFound).toBe(true);
|
||||
await userManagementPage.takeScreenshot('admin-workflow-04-user-found');
|
||||
testLogger.endStep('搜索验证用户', 'passed');
|
||||
|
||||
// 5. 创建新菜单
|
||||
testLogger.startStep('创建新菜单');
|
||||
await menuManagementPage.navigate();
|
||||
const menuData = testData.generateMenuData();
|
||||
await menuManagementPage.createMenu({
|
||||
menuName: menuData.menuName,
|
||||
path: menuData.path,
|
||||
icon: menuData.icon,
|
||||
});
|
||||
await menuManagementPage.takeScreenshot('admin-workflow-05-menu-created');
|
||||
testLogger.endStep('创建新菜单', 'passed');
|
||||
|
||||
// 6. 编辑用户
|
||||
testLogger.startStep('编辑用户');
|
||||
await userManagementPage.navigate();
|
||||
await userManagementPage.searchUser(userData.username);
|
||||
await userManagementPage.clickEditFirstUser();
|
||||
const updatedRealName = '修改后的' + userData.realName;
|
||||
await userManagementPage['page'].fill('input[placeholder="请输入真实姓名"]', updatedRealName);
|
||||
await userManagementPage['page'].click('button[type="submit"]:has-text("确定")');
|
||||
await userManagementPage.takeScreenshot('admin-workflow-06-user-edited');
|
||||
testLogger.endStep('编辑用户', 'passed');
|
||||
|
||||
// 7. 删除用户
|
||||
testLogger.startStep('删除用户');
|
||||
await userManagementPage.navigate();
|
||||
await userManagementPage.searchUser(userData.username);
|
||||
await userManagementPage.clickDeleteFirstUser();
|
||||
await userManagementPage.takeScreenshot('admin-workflow-07-user-deleted');
|
||||
testLogger.endStep('删除用户', 'passed');
|
||||
|
||||
// 8. 登出
|
||||
testLogger.startStep('管理员登出');
|
||||
await dashboardPage.logout();
|
||||
const isLoginPage = await loginPage.isLoginPage();
|
||||
expect(isLoginPage).toBe(true);
|
||||
await loginPage.takeScreenshot('admin-workflow-08-logged-out');
|
||||
testLogger.endStep('管理员登出', 'passed');
|
||||
|
||||
testLogger.endTest('管理员完整工作流程', 'passed');
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('跨系统数据一致性测试 @integration @data', () => {
|
||||
test('Admin操作数据在Uniapp中显示', async ({
|
||||
loginPage,
|
||||
userManagementPage,
|
||||
uniappCalendarPage,
|
||||
testData
|
||||
}) => {
|
||||
testLogger.startTest('跨系统数据一致性');
|
||||
|
||||
// 1. 在Admin中创建用户
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
await userManagementPage.navigate();
|
||||
await userManagementPage.clickAddUser();
|
||||
const userData = testData.generateUserData();
|
||||
await userManagementPage.fillUserForm(userData);
|
||||
await userManagementPage.submitForm();
|
||||
|
||||
// 2. 验证Uniapp可以正常访问(不需要登录)
|
||||
await uniappCalendarPage.navigate();
|
||||
const title = await uniappCalendarPage.getPageTitle();
|
||||
expect(title).toContain('万年历');
|
||||
|
||||
testLogger.info('跨系统数据流验证完成');
|
||||
|
||||
testLogger.endTest('跨系统数据一致性', 'passed');
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('并发操作测试 @integration @concurrent', () => {
|
||||
test('多用户同时操作', async ({ browser, testData }) => {
|
||||
testLogger.startTest('多用户同时操作');
|
||||
|
||||
// 创建两个独立的浏览器上下文
|
||||
const context1 = await browser.newContext();
|
||||
const context2 = await browser.newContext();
|
||||
|
||||
const page1 = await context1.newPage();
|
||||
const page2 = await context2.newPage();
|
||||
|
||||
try {
|
||||
// 用户1登录并创建用户
|
||||
await page1.goto('http://localhost:5174/login');
|
||||
await page1.fill('input[placeholder="请输入用户名"]', 'admin');
|
||||
await page1.fill('input[placeholder="请输入密码"]', 'admin123');
|
||||
await page1.click('button[type="submit"]');
|
||||
await page1.waitForURL(/.*dashboard/);
|
||||
|
||||
// 用户2同时登录
|
||||
await page2.goto('http://localhost:5174/login');
|
||||
await page2.fill('input[placeholder="请输入用户名"]', 'admin');
|
||||
await page2.fill('input[placeholder="请输入密码"]', 'admin123');
|
||||
await page2.click('button[type="submit"]');
|
||||
await page2.waitForURL(/.*dashboard/);
|
||||
|
||||
// 两个用户同时访问用户管理页面
|
||||
await Promise.all([
|
||||
page1.goto('http://localhost:5174/users'),
|
||||
page2.goto('http://localhost:5174/users'),
|
||||
]);
|
||||
|
||||
await page1.waitForTimeout(2000);
|
||||
await page2.waitForTimeout(2000);
|
||||
|
||||
// 验证两个页面都正常加载
|
||||
const page1Title = await page1.locator('.page-title').textContent();
|
||||
const page2Title = await page2.locator('.page-title').textContent();
|
||||
|
||||
expect(page1Title).toContain('用户管理');
|
||||
expect(page2Title).toContain('用户管理');
|
||||
|
||||
testLogger.info('并发访问测试通过');
|
||||
|
||||
} finally {
|
||||
await context1.close();
|
||||
await context2.close();
|
||||
}
|
||||
|
||||
testLogger.endTest('多用户同时操作', 'passed');
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('系统恢复测试 @integration @recovery', () => {
|
||||
test('页面刷新后状态保持', async ({ loginPage, dashboardPage, userManagementPage }) => {
|
||||
testLogger.startTest('页面刷新后状态保持');
|
||||
|
||||
// 1. 登录
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
await dashboardPage.waitForLoad();
|
||||
|
||||
// 2. 导航到用户管理
|
||||
await userManagementPage.navigate();
|
||||
|
||||
// 3. 刷新页面
|
||||
await userManagementPage.reload();
|
||||
|
||||
// 4. 验证仍然保持登录状态
|
||||
const currentURL = await userManagementPage.getCurrentURL();
|
||||
expect(currentURL).toContain('/users');
|
||||
|
||||
// 5. 验证页面正常显示
|
||||
const pageTitle = await userManagementPage['page'].locator('.page-title').textContent();
|
||||
expect(pageTitle).toContain('用户管理');
|
||||
|
||||
testLogger.endTest('页面刷新后状态保持', 'passed');
|
||||
});
|
||||
|
||||
test('网络恢复后自动重试', async ({ loginPage, userManagementPage, testData }) => {
|
||||
testLogger.startTest('网络恢复后自动重试');
|
||||
|
||||
// 1. 登录
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
|
||||
// 2. 进入用户管理
|
||||
await userManagementPage.navigate();
|
||||
await userManagementPage.clickAddUser();
|
||||
|
||||
// 3. 填写表单
|
||||
const userData = testData.generateUserData();
|
||||
await userManagementPage.fillUserForm(userData);
|
||||
|
||||
// 4. 模拟网络断开
|
||||
await userManagementPage['page'].context().setOffline(true);
|
||||
|
||||
// 5. 尝试提交
|
||||
await userManagementPage['page'].click('button[type="submit"]:has-text("确定")');
|
||||
await userManagementPage.waitForTimeout(2000);
|
||||
|
||||
// 6. 恢复网络
|
||||
await userManagementPage['page'].context().setOffline(false);
|
||||
|
||||
// 7. 重新提交
|
||||
await userManagementPage['page'].click('button[type="submit"]:has-text("确定")');
|
||||
|
||||
// 8. 验证成功
|
||||
const successMessage = userManagementPage['page'].locator('.ant-message-success');
|
||||
await expect(successMessage).toBeVisible({ timeout: 10000 });
|
||||
|
||||
testLogger.endTest('网络恢复后自动重试', 'passed');
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user