08ea5fbe98
添加用户管理视图、API和状态管理文件
306 lines
8.9 KiB
TypeScript
306 lines
8.9 KiB
TypeScript
/**
|
|
* 角色管理端到端测试
|
|
* 测试角色管理相关的完整业务流程
|
|
*/
|
|
|
|
import { test, expect, Page } from '@playwright/test';
|
|
import { TestLogger } from '../core/test-logger.js';
|
|
import { TestDataManager } from '../core/test-data-manager.js';
|
|
import { WorkflowExecutor } from '../core/workflow-executor.js';
|
|
import { TestReporter } from '../core/test-reporter.js';
|
|
import { LoginPage } from '../pages/login-page.js';
|
|
import { RoleManagementPage } from '../pages/role-management-page.js';
|
|
import {
|
|
createRoleWorkflow,
|
|
editRoleWorkflow,
|
|
deleteRoleWorkflow,
|
|
assignPermissionsWorkflow,
|
|
roleLifecycleWorkflow,
|
|
RoleWorkflowContext
|
|
} from '../workflows/role-management-workflow.js';
|
|
|
|
test.describe('角色管理端到端测试', () => {
|
|
let page: Page;
|
|
let testLogger: TestLogger;
|
|
let testDataManager: TestDataManager;
|
|
let workflowExecutor: WorkflowExecutor;
|
|
let testReporter: TestReporter;
|
|
let loginPage: LoginPage;
|
|
let roleManagementPage: RoleManagementPage;
|
|
let workflowContext: RoleWorkflowContext;
|
|
|
|
test.beforeAll(async ({ browser }) => {
|
|
page = await browser.newPage();
|
|
testLogger = new TestLogger();
|
|
testDataManager = TestDataManager.getInstance(testLogger);
|
|
workflowExecutor = new WorkflowExecutor(testLogger);
|
|
testReporter = new TestReporter(testLogger);
|
|
|
|
loginPage = new LoginPage(page, testLogger);
|
|
roleManagementPage = new RoleManagementPage(page);
|
|
|
|
workflowContext = {
|
|
page,
|
|
testLogger,
|
|
testDataManager,
|
|
loginPage,
|
|
roleManagementPage
|
|
};
|
|
|
|
testReporter.startSuite('角色管理端到端测试');
|
|
});
|
|
|
|
test.afterAll(async () => {
|
|
await testDataManager.cleanupAll();
|
|
testReporter.endSuite();
|
|
testReporter.generateHTMLReport('角色管理E2E测试报告');
|
|
testReporter.generateJSONReport();
|
|
testReporter.generateJUnitReport();
|
|
await page.close();
|
|
});
|
|
|
|
test.afterEach(async ({}, testInfo) => {
|
|
if (testInfo.status === 'failed') {
|
|
const screenshotPath = `test-results/screenshots/${testInfo.title}-${Date.now()}.png`;
|
|
await page.screenshot({ path: screenshotPath, fullPage: true });
|
|
testReporter.addScreenshot(screenshotPath);
|
|
}
|
|
});
|
|
|
|
test('应该成功创建新角色', async () => {
|
|
testReporter.startTest('创建新角色');
|
|
|
|
try {
|
|
const workflow = createRoleWorkflow(workflowContext);
|
|
const result = await workflowExecutor.execute(workflow, {
|
|
maxRetries: 3,
|
|
retryDelay: 2000,
|
|
enableRollback: true
|
|
});
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(workflowContext.createdRole).toBeDefined();
|
|
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该成功编辑现有角色', async () => {
|
|
testReporter.startTest('编辑现有角色');
|
|
|
|
try {
|
|
const createWorkflow = createRoleWorkflow(workflowContext);
|
|
await workflowExecutor.execute(createWorkflow, {
|
|
maxRetries: 3,
|
|
enableRollback: true
|
|
});
|
|
|
|
expect(workflowContext.createdRole).toBeDefined();
|
|
|
|
const editWorkflow = editRoleWorkflow(workflowContext, workflowContext.createdRole?.name);
|
|
const result = await workflowExecutor.execute(editWorkflow, {
|
|
maxRetries: 3,
|
|
enableRollback: false
|
|
});
|
|
|
|
expect(result.success).toBe(true);
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该成功删除角色', async () => {
|
|
testReporter.startTest('删除角色');
|
|
|
|
try {
|
|
const createWorkflow = createRoleWorkflow(workflowContext);
|
|
await workflowExecutor.execute(createWorkflow, {
|
|
maxRetries: 3,
|
|
enableRollback: true
|
|
});
|
|
|
|
expect(workflowContext.createdRole).toBeDefined();
|
|
|
|
const deleteWorkflow = deleteRoleWorkflow(workflowContext, workflowContext.createdRole?.name);
|
|
const result = await workflowExecutor.execute(deleteWorkflow, {
|
|
maxRetries: 3,
|
|
enableRollback: false
|
|
});
|
|
|
|
expect(result.success).toBe(true);
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该成功为角色分配权限', async () => {
|
|
testReporter.startTest('为角色分配权限');
|
|
|
|
try {
|
|
const createWorkflow = createRoleWorkflow(workflowContext);
|
|
await workflowExecutor.execute(createWorkflow, {
|
|
maxRetries: 3,
|
|
enableRollback: true
|
|
});
|
|
|
|
expect(workflowContext.createdRole).toBeDefined();
|
|
|
|
const permissionsWorkflow = assignPermissionsWorkflow(workflowContext, workflowContext.createdRole?.name);
|
|
const result = await workflowExecutor.execute(permissionsWorkflow, {
|
|
maxRetries: 3,
|
|
enableRollback: false
|
|
});
|
|
|
|
expect(result.success).toBe(true);
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该完成完整的角色生命周期流程', async () => {
|
|
testReporter.startTest('完整角色生命周期');
|
|
|
|
try {
|
|
const workflow = roleLifecycleWorkflow(workflowContext);
|
|
const result = await workflowExecutor.execute(workflow, {
|
|
maxRetries: 3,
|
|
retryDelay: 2000,
|
|
enableRollback: true,
|
|
timeout: 300000
|
|
});
|
|
|
|
expect(result.success).toBe(true);
|
|
expect(result.completedSteps).toContain('createRole');
|
|
expect(result.completedSteps).toContain('assignPermissions');
|
|
expect(result.completedSteps).toContain('editRole');
|
|
expect(result.completedSteps).toContain('deleteRole');
|
|
|
|
testLogger.success(`✅ 工作流执行完成,耗时: ${result.executionTime}ms`);
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该处理创建重复角色的异常情况', async () => {
|
|
testReporter.startTest('异常情况处理-创建重复角色');
|
|
|
|
try {
|
|
const workflow = createRoleWorkflow(workflowContext);
|
|
|
|
const result1 = await workflowExecutor.execute(workflow, {
|
|
maxRetries: 3,
|
|
enableRollback: false
|
|
});
|
|
expect(result1.success).toBe(true);
|
|
|
|
const duplicateWorkflow = createRoleWorkflow({
|
|
...workflowContext,
|
|
createdRole: {
|
|
...workflowContext.createdRole!,
|
|
name: workflowContext.createdRole!.name
|
|
}
|
|
});
|
|
|
|
const result2 = await workflowExecutor.execute(duplicateWorkflow, {
|
|
maxRetries: 1,
|
|
enableRollback: false
|
|
});
|
|
|
|
expect(result2.success).toBe(false);
|
|
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('passed');
|
|
}
|
|
});
|
|
|
|
test('应该支持批量角色操作', async () => {
|
|
testReporter.startTest('批量角色操作');
|
|
|
|
try {
|
|
const workflows = [];
|
|
|
|
for (let i = 0; i < 5; i++) {
|
|
const context: RoleWorkflowContext = {
|
|
page,
|
|
testLogger,
|
|
testDataManager,
|
|
loginPage,
|
|
roleManagementPage
|
|
};
|
|
workflows.push(createRoleWorkflow(context));
|
|
}
|
|
|
|
const results = await workflowExecutor.executeBatch(workflows, {
|
|
maxRetries: 3,
|
|
continueOnError: true,
|
|
enableRollback: true
|
|
});
|
|
|
|
const successCount = results.filter(r => r.success).length;
|
|
testLogger.info(`批量创建结果: ${successCount}/${workflows.length} 成功`);
|
|
|
|
expect(successCount).toBeGreaterThanOrEqual(3);
|
|
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该验证角色搜索功能', async () => {
|
|
testReporter.startTest('角色搜索功能验证');
|
|
|
|
try {
|
|
await loginPage.navigate();
|
|
await loginPage.login('admin', 'admin123');
|
|
await roleManagementPage.navigate();
|
|
await roleManagementPage.waitForLoad();
|
|
|
|
await roleManagementPage.searchRole('admin');
|
|
const count = await roleManagementPage.getRoleCount();
|
|
expect(count).toBeGreaterThanOrEqual(0);
|
|
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
|
|
test('应该验证角色表单验证', async () => {
|
|
testReporter.startTest('角色表单验证');
|
|
|
|
try {
|
|
await loginPage.navigate();
|
|
await loginPage.login('admin', 'admin123');
|
|
await roleManagementPage.navigate();
|
|
await roleManagementPage.waitForLoad();
|
|
|
|
await roleManagementPage.clickAddRole();
|
|
|
|
await page.click('button[type="submit"]');
|
|
|
|
const hasError = await page.locator('.el-form-item__error').isVisible();
|
|
expect(hasError).toBe(true);
|
|
|
|
testReporter.endTest('passed');
|
|
} catch (error) {
|
|
testReporter.endTest('failed', error as Error);
|
|
throw error;
|
|
}
|
|
});
|
|
});
|