feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,218 @@
|
||||
/**
|
||||
* 认证模块端到端测试
|
||||
* 测试登录、登出、Token刷新等认证流程
|
||||
*/
|
||||
|
||||
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 { DashboardPage } from '../pages/dashboard-page.js';
|
||||
|
||||
test.describe('认证模块端到端测试', () => {
|
||||
let page: Page;
|
||||
let testLogger: TestLogger;
|
||||
let testDataManager: TestDataManager;
|
||||
let workflowExecutor: WorkflowExecutor;
|
||||
let testReporter: TestReporter;
|
||||
let loginPage: LoginPage;
|
||||
let dashboardPage: DashboardPage;
|
||||
|
||||
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);
|
||||
dashboardPage = new DashboardPage(page);
|
||||
|
||||
testReporter.startSuite('认证模块端到端测试');
|
||||
});
|
||||
|
||||
test.afterAll(async () => {
|
||||
testReporter.endSuite();
|
||||
testReporter.generateHTMLReport('认证模块E2E测试报告');
|
||||
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 {
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
await loginPage.waitForLoginSuccess();
|
||||
|
||||
// 验证仪表盘页面
|
||||
const pageTitle = await dashboardPage.getPageTitle();
|
||||
expect(pageTitle).toContain('仪表盘');
|
||||
|
||||
testReporter.endTest('passed');
|
||||
} catch (error) {
|
||||
testReporter.endTest('failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该拒绝错误的用户名', async () => {
|
||||
testReporter.startTest('拒绝错误用户名');
|
||||
|
||||
try {
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('wronguser', 'admin123');
|
||||
|
||||
const errorText = await loginPage.waitForError();
|
||||
expect(errorText).toContain('错误');
|
||||
|
||||
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', 'wrongpassword');
|
||||
|
||||
const errorText = await loginPage.waitForError();
|
||||
expect(errorText).toContain('错误');
|
||||
|
||||
testReporter.endTest('passed');
|
||||
} catch (error) {
|
||||
testReporter.endTest('failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该验证用户名不能为空', async () => {
|
||||
testReporter.startTest('验证用户名不能为空');
|
||||
|
||||
try {
|
||||
await loginPage.navigate();
|
||||
await loginPage.clickLoginButton();
|
||||
|
||||
const hasError = await page.locator('[role="alert"]').isVisible();
|
||||
expect(hasError).toBe(true);
|
||||
|
||||
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 loginPage.waitForLoginSuccess();
|
||||
|
||||
// 执行登出
|
||||
await page.click('.ant-dropdown-link');
|
||||
await page.waitForTimeout(500);
|
||||
await page.click('.ant-dropdown-menu-item:has-text("退出")');
|
||||
await page.waitForURL(/.*login/, { timeout: 10000 });
|
||||
|
||||
// 验证返回登录页面
|
||||
const isLoginFormVisible = await loginPage.verifyLoginFormExists();
|
||||
expect(isLoginFormVisible).toBe(true);
|
||||
|
||||
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 loginPage.waitForLoginSuccess();
|
||||
|
||||
// 刷新页面
|
||||
await page.reload();
|
||||
await dashboardPage.waitForLoad();
|
||||
|
||||
// 验证仍在仪表盘
|
||||
const isDashboardVisible = await dashboardPage.isDashboardVisible();
|
||||
expect(isDashboardVisible).toBe(true);
|
||||
|
||||
testReporter.endTest('passed');
|
||||
} catch (error) {
|
||||
testReporter.endTest('failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该完成完整的登录-操作-登出流程', async () => {
|
||||
testReporter.startTest('完整认证流程');
|
||||
|
||||
try {
|
||||
// 步骤1: 登录
|
||||
testLogger.startStep('用户登录');
|
||||
await loginPage.navigate();
|
||||
await loginPage.login('admin', 'admin123');
|
||||
await loginPage.waitForLoginSuccess();
|
||||
testLogger.endStep('用户登录', 'passed');
|
||||
|
||||
// 步骤2: 访问仪表盘
|
||||
testLogger.startStep('访问仪表盘');
|
||||
await dashboardPage.waitForLoad();
|
||||
const isDashboardVisible = await dashboardPage.isDashboardVisible();
|
||||
expect(isDashboardVisible).toBe(true);
|
||||
testLogger.endStep('访问仪表盘', 'passed');
|
||||
|
||||
// 步骤3: 访问用户管理
|
||||
testLogger.startStep('访问用户管理');
|
||||
await page.click('.ant-menu-item:has-text("用户管理")');
|
||||
await page.waitForURL(/.*users/, { timeout: 10000 });
|
||||
testLogger.endStep('访问用户管理', 'passed');
|
||||
|
||||
// 步骤4: 返回仪表盘
|
||||
testLogger.startStep('返回仪表盘');
|
||||
await page.click('.ant-menu-item:has-text("仪表盘")');
|
||||
await page.waitForURL(/.*dashboard/, { timeout: 10000 });
|
||||
testLogger.endStep('返回仪表盘', 'passed');
|
||||
|
||||
// 步骤5: 登出
|
||||
testLogger.startStep('用户登出');
|
||||
await page.click('.ant-dropdown-link');
|
||||
await page.waitForTimeout(500);
|
||||
await page.click('.ant-dropdown-menu-item:has-text("退出")');
|
||||
await page.waitForURL(/.*login/, { timeout: 10000 });
|
||||
testLogger.endStep('用户登出', 'passed');
|
||||
|
||||
// 验证返回登录页面
|
||||
const isLoginFormVisible = await loginPage.verifyLoginFormExists();
|
||||
expect(isLoginFormVisible).toBe(true);
|
||||
|
||||
testReporter.endTest('passed');
|
||||
} catch (error) {
|
||||
testReporter.endTest('failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,305 @@
|
||||
/**
|
||||
* 角色管理端到端测试
|
||||
* 测试角色管理相关的完整业务流程
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,253 @@
|
||||
/**
|
||||
* 用户生命周期端到端测试
|
||||
* 测试用户从创建到删除的完整业务流程
|
||||
*/
|
||||
|
||||
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 { UserManagementPage } from '../pages/user-management-page.js';
|
||||
import {
|
||||
createUserWorkflow,
|
||||
editUserWorkflow,
|
||||
deleteUserWorkflow,
|
||||
userLifecycleWorkflow,
|
||||
UserWorkflowContext
|
||||
} from '../workflows/user-management-workflow.js';
|
||||
|
||||
test.describe('用户生命周期端到端测试', () => {
|
||||
let page: Page;
|
||||
let testLogger: TestLogger;
|
||||
let testDataManager: TestDataManager;
|
||||
let workflowExecutor: WorkflowExecutor;
|
||||
let testReporter: TestReporter;
|
||||
let loginPage: LoginPage;
|
||||
let userManagementPage: UserManagementPage;
|
||||
let workflowContext: UserWorkflowContext;
|
||||
|
||||
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);
|
||||
userManagementPage = new UserManagementPage(page);
|
||||
|
||||
workflowContext = {
|
||||
page,
|
||||
testLogger,
|
||||
testDataManager,
|
||||
loginPage,
|
||||
userManagementPage
|
||||
};
|
||||
|
||||
testReporter.startSuite('用户生命周期端到端测试');
|
||||
});
|
||||
|
||||
test.afterAll(async () => {
|
||||
// 清理测试数据
|
||||
await testDataManager.cleanupAll();
|
||||
|
||||
// 生成测试报告
|
||||
testReporter.endSuite();
|
||||
testReporter.generateHTMLReport('用户生命周期E2E测试报告');
|
||||
testReporter.generateJSONReport();
|
||||
testReporter.generateJUnitReport();
|
||||
|
||||
await page.close();
|
||||
});
|
||||
|
||||
test.beforeEach(async () => {
|
||||
testLogger.info('🔄 开始新的测试用例');
|
||||
});
|
||||
|
||||
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 = createUserWorkflow(workflowContext);
|
||||
const result = await workflowExecutor.execute(workflow, {
|
||||
maxRetries: 3,
|
||||
retryDelay: 2000,
|
||||
enableRollback: true
|
||||
});
|
||||
|
||||
expect(result.success).toBe(true);
|
||||
expect(workflowContext.createdUser).toBeDefined();
|
||||
|
||||
testReporter.endTest('passed');
|
||||
} catch (error) {
|
||||
testReporter.endTest('failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该成功编辑现有用户', async () => {
|
||||
testReporter.startTest('编辑现有用户');
|
||||
|
||||
try {
|
||||
// 首先创建一个用户用于编辑
|
||||
const createWorkflow = createUserWorkflow(workflowContext);
|
||||
await workflowExecutor.execute(createWorkflow, {
|
||||
maxRetries: 3,
|
||||
enableRollback: true
|
||||
});
|
||||
|
||||
expect(workflowContext.createdUser).toBeDefined();
|
||||
|
||||
// 然后编辑该用户
|
||||
const editWorkflow = editUserWorkflow(workflowContext, workflowContext.createdUser?.username);
|
||||
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 = createUserWorkflow(workflowContext);
|
||||
await workflowExecutor.execute(createWorkflow, {
|
||||
maxRetries: 3,
|
||||
enableRollback: true
|
||||
});
|
||||
|
||||
expect(workflowContext.createdUser).toBeDefined();
|
||||
|
||||
// 然后删除该用户
|
||||
const deleteWorkflow = deleteUserWorkflow(workflowContext, workflowContext.createdUser?.username);
|
||||
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 workflow = userLifecycleWorkflow(workflowContext);
|
||||
const result = await workflowExecutor.execute(workflow, {
|
||||
maxRetries: 3,
|
||||
retryDelay: 2000,
|
||||
enableRollback: true,
|
||||
timeout: 300000 // 5分钟超时
|
||||
});
|
||||
|
||||
expect(result.success).toBe(true);
|
||||
expect(result.completedSteps).toContain('createUser');
|
||||
expect(result.completedSteps).toContain('editUser');
|
||||
expect(result.completedSteps).toContain('deleteUser');
|
||||
|
||||
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 = createUserWorkflow(workflowContext);
|
||||
|
||||
// 第一次创建
|
||||
const result1 = await workflowExecutor.execute(workflow, {
|
||||
maxRetries: 3,
|
||||
enableRollback: false
|
||||
});
|
||||
expect(result1.success).toBe(true);
|
||||
|
||||
// 尝试创建相同用户名的用户(应该失败)
|
||||
const duplicateWorkflow = createUserWorkflow({
|
||||
...workflowContext,
|
||||
createdUser: {
|
||||
...workflowContext.createdUser!,
|
||||
username: workflowContext.createdUser!.username // 使用相同的用户名
|
||||
}
|
||||
});
|
||||
|
||||
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 = [];
|
||||
|
||||
// 创建5个用户
|
||||
for (let i = 0; i < 5; i++) {
|
||||
const context: UserWorkflowContext = {
|
||||
page,
|
||||
testLogger,
|
||||
testDataManager,
|
||||
loginPage,
|
||||
userManagementPage
|
||||
};
|
||||
workflows.push(createUserWorkflow(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); // 至少3个成功
|
||||
|
||||
testReporter.endTest('passed');
|
||||
} catch (error) {
|
||||
testReporter.endTest('failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user