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