# 维修分类功能完整测试方案 ## 🎯 测试概览 **测试时间**: 2025-07-01 **测试工具**: Cursor + Playwright MCP **测试范围**: 物业管理 > 维修分类完整功能测试 **测试类型**: 端到端自动化测试 **预计执行时间**: 45-60 分钟 ## 📋 测试准备 ### 1. 环境要求 - ✅ 系统正常运行 (前端: http://localhost:80, 后端: http://localhost:8080) - ✅ 测试用户账号 (admin/admin123) - ✅ Cursor 编辑器已安装 Playwright MCP 插件 - ✅ 浏览器环境 (Chrome/Edge) ### 2. 测试数据准备 ```json { "testCategories": [ { "categoryName": "测试电路维修", "categoryCode": "TEST_ELECTRIC_001", "categoryDescription": "测试用电路维修分类", "skillLevel": "2", "estimatedDuration": "120", "standardCost": "200.00" }, { "categoryName": "测试水暖维修", "categoryCode": "TEST_PLUMBING_001", "categoryDescription": "测试用水暖维修分类", "skillLevel": "2", "estimatedDuration": "150", "standardCost": "300.00" } ] } ``` ## 🧪 测试执行计划 ### 阶段一:基础功能测试 (15 分钟) #### TC001: 页面加载和基础展示测试 **测试目标**: 验证维修分类页面正常加载和数据展示 **Playwright MCP 执行步骤**: 1. **导航到测试页面** ```javascript // 在Cursor中使用Playwright MCP await browser.navigate('http://localhost:80/hq/pm/repairCategory'); ``` 2. **验证页面加载** ```javascript // 等待页面完全加载 await browser.waitFor(2000); // 验证页面标题 const pageTitle = await browser.snapshot(); // 检查页面是否包含"维修分类"字样 ``` 3. **验证核心元素存在** - 搜索框 - 新增按钮 - 表格区域 - 分页组件 **验证要点**: - ✅ 页面在 3 秒内完全加载 - ✅ 标题显示"维修分类" - ✅ 数据表格正常展示 - ✅ 操作按钮可见且可点击 #### TC002: 数据列表展示测试 **测试目标**: 验证维修分类数据正确展示 **执行步骤**: 1. 检查默认数据加载 2. 验证表格列显示完整 3. 验证数据格式正确性 **验证要点**: - ✅ 表格列标题正确 (分类名称、编码、状态等) - ✅ 数据行显示完整 - ✅ 分页信息正确 ### 阶段二:CRUD 操作测试 (20 分钟) #### TC003: 新增维修分类测试 **测试目标**: 验证新增维修分类功能完整性 **Playwright MCP 执行步骤**: 1. **点击新增按钮** ```javascript // 获取页面快照识别新增按钮 const snapshot = await browser.snapshot(); // 点击"新增"按钮 await browser.click('新增按钮', "button[contains(text(), '新增')]"); ``` 2. **填写表单信息** ```javascript // 等待弹窗出现 await browser.waitFor(1000); // 填写分类名称 await browser.type('分类名称输入框', "input[placeholder*='分类名称']", '测试电路维修'); // 填写分类编码 await browser.type('分类编码输入框', "input[placeholder*='分类编码']", 'TEST_ELECTRIC_001'); // 填写描述信息 await browser.type('描述输入框', "textarea[placeholder*='描述']", '测试用电路维修分类'); // 选择技能等级 await browser.click('技能等级下拉', "select[placeholder*='技能等级']"); await browser.selectOption('技能等级选项', 'select', ['2']); // 填写预估时长 await browser.type('预估时长输入框', "input[placeholder*='预估时长']", '120'); // 填写标准成本 await browser.type('标准成本输入框', "input[placeholder*='标准成本']", '200.00'); ``` 3. **提交表单** ```javascript // 点击确定按钮 await browser.click('确定按钮', "button[contains(text(), '确定')]"); // 等待操作完成 await browser.waitFor(2000); ``` 4. **验证新增结果** ```javascript // 检查成功提示消息 const snapshot = await browser.snapshot(); // 验证是否显示"操作成功"提示 // 检查列表中是否包含新增的数据 // 搜索新增的分类 await browser.type('搜索框', "input[placeholder*='分类名称']", '测试电路维修'); await browser.click('搜索按钮', "button[contains(text(), '搜索')]"); await browser.waitFor(1000); ``` **验证要点**: - ✅ 表单验证规则正确执行 - ✅ 必填字段验证有效 - ✅ 数据格式验证正确 - ✅ 新增操作成功提示 - ✅ 新增数据在列表中可见 #### TC004: 编辑维修分类测试 **测试目标**: 验证编辑维修分类功能 **执行步骤**: 1. **定位编辑目标** ```javascript // 在表格中找到刚创建的分类行 const snapshot = await browser.snapshot(); // 点击对应行的编辑按钮 await browser.click('编辑按钮', "button[contains(text(), '修改')]"); ``` 2. **修改表单信息** ```javascript // 等待编辑弹窗 await browser.waitFor(1000); // 修改分类名称 await browser.type('分类名称输入框', "input[placeholder*='分类名称']", '测试电路维修-已修改'); // 修改描述 await browser.type('描述输入框', "textarea[placeholder*='描述']", '已修改的测试用电路维修分类'); // 修改预估时长 await browser.type('预估时长输入框', "input[placeholder*='预估时长']", '150'); ``` 3. **保存修改** ```javascript await browser.click('确定按钮', "button[contains(text(), '确定')]"); await browser.waitFor(2000); ``` **验证要点**: - ✅ 编辑表单预填充原数据 - ✅ 修改操作执行成功 - ✅ 修改后数据正确更新 #### TC005: 删除维修分类测试 **测试目标**: 验证删除维修分类功能和安全性 **执行步骤**: 1. **执行删除操作** ```javascript // 定位到要删除的行 const snapshot = await browser.snapshot(); // 点击删除按钮 await browser.click('删除按钮', "button[contains(text(), '删除')]"); // 等待确认弹窗 await browser.waitFor(500); ``` 2. **确认删除** ```javascript // 在确认弹窗中点击确定 await browser.click('确认删除', "button[contains(text(), '确定')]"); await browser.waitFor(2000); ``` 3. **验证删除结果** ```javascript // 搜索已删除的分类,确认不再存在 await browser.type('搜索框', "input[placeholder*='分类名称']", '测试电路维修-已修改'); await browser.click('搜索按钮', "button[contains(text(), '搜索')]"); await browser.waitFor(1000); // 验证搜索结果为空 const snapshot = await browser.snapshot(); ``` **验证要点**: - ✅ 删除确认机制有效 - ✅ 删除操作执行成功 - ✅ 数据物理删除或逻辑删除正确 ### 阶段三:树形结构测试 (10 分钟) #### TC006: 树形结构展示测试 **测试目标**: 验证维修分类树形结构正确展示 **执行步骤**: 1. **创建父级分类** ```javascript // 新增父级分类 await browser.click('新增按钮', "button[contains(text(), '新增')]"); await browser.waitFor(1000); await browser.type('分类名称输入框', "input[placeholder*='分类名称']", '测试父级分类'); await browser.type('分类编码输入框', "input[placeholder*='分类编码']", 'TEST_PARENT_001'); await browser.type('描述输入框', "textarea[placeholder*='描述']", '测试用父级分类'); await browser.click('确定按钮', "button[contains(text(), '确定')]"); await browser.waitFor(2000); ``` 2. **创建子级分类** ```javascript // 定位到父级分类行,点击新增子类按钮 const snapshot = await browser.snapshot(); await browser.click('新增子类按钮', "button[contains(text(), '新增子类')]"); await browser.waitFor(1000); await browser.type('分类名称输入框', "input[placeholder*='分类名称']", '测试子级分类'); await browser.type('分类编码输入框', "input[placeholder*='分类编码']", 'TEST_CHILD_001'); // 验证父级已自动选中 const snapshot2 = await browser.snapshot(); await browser.click('确定按钮', "button[contains(text(), '确定')]"); await browser.waitFor(2000); ``` 3. **验证树形结构** ```javascript // 检查树形展示 const snapshot = await browser.snapshot(); // 验证父子关系正确显示 // 验证展开/折叠功能 ``` **验证要点**: - ✅ 父子级关系正确建立 - ✅ 树形结构正确展示 - ✅ 展开/折叠功能正常 - ✅ 层级缩进正确显示 ### 阶段四:搜索和过滤测试 (8 分钟) #### TC007: 搜索功能测试 **测试目标**: 验证各种搜索条件的有效性 **执行步骤**: 1. **按分类名称搜索** ```javascript await browser.type('分类名称搜索', "input[placeholder*='分类名称']", '电路'); await browser.click('搜索按钮', "button[contains(text(), '搜索')]"); await browser.waitFor(1000); // 验证搜索结果 const snapshot = await browser.snapshot(); ``` 2. **按分类编码搜索** ```javascript // 重置搜索条件 await browser.click('重置按钮', "button[contains(text(), '重置')]"); await browser.waitFor(1000); await browser.type('分类编码搜索', "input[placeholder*='分类编码']", 'ELECTRIC'); await browser.click('搜索按钮', "button[contains(text(), '搜索')]"); await browser.waitFor(1000); ``` 3. **按状态过滤** ```javascript await browser.click('状态下拉', "select[placeholder*='状态']"); await browser.selectOption('状态选项', 'select', ['1']); await browser.click('搜索按钮', "button[contains(text(), '搜索')]"); await browser.waitFor(1000); ``` **验证要点**: - ✅ 搜索结果准确匹配 - ✅ 多条件组合搜索有效 - ✅ 重置功能正常工作 - ✅ 过滤条件正确应用 ### 阶段五:权限控制测试 (5 分钟) #### TC008: 权限验证测试 **测试目标**: 验证不同角色的权限控制 **执行步骤**: 1. **管理员权限验证** ```javascript // 当前为admin登录,验证所有功能可用 const snapshot = await browser.snapshot(); // 检查新增、编辑、删除按钮都可见 ``` 2. **普通用户权限验证** (如果有不同角色) ```javascript // 注:这里需要切换到普通用户登录测试 // 验证权限限制是否生效 ``` **验证要点**: - ✅ 操作按钮显示/隐藏正确 - ✅ 权限验证有效执行 - ✅ 无权限操作被正确拦截 ### 阶段六:异常情况测试 (7 分钟) #### TC009: 数据验证测试 **测试目标**: 验证各种异常输入的处理 **执行步骤**: 1. **必填字段验证** ```javascript // 尝试提交空表单 await browser.click('新增按钮', "button[contains(text(), '新增')]"); await browser.waitFor(1000); await browser.click('确定按钮', "button[contains(text(), '确定')]"); // 验证错误提示 const snapshot = await browser.snapshot(); ``` 2. **数据格式验证** ```javascript // 测试无效的数据格式 await browser.type('分类编码输入框', "input[placeholder*='分类编码']", '特殊字符@#$'); await browser.type('预估时长输入框', "input[placeholder*='预估时长']", 'abc'); await browser.type('标准成本输入框', "input[placeholder*='标准成本']", '-100'); await browser.click('确定按钮', "button[contains(text(), '确定')]"); // 验证格式验证错误提示 ``` 3. **重复数据验证** ```javascript // 尝试创建重复编码的分类 await browser.type('分类编码输入框', "input[placeholder*='分类编码']", 'ELECTRIC'); // 验证重复性验证 ``` **验证要点**: - ✅ 必填字段验证有效 - ✅ 数据格式验证正确 - ✅ 重复性验证生效 - ✅ 错误提示清晰准确 ## 📊 测试执行清单 ### 执行前检查 - [ ] 系统环境正常运行 - [ ] 测试数据已准备 - [ ] Playwright MCP 插件已安装 - [ ] 测试用户账号可用 ### 测试执行记录 | 测试用例 | 预期结果 | 实际结果 | 状态 | 备注 | | ------------------- | -------------------------- | -------- | ------ | ---- | | TC001: 页面加载测试 | 页面正常加载,元素完整显示 | | 待执行 | | | TC002: 数据列表展示 | 数据正确展示,格式规范 | | 待执行 | | | TC003: 新增分类测试 | 新增操作成功,数据保存 | | 待执行 | | | TC004: 编辑分类测试 | 编辑操作成功,数据更新 | | 待执行 | | | TC005: 删除分类测试 | 删除操作成功,数据移除 | | 待执行 | | | TC006: 树形结构测试 | 树形关系正确,展示正常 | | 待执行 | | | TC007: 搜索功能测试 | 搜索结果准确,过滤有效 | | 待执行 | | | TC008: 权限控制测试 | 权限验证有效,控制正确 | | 待执行 | | | TC009: 异常情况测试 | 异常处理正确,提示清晰 | | 待执行 | | ## 🎯 测试成功标准 ### 功能性标准 - ✅ 所有 CRUD 操作正常执行 - ✅ 树形结构正确展示和操作 - ✅ 搜索过滤功能准确有效 - ✅ 数据验证规则正确执行 ### 易用性标准 - ✅ 用户界面友好直观 - ✅ 操作响应及时顺畅 - ✅ 错误提示清晰准确 - ✅ 交互流程合理高效 ### 稳定性标准 - ✅ 无系统错误或崩溃 - ✅ 数据一致性良好 - ✅ 并发操作稳定 - ✅ 异常恢复能力强 ## 📋 问题记录模板 ### 问题报告格式 ```markdown **问题编号**: BUG-001 **问题标题**: [简短描述] **测试用例**: TC001 **严重级别**: 高/中/低 **问题描述**: - 操作步骤: - 预期结果: - 实际结果: **重现步骤**: 1. ... 2. ... **影响范围**: **修复建议**: **发现时间**: 2025-07-01 **发现人员**: [测试人员] ``` ## 📈 测试结果分析 ### 执行后填写 **测试覆盖率**: _% **通过率**: _% **发现问题数**: *个 **严重问题数**: *个 ### 总体评估 **功能完整性**: [优秀/良好/一般/需改进] **系统稳定性**: [优秀/良好/一般/需改进] **用户体验**: [优秀/良好/一般/需改进] ### 改进建议 1. [基于测试结果的改进建议] 2. [性能优化建议] 3. [用户体验优化建议] --- **测试执行人员**: [测试人员姓名] **测试完成时间**: [实际完成时间] **文档路径**: `docs/测试文档/后勤管理/物业管理/维修分类/维修分类功能完整测试方案.md`