# 空间节点管理测试用例文档 > 文档版本:v1.0 > 创建日期:2026-02-16 > 适用范围:空间节点管理模块(MDM服务) --- ## 一、集成测试用例(API 层面) ### 1.1 基础 CRUD 测试 | 用例编号 | 用例名称 | 接口 | 请求参数 | 预期结果 | |----------|----------|------|----------|----------| | IT-001 | 创建楼栋 | POST /api/v1/mdm/space-nodes | `{name: "1号楼", nodeType: "BUILDING", projectId: "xxx"}` | 返回 200,treePath 正确,nodeCode 自动生成 | | IT-002 | 创建单元 | POST /api/v1/mdm/space-nodes | `{name: "1单元", nodeType: "UNIT", parentId: "楼栋ID"}` | parentId 关联正确,treePath 包含父节点 | | IT-003 | 创建房间 | POST /api/v1/mdm/space-nodes | `{name: "101", nodeType: "ROOM", parentId: "单元ID"}` | 层级关系正确,treePath 完整 | | IT-004 | 查询树形结构 | GET /api/v1/mdm/space-nodes/tree | `projectId=xxx` | 返回完整树形结构,包含所有层级 | | IT-005 | 删除节点(无子节点) | DELETE /api/v1/mdm/space-nodes/{id} | 叶子节点ID | 返回 200,节点删除成功 | | IT-006 | 删除节点(有子节点) | DELETE /api/v1/mdm/space-nodes/{id} | 有子节点的ID | 返回 400,提示"存在子节点,无法删除" | | IT-007 | 更新节点信息 | PUT /api/v1/mdm/space-nodes/{id} | `{name: "新名称"}` | 返回 200,信息更新成功 | | IT-008 | 查询节点详情 | GET /api/v1/mdm/space-nodes/{id} | 节点ID | 返回完整节点信息,包含父节点名称 | ### 1.2 批量操作测试 | 用例编号 | 用例名称 | 接口 | 请求参数 | 预期结果 | |----------|----------|------|----------|----------| | IT-010 | 批量创建楼栋 | POST /api/v1/mdm/space-nodes/batch | 17个楼栋数据 | 17个楼栋全部创建成功,返回创建列表 | | IT-011 | 批量创建房间 | POST /api/v1/mdm/space-nodes/batch | 24层 x 4户 = 96个房间数据 | 96个房间批量创建成功,treePath 正确 | | IT-012 | 自动编码-楼栋 | POST /api/v1/mdm/space-nodes/generate-code | `{nodeType: "BUILDING", projectId: "xxx"}` | 返回 `B001`, `B002` 等编码 | | IT-013 | 自动编码-单元 | POST /api/v1/mdm/space-nodes/generate-code | `{nodeType: "UNIT", parentId: "楼栋ID"}` | 返回 `U1`, `U2` 等编码 | | IT-014 | 自动编码-房间 | POST /api/v1/mdm/space-nodes/generate-code | `{nodeType: "ROOM", parentId: "单元ID", floor: 1}` | 返回 `101`, `102` 等编码 | | IT-015 | 批量删除 | DELETE /api/v1/mdm/space-nodes/batch | 多个叶子节点ID列表 | 全部删除成功 | ### 1.2.1 编码规则配置测试 | 用例编号 | 用例名称 | 接口 | 请求参数 | 预期结果 | |----------|----------|------|----------|----------| | IT-016 | 获取编码规则配置 | GET /api/v1/mdm/space-nodes/code-rules | `projectId=xxx` | 返回所有节点类型的编码规则配置 | | IT-017 | 更新编码规则配置 | PUT /api/v1/mdm/space-nodes/code-rules | `{nodeType: "BUILDING", prefix: "A", sequenceDigits: 3}` | 返回 200,配置更新成功 | | IT-018 | 自定义前缀编码 | POST /api/v1/mdm/space-nodes/batch | `{prefix: "A8", sequenceDigits: 3, count: 5}` | 生成 A8001, A8002, A8003... | | IT-019 | 编码预览 | POST /api/v1/mdm/space-nodes/code-preview | `{prefix: "B", sequenceDigits: 2, count: 5}` | 返回 B01, B02, B03, B04, B05 | ### 1.3 项目统计测试 | 用例编号 | 用例名称 | 接口 | 预期结果 | |----------|----------|------|----------| | IT-020 | 楼栋数统计 | GET /api/v1/mdm/space-nodes/stats | `COUNT(node_type='BUILDING')` 与实际数量一致 | | IT-021 | 户数统计 | GET /api/v1/mdm/space-nodes/stats | `COUNT(node_type='ROOM')` 与实际数量一致 | | IT-022 | 车位数统计 | GET /api/v1/mdm/space-nodes/stats | `COUNT(node_type='PARKING_SPACE')` 与实际数量一致 | | IT-023 | 按项目统计 | GET /api/v1/mdm/space-nodes/stats?projectId=xxx | 返回指定项目的统计数据 | | IT-024 | 按类型统计 | GET /api/v1/mdm/space-nodes/stats?nodeType=BUILDING | 返回指定类型的数量 | ### 1.4 异常处理测试 | 用例编号 | 用例名称 | 接口 | 异常场景 | 预期结果 | |----------|----------|------|----------|----------| | IT-030 | 创建节点-无效类型 | POST /api/v1/mdm/space-nodes | `nodeType: "INVALID"` | 返回 400,参数校验失败 | | IT-031 | 创建节点-缺少必填项 | POST /api/v1/mdm/space-nodes | 缺少 `name` 或 `nodeType` | 返回 400,提示必填项缺失 | | IT-032 | 创建节点-父节点不存在 | POST /api/v1/mdm/space-nodes | `parentId: "不存在的ID"` | 返回 400,父节点不存在 | | IT-033 | 创建节点-层级不匹配 | POST /api/v1/mdm/space-nodes | ROOM 的父节点是 BUILDING(跳过 UNIT) | 返回 400,层级关系错误 | | IT-034 | 查询节点-不存在 | GET /api/v1/mdm/space-nodes/{id} | 不存在的ID | 返回 404,节点不存在 | | IT-035 | 重复节点名称 | POST /api/v1/mdm/space-nodes | 同一父节点下相同名称 | 返回 400,名称重复 | ### 1.5 权限控制测试 | 用例编号 | 用例名称 | 接口 | 权限场景 | 预期结果 | |----------|----------|------|----------|----------| | IT-040 | 无权限创建 | POST /api/v1/mdm/space-nodes | 无 `mdm:space:create` 权限 | 返回 403,权限不足 | | IT-041 | 无权限删除 | DELETE /api/v1/mdm/space-nodes/{id} | 无 `mdm:space:delete` 权限 | 返回 403,权限不足 | | IT-042 | 跨项目访问 | GET /api/v1/mdm/space-nodes/{id} | 访问其他项目的节点 | 返回 403,无权访问 | | IT-043 | 只读用户查询 | GET /api/v1/mdm/space-nodes/tree | 仅有查看权限 | 返回 200,可正常查询 | --- ## 二、E2E 测试用例(用户操作层面) ### 2.1 页面导航测试 | 用例编号 | 用例名称 | 前置条件 | 操作步骤 | 预期结果 | |----------|----------|----------|----------|----------| | E2E-001 | 进入空间管理 | 已登录管理员账号 | 项目详情页 -> 点击"空间管理"标签 | 显示空间管理页面,包含树形导航和详情面板 | | E2E-002 | 树形导航展开 | 空间管理页面 | 点击楼栋节点展开图标 | 展开显示该楼栋下的所有单元 | | E2E-003 | 树形导航收起 | 已展开的树节点 | 点击收起图标 | 子节点收起隐藏 | | E2E-004 | 节点搜索 | 空间管理页面 | 在搜索框输入"1号楼" | 树形结构高亮显示匹配节点 | | E2E-005 | 节点定位 | 搜索结果列表 | 点击搜索结果项 | 树形结构自动展开并定位到该节点 | ### 2.2 空间管理操作测试 | 用例编号 | 用例名称 | 前置条件 | 操作步骤 | 预期结果 | |----------|----------|----------|----------|----------| | E2E-010 | 创建楼栋 | 空间管理页面 | 1. 点击"新增楼栋"按钮
2. 填写楼栋名称"测试楼栋A"
3. 点击"保存" | 楼栋创建成功,树形结构自动刷新显示新楼栋 | | E2E-011 | 创建单元 | 已有楼栋 | 1. 选择楼栋节点
2. 点击"新增单元"
3. 填写单元名称"1单元"
4. 点击"保存" | 单元创建成功,显示在楼栋下 | | E2E-012 | 创建房间 | 已有单元 | 1. 选择单元节点
2. 点击"新增房间"
3. 填写房间信息
4. 点击"保存" | 房间创建成功 | | E2E-013 | 批量生成房间 | 已有楼栋 | 1. 选择楼栋节点
2. 点击"批量生成"
3. 输入楼层数24、每层户数4
4. 点击"确认" | 96个房间批量创建成功,显示成功提示 | | E2E-014 | 编辑节点 | 已有节点 | 1. 选择节点
2. 点击"编辑"
3. 修改名称
4. 点击"保存" | 节点信息更新成功 | | E2E-015 | 删除节点 | 叶子节点 | 1. 选择叶子节点
2. 点击"删除"
3. 确认删除 | 节点删除成功,树形结构更新 | | E2E-016 | 删除有子节点的节点 | 有子节点的节点 | 1. 选择有子节点的节点
2. 点击"删除" | 提示"存在子节点,无法删除" | ### 2.3 批量导入测试 | 用例编号 | 用例名称 | 前置条件 | 操作步骤 | 预期结果 | |----------|----------|----------|----------|----------| | E2E-020 | 下载楼栋模板 | 空间管理页面 | 1. 点击"导入"按钮
2. 选择"楼栋模板"
3. 点击"下载模板" | Excel 文件下载成功,包含正确模板格式 | | E2E-021 | 导入楼栋 | 已下载模板 | 1. 填写楼栋数据
2. 上传 Excel 文件
3. 点击"确认导入" | 显示导入结果,成功数量和失败原因 | | E2E-022 | 下载房间模板 | 空间管理页面 | 1. 点击"导入"按钮
2. 选择"房间模板"
3. 点击"下载模板" | Excel 文件下载成功 | | E2E-023 | 导入房间 | 已下载模板 | 1. 填写房间数据
2. 上传 Excel 文件
3. 点击"确认导入" | 显示导入结果 | | E2E-024 | 导入错误数据 | 错误格式的Excel | 上传格式错误的文件 | 显示错误提示,不执行导入 | | E2E-025 | 导入部分失败 | 部分数据有误 | 上传包含错误数据的文件 | 显示成功和失败明细,失败记录说明原因 | ### 2.4 数据展示测试 | 用例编号 | 用例名称 | 前置条件 | 操作步骤 | 预期结果 | |----------|----------|----------|----------|----------| | E2E-030 | 查看节点详情 | 空间管理页面 | 点击任意节点 | 右侧面板显示节点详细信息 | | E2E-031 | 查看统计数据 | 空间管理页面 | 查看页面顶部统计区域 | 显示楼栋数、户数、车位数等统计 | | E2E-032 | 分页展示 | 节点列表超过20条 | 查看列表底部 | 显示分页控件,可翻页 | | E2E-033 | 排序功能 | 节点列表 | 点击列标题排序 | 列表按指定字段排序 | | E2E-034 | 筛选功能 | 节点列表 | 选择筛选条件 | 列表按条件过滤显示 | ### 2.5 异常场景测试 | 用例编号 | 用例名称 | 前置条件 | 操作步骤 | 预期结果 | |----------|----------|----------|----------|----------| | E2E-040 | 网络中断保存 | 编辑节点时 | 断开网络后点击保存 | 显示网络错误提示,数据不丢失 | | E2E-041 | 重复提交 | 创建节点时 | 快速连续点击保存按钮 | 只创建一个节点,防止重复提交 | | E2E-042 | 会话超时 | 长时间未操作 | 会话过期后操作 | 跳转登录页面,提示会话已过期 | | E2E-043 | 并发编辑 | 两人同时编辑 | 两个用户同时编辑同一节点 | 后保存者提示数据已被修改 | --- ## 三、测试数据 ### 3.1 标准测试项目 ```json { "project": { "id": "test-project-001", "name": "测试小区", "buildings": 17, "floorsPerBuilding": 24, "roomsPerFloor": 4, "parkingSpaces": 100 }, "expected": { "totalBuildings": 17, "totalUnits": 34, "totalRooms": 1632, "totalParkingSpaces": 100 } } ``` ### 3.2 楼栋测试数据 ```json { "buildings": [ { "name": "1号楼", "nodeType": "BUILDING", "nodeCode": "B001" }, { "name": "2号楼", "nodeType": "BUILDING", "nodeCode": "B002" }, { "name": "3号楼", "nodeType": "BUILDING", "nodeCode": "B003" } ] } ``` ### 3.3 单元测试数据 ```json { "units": [ { "name": "1单元", "nodeType": "UNIT", "nodeCode": "U1", "parentCode": "B001" }, { "name": "2单元", "nodeType": "UNIT", "nodeCode": "U2", "parentCode": "B001" } ] } ``` ### 3.4 房间测试数据 ```json { "rooms": [ { "name": "101", "nodeType": "ROOM", "nodeCode": "101", "floor": 1, "parentCode": "U1" }, { "name": "102", "nodeType": "ROOM", "nodeCode": "102", "floor": 1, "parentCode": "U1" }, { "name": "201", "nodeType": "ROOM", "nodeCode": "201", "floor": 2, "parentCode": "U1" }, { "name": "2401", "nodeType": "ROOM", "nodeCode": "2401", "floor": 24, "parentCode": "U1" } ] } ``` ### 3.5 车位测试数据 ```json { "parkingSpaces": [ { "name": "A-001", "nodeType": "PARKING_SPACE", "nodeCode": "P001" }, { "name": "A-002", "nodeType": "PARKING_SPACE", "nodeCode": "P002" } ] } ``` --- ## 四、测试执行说明 ### 4.1 集成测试执行 ```bash # 执行所有空间节点集成测试 cd ether-mdm ./mvnw test -Dtest=SpaceNodeIntegrationTest # 执行特定测试用例 ./mvnw test -Dtest=SpaceNodeIntegrationTest#testCreateBuilding ``` ### 4.2 E2E 测试执行 ```bash # 启动所有服务 ./scripts/start-all-services.sh # 执行 E2E 测试 cd e2e-tests npx playwright test space-node.spec.ts ``` ### 4.3 测试数据准备 ```sql -- 执行测试数据初始化 psql -U postgres -d ether_mdm -f docs/08-DATABASE/test-data-mdm.sql ``` --- ## 五、测试报告模板 ### 5.1 测试执行摘要 | 测试类型 | 用例总数 | 通过数 | 失败数 | 通过率 | |----------|----------|--------|--------|--------| | 集成测试 | 25 | - | - | - | | E2E 测试 | 30 | - | - | - | | **合计** | **55** | - | - | - | ### 5.2 缺陷统计 | 缺陷等级 | 数量 | 已修复 | 待修复 | |----------|------|--------|--------| | 严重 | - | - | - | | 高 | - | - | - | | 中 | - | - | - | | 低 | - | - | - | --- ## 六、附录 ### 6.1 节点类型枚举 | 类型 | 编码 | 说明 | |------|------|------| | 项目 | PROJECT | 根节点 | | 楼栋 | BUILDING | 楼栋节点 | | 单元 | UNIT | 单元节点 | | 楼层 | FLOOR | 楼层节点(可选) | | 房间 | ROOM | 房间节点 | | 车位 | PARKING_SPACE | 车位节点 | | 公共区域 | PUBLIC_AREA | 公共区域节点 | ### 6.2 层级关系约束 ``` PROJECT -> BUILDING -> UNIT -> ROOM PROJECT -> BUILDING -> FLOOR -> ROOM PROJECT -> PARKING_SPACE PROJECT -> PUBLIC_AREA ``` ### 6.3 编码规则 | 节点类型 | 编码前缀 | 示例 | |----------|----------|------| | 楼栋 | B | B001, B002 | | 单元 | U | U1, U2 | | 房间 | 楼层+序号 | 101, 2401 | | 车位 | P | P001, P002 |