# Ether 物业管理系统 - 测试计划 **文档版本**: v1.0 **创建日期**: 2026-05-18 **适用范围**: Ether PMS 全系统测试 --- ## 一、测试策略 ### 1.1 测试目标 - 确保所有已实现功能的API接口正确性,API测试通过率 >= 95% - 确保核心业务流程端到端可用,E2E测试通过率 >= 90% - 建立TDD开发规范,新功能必须先写测试再实现 - 为6大业务域建立完整的测试用例体系 - 覆盖5条跨域业务流程的端到端验证 ### 1.2 测试范围 **6大业务域**: | 业务域 | 模块 | 核心功能 | 已实现需求数 | |--------|------|---------|-------------| | 身份与权限域 | module-auth | 用户/角色/权限/部门/认证/审计 | 37 | | 空间与项目域 | module-mdm | 项目/空间节点/巡检标准 | 23 | | 设备与资产域 | module-asset | 设备台账/扩展表/健康评分/故障/归属 | 28 | | 运营与服务域 | module-wo + module-mdm | 工单/维保/巡检/备件/能耗 | 36 | | 财务与收费域 | module-finance(待建) | 收费项目/账单/支付/退款 | 0 | | 前端交互域 | ether-admin | 登录/权限/项目切换/各模块页面 | 14 | **5条跨域业务流程**: 1. 业主报修全流程(认证 -> 空间定位 -> 工单创建 -> 派单 -> 执行 -> 验收) 2. 设备全生命周期管理(采购 -> 安装 -> 运行监控 -> 维保 -> 报废) 3. 预防性维保调度流程(计划 -> 周期调度 -> 任务生成 -> 执行 -> 验收 -> 设备联动) 4. 巡检异常处理流程(模板 -> 签到 -> 异常上报 -> 工单 -> 处理 -> 复检) 5. 能耗计费流程(计量点 -> 抄表 -> 费用计算 -> 账单 -> 缴费) ### 1.3 测试层级 | 测试层级 | 工具 | 目标 | 执行频率 | |---------|------|------|---------| | 单元测试 | JUnit 5 + Mockito | Service层业务逻辑、算法验证 | 每次提交 | | API接口测试 | Shell curl脚本 | REST API正确性、状态码、响应格式 | 每日构建 | | E2E端到端测试 | Playwright + TypeScript | 用户操作流程、跨域业务闭环 | 每日构建 | ### 1.4 TDD开发规范 **强制要求**:所有新功能开发必须遵循TDD流程。 ``` 1. 红(Red) - 先编写失败的测试用例 2. 绿(Green) - 编写最小代码使测试通过 3. 重构(Refactor) - 优化代码结构,保持测试通过 ``` **TDD准入规则**: - 新增功能必须先编写测试用例,无测试用例的PR不予合并 - Bug修复必须先编写复现测试,验证修复后测试通过 - 重构必须确保既有测试全部通过 --- ## 二、测试环境 ### 2.1 后端测试环境 | 项目 | 配置 | |------|------| | 框架 | Spring Boot 3.x Test | | 单元测试 | JUnit 5 + Mockito | | 集成测试 | Spring Boot Test + @WebMvcTest / @SpringBootTest | | 数据库 | H2内存数据库(单元测试) / PostgreSQL Testcontainers(集成测试) | | 后端地址 | http://localhost:8080 | | 认证方式 | JWT Token (Authorization: Bearer {token}) | ### 2.2 前端测试环境 | 项目 | 配置 | |------|------| | 单元测试 | Vitest | | E2E测试 | Playwright | | 管理后台地址 | http://localhost:5175 | | 浏览器 | Chromium (CI) / Chrome (本地) | ### 2.3 测试数据管理 **测试数据准备**: - 每个测试脚本开头通过API创建所需测试数据 - 使用固定的测试账号:admin / admin123 - 测试项目使用固定编码前缀:TEST- - 测试数据命名规范:[TEST]-[模块]-[功能]-[序号] **测试数据清理**: - 每个测试脚本结尾删除创建的测试数据 - 使用唯一标识避免数据冲突 - API测试使用独立项目隔离数据 --- ## 三、API接口测试 ### 3.1 测试框架选型 | 方案 | 选定 | 说明 | |------|------|------| | Shell curl脚本 | 是 | 轻量级,无额外依赖,适合CI环境 | | Postman Collection | 否 | 需要GUI,不适合自动化CI | | Newman | 备选 | 可从Postman Collection导出运行 | ### 3.2 测试脚本组织 ``` 04-TESTING/api/ auth/ - 认证授权域API测试 test-auth.sh space/ - 空间与项目域API测试 test-space.sh asset/ - 设备与资产域API测试 test-asset.sh ops/ - 运营与服务域API测试 test-ops.sh finance/ - 财务与收费域API测试 test-finance.sh run-all.sh - 执行全部API测试 run-module.sh - 执行指定模块API测试 ``` ### 3.3 测试脚本规范 每个API测试脚本必须包含: 1. **前置条件** - 登录获取Token、创建依赖数据 2. **请求** - curl发送HTTP请求,携带正确的Header 3. **断言** - 检查HTTP状态码、响应JSON字段 4. **清理** - 删除测试创建的数据 **脚本结构**: ```bash #!/bin/bash BASE_URL="http://localhost:8080/api" TOKEN="" login() { ... } test_XXX() { local response=$(curl -s -w "\n%{http_code}" ...) local body=$(echo "$response" | head -n -1) local status=$(echo "$response" | tail -n 1) assert_eq "$status" "200" "test_XXX" } cleanup() { ... } login test_XXX cleanup print_summary ``` ### 3.4 测试脚本目录结构 ``` 04-TESTING/api/ auth/test-auth.sh - 认证授权域API测试 space/test-space.sh - 空间与项目域API测试 asset/test-asset.sh - 设备与资产域API测试 ops/test-ops.sh - 运营与服务域API测试 finance/test-finance.sh - 财务与收费域API测试 run-all.sh - 执行全部API测试 run-module.sh - 执行指定模块API测试 ``` --- ## 四、E2E端到端测试 ### 4.1 测试框架选型 | 项目 | 配置 | |------|------| | 框架 | Playwright | | 语言 | TypeScript | | 运行器 | Playwright Test | | 浏览器 | Chromium | | 设计模式 | Page Object Model | ### 4.2 测试场景设计 **5条跨域业务流程**: | 编号 | 流程名称 | 涉及域 | 关键步骤 | |------|---------|--------|---------| | E2E-CROSS-001 | 业主报修全流程 | auth+space+ops | 登录->选项目->定位设备->创建工单->派单->执行->完成->验收 | | E2E-CROSS-002 | 设备全生命周期 | asset+ops | 创建设备->关联空间->录入扩展表->健康评分->创建维保->完成->报废 | | E2E-CROSS-003 | 预防性维保调度 | ops+asset | 创建维保计划->创建维保任务->分配->执行->完成->验收->设备联动 | | E2E-CROSS-004 | 巡检异常处理 | ops+asset | 创建巡检模板->执行巡检->上报异常->创建工单->处理->复检 | | E2E-CROSS-005 | 能耗计费流程 | ops+finance | 创建计量点->抄表录入->费用计算->生成账单->缴费 | **各域核心操作**: | 域 | 测试场景 | |----|---------| | auth | 登录/登出/Token刷新/密码修改/角色分配 | | space | 项目创建/空间树构建/节点CRUD | | asset | 设备创建/扩展表管理/健康评分查询 | | ops | 工单全流程/维保任务/备件出入库 | | finance | 收费项目/账单生成/支付登记 | ### 4.3 Page Object模式设计 ``` pages/ LoginPage.ts - 登录页:用户名/密码输入、登录按钮、错误提示 DashboardPage.ts - 仪表盘:菜单导航、项目选择器、数据概览 WorkOrderPage.ts - 工单页:列表/创建/详情/派单/执行/完成/验收 EquipmentPage.ts - 设备页:列表/创建/详情/健康评分 SpacePage.ts - 空间页:空间树/节点管理 MaintenancePage.ts - 维保页:计划列表/任务列表 ``` ### 4.4 测试脚本目录结构 ``` 04-TESTING/e2e/ specs/ auth/ login.spec.ts - 登录流程E2E测试 space/ project.spec.ts - 项目管理E2E测试 asset/ equipment.spec.ts - 设备管理E2E测试 ops/ work-order.spec.ts - 工单管理E2E测试 finance/ billing.spec.ts - 财务管理E2E测试 cross-domain/ owner-repair.spec.ts - 业主报修全流程E2E测试 equipment-lifecycle.spec.ts - 设备全生命周期E2E测试 maintenance-schedule.spec.ts - 预防性维保调度E2E测试 fixtures/ test-data.json - 测试数据 pages/ LoginPage.ts - 登录页Page Object DashboardPage.ts - 仪表盘Page Object playwright.config.ts - Playwright配置 run-all.sh - 执行全部E2E测试 run-module.sh - 执行指定模块E2E测试 ``` --- ## 五、测试用例清单 ### 5.1 身份与权限域 | 用例ID | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 | |--------|------|---------|---------|---------|--------| | TC-AUTH-001 | 用户登录-正常 | 用户已存在 | POST /api/auth/login {username, password} | 200, 返回token/userId/roles | P0 | | TC-AUTH-002 | 用户登录-密码错误 | 用户已存在 | POST /api/auth/login {username, wrong_pwd} | 401, 返回错误信息 | P0 | | TC-AUTH-003 | 用户登录-锁定 | 连续5次失败 | 连续5次错误密码登录 | 账户锁定10分钟 | P0 | | TC-AUTH-004 | Token刷新 | 已登录 | POST /api/auth/refresh | 200, 返回新Token | P0 | | TC-AUTH-005 | 获取当前用户 | 已登录 | GET /api/auth/me | 200, 返回用户信息 | P0 | | TC-AUTH-006 | 用户登出 | 已登录 | POST /api/auth/logout | 200 | P0 | | TC-AUTH-007 | 创建用户 | 管理员已登录 | POST /api/auth/users {username, password, userType} | 201, 返回用户ID | P0 | | TC-AUTH-008 | 查询用户列表 | 管理员已登录 | GET /api/auth/users?page=0&size=10 | 200, 返回分页数据 | P0 | | TC-AUTH-009 | 更新用户 | 用户已存在 | PUT /api/auth/users/{id} {realName, phone} | 200, 返回更新后数据 | P0 | | TC-AUTH-010 | 删除用户 | 用户已存在 | DELETE /api/auth/users/{id} | 200 | P1 | | TC-AUTH-011 | 修改密码 | 用户已登录 | PUT /api/auth/users/{id}/password | 200 | P0 | | TC-AUTH-012 | 弱密码拒绝 | 管理员已登录 | POST创建用户 password=123456 | 400, 拒绝弱密码 | P0 | | TC-AUTH-013 | 创建角色 | 管理员已登录 | POST /api/auth/roles {code, name, type} | 201 | P0 | | TC-AUTH-014 | 角色权限分配 | 角色/权限已存在 | POST /api/auth/roles/{id}/permissions | 200 | P0 | | TC-AUTH-015 | 创建权限 | 管理员已登录 | POST /api/auth/permissions {code, name, type} | 201 | P0 | | TC-AUTH-016 | 部门树查询 | 部门已存在 | GET /api/auth/depts/tree | 200, 返回树形结构 | P1 | | TC-AUTH-017 | 部门删除约束 | 部门有子部门 | DELETE /api/auth/depts/{id} | 400, 拒绝删除 | P0 | | TC-AUTH-018 | 项目成员管理 | 项目/用户已存在 | 添加/查询/移除项目成员 | 各操作返回正确结果 | P0 | | TC-AUTH-019 | 住户认证流程 | 住户已存在 | UNVERIFIED->PENDING->VERIFIED | 状态正确流转 | P1 | | TC-AUTH-020 | 审计日志查询 | 操作已产生日志 | GET /api/auth/audit-logs | 200, 返回日志列表 | P1 | ### 5.2 空间与项目域 | 用例ID | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 | |--------|------|---------|---------|---------|--------| | TC-SPACE-001 | 创建项目 | 管理员已登录 | POST /api/mdm/projects {code, name, projectType} | 201, 返回项目ID | P0 | | TC-SPACE-002 | 查询项目列表 | 项目已存在 | GET /api/mdm/projects | 200, 返回分页数据 | P0 | | TC-SPACE-003 | 项目状态流转 | 项目状态PENDING | PUT /api/mdm/projects/{id}/status {status: ACTIVE} | 200 | P0 | | TC-SPACE-004 | 项目删除检查 | 项目有应收费用 | GET /api/mdm/projects/{id}/delete-check | canDelete=false | P0 | | TC-SPACE-005 | 项目配置管理 | 项目已存在 | GET/PUT /api/mdm/projects/{id}/config | 配置正确读写 | P1 | | TC-SPACE-006 | 创建空间节点 | 项目已存在 | POST /api/mdm/space-nodes {name, nodeType} | 201 | P0 | | TC-SPACE-007 | 获取空间树 | 节点已创建 | GET /api/mdm/space-nodes/project/{id}/tree | 200, 返回树形结构 | P0 | | TC-SPACE-008 | 空间节点删除检查 | 节点有子节点 | GET /api/mdm/space-nodes/{id}/delete-check | 返回子节点数 | P0 | | TC-SPACE-009 | 空间节点级联删除 | 节点有子节点 | DELETE /api/mdm/space-nodes/{id}/cascade | 200, 子节点全部删除 | P0 | | TC-SPACE-010 | 巡检标准项CRUD | 管理员已登录 | 创建/查询/更新/删除巡检标准项 | 各操作返回正确结果 | P0 | | TC-SPACE-011 | 巡检模板管理 | 标准项已存在 | 创建/查询/更新/复制巡检模板 | 各操作返回正确结果 | P1 | ### 5.3 设备与资产域 | 用例ID | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 | |--------|------|---------|---------|---------|--------| | TC-ASSET-001 | 创建设备 | 项目/空间已存在 | POST /api/asset/equipment {equipmentCode, name, type} | 201 | P0 | | TC-ASSET-002 | 按项目查询设备 | 设备已存在 | GET /api/asset/equipment/by-project/{projectId} | 200, 返回设备列表 | P0 | | TC-ASSET-003 | 按空间查询设备 | 设备已关联空间 | GET /api/asset/equipment/by-space/{spaceNodeId} | 200, 返回设备列表 | P0 | | TC-ASSET-004 | 设备批量删除 | 多个设备已存在 | POST /api/asset/equipment/batch-delete {ids} | 200 | P1 | | TC-ASSET-005 | 电梯扩展表管理 | 电梯设备已存在 | GET/PUT /api/asset/equipment/{id}/elevator | 扩展表正确读写 | P0 | | TC-ASSET-006 | 暖通扩展表管理 | 暖通设备已存在 | GET/PUT /api/asset/equipment/{id}/hvac | 扩展表正确读写 | P0 | | TC-ASSET-007 | 消防扩展表管理 | 消防设备已存在 | GET/PUT /api/asset/equipment/{id}/fire | 扩展表正确读写 | P0 | | TC-ASSET-008 | 能源计量扩展表管理 | 能源设备已存在 | GET/PUT /api/asset/equipment/{id}/energy | 扩展表正确读写 | P0 | | TC-ASSET-009 | 设备Excel导入 | 准备xlsx文件 | POST /api/asset/equipment/import | 返回successCount/failCount | P1 | | TC-ASSET-010 | 设备Excel导出 | 设备已存在 | GET /api/asset/equipment/export?projectId={id} | 返回xlsx文件 | P1 | | TC-ASSET-011 | 健康评分查询 | 设备已存在 | GET /api/asset/equipment/{id}/health | 200, 返回健康度/等级 | P1 | | TC-ASSET-012 | 故障记录 | 设备已存在 | POST /api/asset/equipment/{id}/failures | 201, 自动计算时长 | P0 | | TC-ASSET-013 | 归属主体CRUD | 管理员已登录 | 创建/查询/更新/删除归属主体 | 各操作返回正确结果 | P1 | | TC-ASSET-014 | 设备统计 | 设备已存在 | GET /api/asset/equipment/statistics/by-type | 200, 返回统计数据 | P1 | ### 5.4 运营与服务域 | 用例ID | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 | |--------|------|---------|---------|---------|--------| | TC-OPS-001 | 创建工单 | 项目/设备已存在 | POST /api/wo/work-orders {title, source, type} | 201, workNo自动生成 | P0 | | TC-OPS-002 | 工单派单 | 工单状态PENDING | POST /api/wo/work-orders/{id}/assign | 200, 状态变ASSIGNED | P0 | | TC-OPS-003 | 工单开始执行 | 工单状态ASSIGNED | POST /api/wo/work-orders/{id}/start | 200, 状态变IN_PROGRESS | P0 | | TC-OPS-004 | 工单完成 | 工单状态IN_PROGRESS | POST /api/wo/work-orders/{id}/complete | 200, 状态变COMPLETED | P0 | | TC-OPS-005 | 工单验收 | 工单状态COMPLETED | POST /api/wo/work-orders/{id}/verify {rating} | 200, 状态变VERIFIED | P0 | | TC-OPS-006 | 工单取消-待分配 | 工单状态PENDING | POST /api/wo/work-orders/{id}/cancel | 200, 状态变CANCELLED | P1 | | TC-OPS-007 | 工单取消-已完成 | 工单状态COMPLETED | POST /api/wo/work-orders/{id}/cancel | 400, 拒绝取消 | P0 | | TC-OPS-008 | 工单统计 | 工单已存在 | GET /api/wo/work-orders/statistics | 200, 返回统计数据 | P1 | | TC-OPS-009 | 创建维保任务 | 设备已存在 | POST /api/wo/maintenance-tasks {equipmentId, type} | 201 | P0 | | TC-OPS-010 | 维保任务状态流转 | 任务状态PENDING | assign->start->complete->verify | 状态正确流转 | P0 | | TC-OPS-011 | 维保任务自动优先级 | 创建紧急维修任务 | POST创建type=EMERGENCY | priority自动为URGENT | P0 | | TC-OPS-012 | 维保任务完成后设备联动 | 任务关联设备 | 完成维保任务 | 设备维保商/下次巡检日期更新 | P0 | | TC-OPS-013 | 备件入库 | 备件已存在 | POST /api/ops/spare-parts/in-stock | 200, currentStock增加 | P0 | | TC-OPS-014 | 备件出库 | 备件库存充足 | POST /api/ops/spare-parts/out-stock | 200, currentStock减少 | P0 | | TC-OPS-015 | 备件出库-库存不足 | 备件库存不足 | POST出库数量>库存 | 400, 拒绝出库 | P0 | | TC-OPS-016 | 低库存预警 | 备件currentStockPARTIAL_PAID->PAID | 状态正确流转 | P0 | | TC-FIN-005 | 线下收款登记 | 账单已存在 | POST /api/finance/fee-payments | 201 | P0 | | TC-FIN-006 | 退款申请 | 支付已完成 | POST /api/finance/fee-refunds | 201 | P1 | | TC-FIN-007 | 滞纳金计算 | 账单逾期 | 自动计算滞纳金 | 金额正确 | P1 | ### 5.6 前端交互域 | 用例ID | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 | |--------|------|---------|---------|---------|--------| | TC-FE-001 | 登录页面-正常登录 | 系统可访问 | 输入用户名密码->点击登录 | 跳转至仪表盘 | P0 | | TC-FE-002 | 登录页面-错误密码 | 系统可访问 | 输入错误密码->点击登录 | 显示错误提示 | P0 | | TC-FE-003 | 项目选择 | 已登录 | 点击项目选择器->选择项目 | 页面数据刷新 | P0 | | TC-FE-004 | 权限控制 | 不同角色用户 | 访问无权限页面/按钮 | 隐藏或禁用 | P0 | | TC-FE-005 | 用户管理页面 | 管理员已登录 | 列表/创建/编辑/删除用户 | 各操作正常 | P0 | | TC-FE-006 | 设备管理页面 | 管理员已登录 | 列表/创建/详情/导入 | 各操作正常 | P0 | | TC-FE-007 | 工单管理页面 | 管理员已登录 | 列表/创建/派单/执行/验收 | 各操作正常 | P0 | ### 5.7 跨域业务流程 | 用例ID | 名称 | 前置条件 | 测试步骤 | 预期结果 | 优先级 | |--------|------|---------|---------|---------|--------| | TC-CROSS-001 | 业主报修全流程 | 业主/设备/维保人员已存在 | 登录->选项目->创建工单->派单->执行->完成->验收 | 工单状态PENDING->VERIFIED | P0 | | TC-CROSS-002 | 设备全生命周期 | 项目/空间已存在 | 创建设备->关联空间->录入扩展表->健康评分->维保->报废 | 设备状态ACTIVE->SCRAPPED | P0 | | TC-CROSS-003 | 预防性维保调度 | 设备/维保计划已存在 | 创建计划->创建任务->分配->执行->完成->验收 | 任务完成+设备信息更新 | P0 | | TC-CROSS-004 | 巡检异常处理 | 巡检模板/设备已存在 | 创建模板->执行巡检->上报异常->创建工单->处理 | 异常问题解决 | P0 | | TC-CROSS-005 | 能耗计费流程 | 计量点/收费项目已存在 | 创建计量点->抄表->费用计算->生成账单->缴费 | 账单状态PAID | P0 | --- ## 六、测试执行与报告 ### 6.1 单模块测试执行 ```bash # API测试 ./04-TESTING/api/run-module.sh auth ./04-TESTING/api/run-module.sh space ./04-TESTING/api/run-module.sh asset ./04-TESTING/api/run-module.sh ops ./04-TESTING/api/run-module.sh finance # E2E测试 ./04-TESTING/e2e/run-module.sh auth ./04-TESTING/e2e/run-module.sh space ./04-TESTING/e2e/run-module.sh asset ./04-TESTING/e2e/run-module.sh ops ./04-TESTING/e2e/run-module.sh finance ./04-TESTING/e2e/run-module.sh cross-domain ``` ### 6.2 全量测试执行 ```bash # API全量测试 ./04-TESTING/api/run-all.sh # E2E全量测试 ./04-TESTING/e2e/run-all.sh ``` ### 6.3 串联测试执行 跨域流程测试需要按顺序执行,确保数据依赖正确: ```bash # 业主报修全流程 ./04-TESTING/e2e/run-module.sh cross-domain ``` ### 6.4 测试报告生成 **API测试报告**: - 脚本执行后自动输出测试摘要(PASS/FAIL/总计/通过率) - 详细日志输出到 04-TESTING/reports/api-{module}-{date}.log **E2E测试报告**: - Playwright HTML报告:04-TESTING/reports/e2e-report/ - 执行命令:`npx playwright test --reporter=html` - 报告内容:通过率、失败截图、执行耗时 **报告指标**: - 总用例数 / 通过数 / 失败数 / 跳过数 - 通过率 = 通过数 / 总用例数 * 100% - 失败分析:按失败原因分类(断言失败/超时/环境问题) ### 6.5 测试报告输出目录 ``` 04-TESTING/reports/ api-auth-YYYYMMDD.log api-space-YYYYMMDD.log api-asset-YYYYMMDD.log api-ops-YYYYMMDD.log api-finance-YYYYMMDD.log e2e-report/ index.html trace/ screenshots/ ``` --- ## 七、测试准入准出标准 ### 7.1 准入标准 代码提交测试必须满足以下条件: | 准入项 | 要求 | |--------|------| | 代码审查 | PR必须经过至少1人审查通过 | | 单元测试 | 新增/修改代码必须有对应单元测试 | | 编译通过 | mvn clean install -DskipTests 无错误 | | 类型检查 | npx vue-tsc --noEmit 无错误 | | API文档 | 新增/修改接口必须更新API文档 | ### 7.2 准出标准 版本发布必须满足以下条件: | 准出项 | 要求 | |--------|------| | API测试通过率 | >= 95% | | E2E测试通过率 | >= 90% | | P0缺陷 | 0个 | | P1缺陷 | 0个 | | P2缺陷 | 不超过5个(需有修复计划) | | 单元测试覆盖率 | 核心Service层 >= 80% | | 性能测试 | 关键接口响应时间 < 500ms | **缺陷优先级定义**: | 级别 | 定义 | 修复时限 | |------|------|---------| | P0 | 系统崩溃/数据丢失/安全漏洞 | 4小时内 | | P1 | 核心功能不可用/业务流程阻断 | 24小时内 | | P2 | 功能异常但有规避方案 | 3个工作日内 | | P3 | UI显示问题/体验优化 | 下个迭代 |