import { test, expect } from './test-fixtures.js'; /** * 菜单管理模块完整测试套件 * 采用TDD方法:Red -> Green -> Refactor * 测试覆盖:CRUD操作、树形结构、搜索、表单验证 */ test.describe('菜单管理 - 列表功能', () => { test.beforeEach(async ({ pageObjects, testData, testLogger }) => { testLogger.info('开始菜单管理列表测试套件'); await pageObjects.loginPage.navigate(); await pageObjects.loginPage.login(testData.admin.username, testData.admin.password); await pageObjects.dashboardPage.waitForLoad(); await pageObjects.menuManagementPage.navigate(); await pageObjects.menuManagementPage.waitForLoad(); }); test.afterEach(async ({ testLogger, helpers }) => { testLogger.info('菜单管理列表测试用例完成'); await helpers.screenshot.takeScreenshot('after-menu-list-test'); }); test('应该显示菜单树形结构', async ({ pageObjects, testLogger }) => { testLogger.startTest('菜单树形结构显示'); try { const nodeCount = await pageObjects.menuManagementPage.getTreeNodeCount(); expect(nodeCount).toBeGreaterThanOrEqual(0); testLogger.endTest('菜单树形结构显示', 'passed'); } catch (error) { testLogger.endTest('菜单树形结构显示', 'failed', error as Error); throw error; } }); test('应该能够搜索菜单', async ({ pageObjects, testLogger }) => { testLogger.startTest('搜索菜单功能'); try { await pageObjects.menuManagementPage.searchMenu('系统'); const menuCount = await pageObjects.menuManagementPage.getMenuCount(); expect(menuCount).toBeGreaterThanOrEqual(0); testLogger.endTest('搜索菜单功能', 'passed'); } catch (error) { testLogger.endTest('搜索菜单功能', 'failed', error as Error); throw error; } }); test('应该能够展开树节点', async ({ pageObjects, testLogger }) => { testLogger.startTest('展开树节点'); try { await pageObjects.menuManagementPage.expandTreeNode(0); testLogger.endTest('展开树节点', 'passed'); } catch (error) { testLogger.endTest('展开树节点', 'failed', error as Error); throw error; } }); }); test.describe('菜单管理 - 创建菜单', () => { test.beforeEach(async ({ pageObjects, testData, testLogger }) => { testLogger.info('开始创建菜单测试套件'); await pageObjects.loginPage.navigate(); await pageObjects.loginPage.login(testData.admin.username, testData.admin.password); await pageObjects.dashboardPage.waitForLoad(); await pageObjects.menuManagementPage.navigate(); await pageObjects.menuManagementPage.waitForLoad(); }); test('应该成功创建新菜单', async ({ pageObjects, testData, testLogger, helpers }) => { testLogger.startTest('创建新菜单'); try { await pageObjects.menuManagementPage.clickAddMenu(); await helpers.form.fillForm({ menuName: testData.menu.name, menuType: testData.menu.menuType, path: testData.menu.path, icon: testData.menu.icon, status: testData.menu.status }); await helpers.form.submitForm(); const successMessage = await pageObjects.menuManagementPage.getSuccessMessage(); expect(successMessage).toBeTruthy(); testLogger.endTest('创建新菜单', 'passed'); } catch (error) { testLogger.endTest('创建新菜单', 'failed', error as Error); throw error; } }); test('应该验证菜单名称不能为空', async ({ pageObjects, testData, testLogger, helpers }) => { testLogger.startTest('菜单名称空值验证'); try { await pageObjects.menuManagementPage.clickAddMenu(); await helpers.form.fillForm({ menuType: testData.menu.menuType, path: testData.menu.path, icon: testData.menu.icon }); await helpers.form.submitForm(); const errorMessage = await pageObjects.menuManagementPage.getErrorMessage(); expect(errorMessage).toBeTruthy(); testLogger.endTest('菜单名称空值验证', 'passed'); } catch (error) { testLogger.endTest('菜单名称空值验证', 'failed', error as Error); throw error; } }); test('应该验证菜单路径不能为空', async ({ pageObjects, testData, testLogger, helpers }) => { testLogger.startTest('菜单路径空值验证'); try { await pageObjects.menuManagementPage.clickAddMenu(); await helpers.form.fillForm({ menuName: testData.menu.name, menuType: testData.menu.menuType, icon: testData.menu.icon }); await helpers.form.submitForm(); const errorMessage = await pageObjects.menuManagementPage.getErrorMessage(); expect(errorMessage).toBeTruthy(); testLogger.endTest('菜单路径空值验证', 'passed'); } catch (error) { testLogger.endTest('菜单路径空值验证', 'failed', error as Error); throw error; } }); }); test.describe('菜单管理 - 编辑菜单', () => { test.beforeEach(async ({ pageObjects, testData, testLogger }) => { testLogger.info('开始编辑菜单测试套件'); await pageObjects.loginPage.navigate(); await pageObjects.loginPage.login(testData.admin.username, testData.admin.password); await pageObjects.dashboardPage.waitForLoad(); await pageObjects.menuManagementPage.navigate(); await pageObjects.menuManagementPage.waitForLoad(); }); test('应该成功编辑菜单信息', async ({ pageObjects, testData, testLogger, helpers }) => { testLogger.startTest('编辑菜单信息'); try { // 先搜索菜单 await pageObjects.menuManagementPage.searchMenu(testData.menu.name); // 点击编辑按钮 await pageObjects.menuManagementPage.clickEditMenu(testData.menu.name); // 修改菜单图标 const updatedIcon = 'SettingOutlined'; await helpers.form.fillField('input[name="icon"]', updatedIcon); await helpers.form.submitForm(); const successMessage = await pageObjects.menuManagementPage.getSuccessMessage(); expect(successMessage).toBeTruthy(); testLogger.endTest('编辑菜单信息', 'passed'); } catch (error) { testLogger.endTest('编辑菜单信息', 'failed', error as Error); throw error; } }); }); test.describe('菜单管理 - 删除菜单', () => { test.beforeEach(async ({ pageObjects, testData, testLogger }) => { testLogger.info('开始删除菜单测试套件'); await pageObjects.loginPage.navigate(); await pageObjects.loginPage.login(testData.admin.username, testData.admin.password); await pageObjects.dashboardPage.waitForLoad(); await pageObjects.menuManagementPage.navigate(); await pageObjects.menuManagementPage.waitForLoad(); }); test('应该成功删除菜单', async ({ pageObjects, testData, testLogger }) => { testLogger.startTest('删除菜单'); try { // 先搜索菜单 await pageObjects.menuManagementPage.searchMenu(testData.menu.name); // 点击删除按钮 await pageObjects.menuManagementPage.clickDeleteMenu(testData.menu.name); // 确认删除 await pageObjects.menuManagementPage.confirmDelete(); const successMessage = await pageObjects.menuManagementPage.getSuccessMessage(); expect(successMessage).toBeTruthy(); testLogger.endTest('删除菜单', 'passed'); } catch (error) { testLogger.endTest('删除菜单', 'failed', error as Error); throw error; } }); }); test.describe('菜单管理 - 端到端流程', () => { test('应该完成完整的菜单CRUD流程', async ({ pageObjects, testData, testLogger, helpers }) => { testLogger.startTest('完整菜单CRUD流程'); try { // 步骤1: 登录 testLogger.startStep('用户登录'); await pageObjects.loginPage.navigate(); await pageObjects.loginPage.login(testData.admin.username, testData.admin.password); await pageObjects.dashboardPage.waitForLoad(); testLogger.endStep('用户登录', 'passed'); // 步骤2: 导航到菜单管理 testLogger.startStep('导航到菜单管理'); await pageObjects.menuManagementPage.navigate(); await pageObjects.menuManagementPage.waitForLoad(); testLogger.endStep('导航到菜单管理', 'passed'); // 步骤3: 创建菜单 testLogger.startStep('创建新菜单'); await pageObjects.menuManagementPage.clickAddMenu(); await helpers.form.fillForm({ menuName: testData.menu.name, menuType: testData.menu.menuType, path: testData.menu.path, icon: testData.menu.icon, status: testData.menu.status }); await helpers.form.submitForm(); testLogger.endStep('创建新菜单', 'passed'); // 步骤4: 搜索菜单 testLogger.startStep('搜索菜单'); await pageObjects.menuManagementPage.searchMenu(testData.menu.name); const menuCount = await pageObjects.menuManagementPage.getMenuCount(); expect(menuCount).toBeGreaterThanOrEqual(0); testLogger.endStep('搜索菜单', 'passed'); // 步骤5: 编辑菜单 testLogger.startStep('编辑菜单'); await pageObjects.menuManagementPage.clickEditMenu(testData.menu.name); await helpers.form.fillField('input[name="icon"]', 'SettingOutlined'); await helpers.form.submitForm(); testLogger.endStep('编辑菜单', 'passed'); // 步骤6: 删除菜单 testLogger.startStep('删除菜单'); await pageObjects.menuManagementPage.searchMenu(testData.menu.name); await pageObjects.menuManagementPage.clickDeleteMenu(testData.menu.name); await pageObjects.menuManagementPage.confirmDelete(); testLogger.endStep('删除菜单', 'passed'); testLogger.endTest('完整菜单CRUD流程', 'passed'); } catch (error) { testLogger.endTest('完整菜单CRUD流程', 'failed', error as Error); throw error; } }); });