You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
haoliang-net/docs/07-端到端联动测试方案.md

382 lines
23 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 端到端联动测试方案
**版本:** v1.0
**创建日期:** 2026-05-03
**适用范围:** CNC机床数据采集系统 — 模拟器 + 采集服务 + 管理后台 + 数据库 全链路联动
---
## 一、测试环境准备(前置条件)
| 组件 | 启动方式 | 验证方法 |
|------|---------|---------|
| **模拟器 CncSimulator** | `src\CncSimulator\bin\CncSimulator.exe` | 浏览器打开 `http://localhost:{port}/admin` 看到管理页面 |
| **采集服务 CncCollector** | `src\CncCollector\bin\CncCollector.exe` | `Invoke-WebRequest http://localhost:5800/api/collector/status` 返回 `isRunning:true` |
| **Web API (IIS)** | AppPool `haoliang` 已运行 | `Invoke-WebRequest http://127.0.0.1/api/admin/login` 返回200 |
| **数据库 MariaDB** | 服务已启动 | `mysql -u root -proot -e "SELECT COUNT(*) FROM cnc_business.cnc_machine"` |
---
## 二、测试域A模拟器测试
### A1. 模拟器基本功能
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| A1.1 | 启动与数据输出 | 访问 `http://localhost:{port}/` | 返回JSON数组包含在线设备数据 | PowerShell `Invoke-WebRequest`验证JSON解析成功、数组>0 |
| A1.2 | 设备数据结构 | 解析返回JSON | 每台设备包含:`deviceCode, programName, partCount, runStatus, operateMode, spindleSpeedSet/Actual, feedSpeedSet/Actual, spindleLoad, machiningStatus` | 逐字段非空检查 |
| A1.3 | 管理页面 | 浏览器打开 `http://localhost:{port}/admin` | 显示HTML管理页面设备列表、状态、操作按钮可见 | Playwright截图 |
| A1.4 | 状态API | GET `/admin/api/status` | 返回 `{name, port, isRunning, totalDevices, onlineDevices, ...}` | 字段非空 |
### A2. 模拟器管理API
| # | 测试点 | 操作 | 期望结果 |
|---|--------|------|---------|
| A2.1 | 停止模拟 | POST `/admin/api/stop` → 查status | `isRunning:false`GET `/` 不再返回更新数据 |
| A2.2 | 启动模拟 | POST `/admin/api/start` → 查status | `isRunning:true`,数据恢复变化 |
| A2.3 | 修改数据频率 | POST `/admin/api/interval {value:5}` | status显示 `dataChangeInterval:5`连续2次GET间隔5秒内数据变化 |
| A2.4 | 切换剧本模式 | POST `/admin/api/mode {mode:"manual"}` | status显示 `scenarioMode:"manual"`,设备不再自动切换场景 |
| A2.5 | 手动触发事件 | POST `/admin/api/event {deviceId:"xxx", eventType:"program_change"}` | 设备NC程序名变更partCount可能重置 |
| A2.6 | 添加设备 | POST `/admin/api/add-device {deviceCode:"TEST-01", desc:"测试设备"}` | status设备数+1新设备出现在GET `/` 响应中 |
| A2.7 | 移除设备 | POST `/admin/api/remove-device {deviceCode:"TEST-01"}` | status设备数-1GET `/` 不再包含该设备 |
### A3. 网络异常模拟
| # | 测试点 | 操作 | 期望结果 |
|---|--------|------|---------|
| A3.1 | HTTP 500 | POST `/admin/api/network {type:"http500"}` → 采集服务请求 | 模拟器返回500采集服务记录失败 |
| A3.2 | 超时 | POST `/admin/api/network {type:"timeout"}` | 模拟器延迟60秒响应采集服务超时 |
| A3.3 | 空数据 | POST `/admin/api/network {type:"empty"}` | 模拟器返回 `[]`,采集服务应记录空响应 |
| A3.4 | 畸形JSON | POST `/admin/api/network {type:"malformed"}` | 模拟器返回 `{broken`,采集服务应记录解析失败 |
| A3.5 | 拒绝连接 | POST `/admin/api/network {type:"refuse"}` | 端口不可达,采集服务应记录连接失败 |
| A3.6 | 恢复正常 | POST `/admin/api/network {type:"normal"}` | 模拟器恢复正常数据输出 |
### A4. 模拟器数据统计
| # | 测试点 | 操作 | 期望结果 |
|---|--------|------|---------|
| A4.1 | 统计API | GET `/admin/api/stats` | `totalDevices, onlineDevices, totalParts, partsByDevice` 非空且合理 |
| A4.2 | 事件历史 | GET `/admin/api/event-history` | 返回事件数组,每条含 `timestamp, deviceCode, eventType, oldProgram, newProgram` |
| A4.3 | 完整汇总 | GET `/admin/api/full-summary` | 包含启动时间、运行时长、请求数、成功/失败数、每设备每程序零件数 |
| A4.4 | 错误日志 | 先设网络异常→恢复→GET `/admin/api/error-log` | 有对应错误记录,含 `errorType, description, affectedDevices` |
| A4.5 | 请求日志 | GET `/admin/api/logs` | 返回最近100条采集日志每条含 `timestamp, deviceCount, keyData, fullJson` |
---
## 三、测试域B采集服务测试
### B1. 采集引擎启停
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| B1.1 | 引擎启动 | POST `/api/collector/start` (带X-Api-Key) | 返回 `code:0`status显示 `isRunning:true` | 调5800 status确认 |
| B1.2 | 重复启动 | 再次POST start | 静默返回成功(幂等) | status仍为running |
| B1.3 | 引擎停止 | POST `/api/collector/stop` | `isRunning:false`心跳表最新记录status=stopped | 查DB |
| B1.4 | 启动后心跳立即写入 | POST start → 立即查心跳表 | 最新记录status=runninguptime_seconds=0 | `SELECT * FROM cnc_log.log_collector_heartbeat ORDER BY id DESC LIMIT 1` |
### B2. 数据采集流程
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| B2.1 | 正常采集 | 模拟器运行中采集服务运行中等待1-2个采集间隔 | `cnc_collect_record` 有新数据写入 | 查DB`SELECT COUNT(*) FROM cnc_collect_record WHERE collect_time > NOW() - INTERVAL 1 MINUTE` |
| B2.2 | 原始JSON存储 | 同上 | `log_collect_raw` 有新记录,`raw_json` 字段非空 | 查DB |
| B2.3 | 采集记录字段完整 | 查最新采集记录 | `machine_id, collect_time, program_name, part_count, device_status, run_status, spindle_speed_set, spindle_speed_actual` 均非空 | 逐字段检查 |
| B2.4 | 设备状态更新 | 采集1-2轮后查 `cnc_machine` | `last_ping_time, last_collect_time, last_program_name, last_part_count, last_device_status, last_run_status` 更新 | 查DB |
### B3. 生产段跟踪ProductionTracker
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| B3.1 | 新程序名创建段 | 模拟器切换NC程序触发program_change事件 | `cnc_production_segment` 新增一条记录,`start_time` 有值,`end_time` 为NULL活跃段 | 查DB |
| B3.2 | 程序切换结账 | 再次切换程序 | 上一段 `end_time` 填充,`quantity = end_part_count - start_part_count` | 查DB |
| B3.3 | 同程序多次出现 | 先O0001→O0002→O0001 | 两段O0001分别记录分段记录 | 查DB同日同机器有2条program_name=O0001 |
### B4. 心跳与监控
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| B4.1 | 定时心跳 | 等待2个心跳间隔20秒 | 心跳表新增≥2条running记录 | 查DB |
| B4.2 | 停止后心跳 | POST stop | 最新心跳status=stopped | 查DB |
| B4.3 | 配置轮询 | 修改DB中运行时配置等待1个轮询周期30秒 | 日志输出配置刷新信息 | 查看采集服务控制台/log |
### B5. 异常处理
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| B5.1 | 采集地址不可达 | 停止模拟器 → 等待采集 | `log_collect_raw` 记录失败,`is_success=0``error_message` 非空 | 查DB |
| B5.2 | 采集地址恢复 | 重启模拟器 | 采集恢复,`is_success=1` | 查DB |
| B5.3 | 空数据处理 | 模拟器返回空数组 | 采集不崩溃,日志记录空响应 | 查采集服务日志 |
| B5.4 | 畸形JSON处理 | 模拟器返回畸形JSON | 采集不崩溃,记录解析错误 | 查采集服务日志 |
| B5.5 | 连续失败告警 | 模拟器持续返回500超过阈值默认5次 | 告警触发 | 查 `cnc_alert` 或日志 |
### B6. 配置刷新
| # | 测试点 | 操作 | 期望结果 | 验证方法 |
|---|--------|------|---------|---------|
| B6.1 | 手动刷新 | POST `/api/collector/refresh` | 返回成功,日志输出配置刷新 | 查日志 |
| B6.2 | 新增采集地址 | DB中新增一条 `cnc_collect_address` → refresh | status中workerCount+1 | 调status确认 |
| B6.3 | 删除采集地址 | DB中删除/禁用一条地址 → refresh | status中workerCount-1 | 调status确认 |
---
## 四、测试域C管理后台功能测试
> 每个测试点对应的维度编号参照 `docs/06-测试规范.md` 5.0维度总表。
### C1. 登录(/login
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C1.1 | 正确账密登录admin/admin123 | 跳转到仪表盘localStorage有token | 1 |
| C1.2 | 错误密码 | 提示错误,停留在登录页 | 20 |
| C1.3 | 无Token访问管理后台 | 重定向到/login | 20 |
| C1.4 | 有Token访问/login | 重定向到/dashboard | 20 |
### C2. 仪表盘(/dashboard
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C2.1 | 8个统计卡片有值 | 每个卡片数值≠空≠占位符 | 3 |
| C2.2 | 采集服务状态显示 | 显示"运行中"或"已停止",对应按钮可操作 | 23 |
| C2.3 | 机床状态分布图表 | 饼图/柱状图有渲染内容(非空白) | 3.1 |
| C2.4 | 产量趋势图表 | 折线图有数据点 | 3.1 |
| C2.5 | 机床/工人排行表格 | 行数>0每列有值 | 4,5 |
| C2.6 | 最新告警列表 | ≥0条有则检查字段非空 | 4,5 |
| C2.7 | 日期筛选 | 切换日期→趋势/排行数据变化 | 12 |
| C2.8 | API vs 页面对账 | 调API → 对比卡片数值一致 | 17 |
| C2.9 | 启动采集按钮 | 点击→状态切换为"运行中"→按钮变为"停止采集" | 23 |
| C2.10 | 停止采集按钮 | 点击→状态切换为"已停止"→按钮变为"启动采集" | 23 |
| C2.11 | 刷新配置按钮 | 点击→成功提示 | 23 |
| C2.12 | 表格布局铺满 | 排行表格宽度=100%容器宽度 | 21 |
| C2.13 | 告警列表可点击跳转 | 点击告警→跳转告警中心 | 22 |
### C3. 设备管理(/machine + /machine/:id
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C3.1 | 机床列表加载 | 表格有数据,每列有值 | 4,5 |
| C3.2 | 车间/品牌/状态下拉筛选 | 选项≥1选择后筛选生效 | 8,9,10 |
| C3.3 | 关键词搜索 | 输入→查询→结果包含关键词 | 11 |
| C3.4 | 分页 | 切换页码,数据变化 | 14 |
| C3.5 | 新增机床 | 填写表单→提交→列表刷新→新机床出现 | 15,16 |
| C3.6 | 编辑机床 | 修改→保存→列表更新 | 15,16 |
| C3.7 | 删除机床 | 确认→行消失 | 23 |
| C3.8 | 启停机床 | 切换→状态标签变更 | 23 |
| C3.9 | 点击设备名称跳转详情 | 跳转到详情页URL含id详情页有数据 | 22 |
| C3.10 | 详情页-实时采集状态 | 状态信息展示 | 2 |
| C3.11 | 详情页-今日产量 | 表格有数据 | 4,5 |
| C3.12 | 详情页-产量趋势 | 图表有渲染 | 3.1 |
| C3.13 | 详情页-采集记录 | 表格有数据 | 4,5 |
| C3.14 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
| C3.15 | 空数据状态 | 不可能的筛选→行数=0+不白屏 | 19 |
| C3.16 | 重置按钮 | 筛选恢复默认 | 13 |
### C4. 品牌模板(/brand + /brand/create + /brand/:id/edit
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C4.1 | 品牌列表 | 表格有数据 | 4,5 |
| C4.2 | 新增品牌 | 填写→提交→成功 | 15,16 |
| C4.3 | 编辑品牌(含字段映射) | 修改字段映射→保存→刷新后保留 | 15,16 |
| C4.4 | 复制品牌 | 点复制→新品牌出现(名称含"副本" | 23 |
| C4.5 | 删除品牌 | 确认→行消失 | 23 |
| C4.6 | 启停品牌 | 切换→状态变更 | 23 |
| C4.7 | 标准字段列表 | 下拉有选项 | 8 |
| C4.8 | 点击品牌名称跳转编辑 | 跳转到编辑页,字段预填 | 22 |
| C4.9 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
### C5. 采集地址(/collect-address + /collect-address/:id
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C5.1 | 地址列表 | 表格有数据 | 4,5 |
| C5.2 | 新增地址 | 填写URL、品牌→提交→成功 | 15,16 |
| C5.3 | 编辑地址 | 修改→保存 | 15,16 |
| C5.4 | 删除地址 | 确认→行消失 | 23 |
| C5.5 | 启停地址 | 切换→状态变更 | 23 |
| C5.6 | 点击地址名称跳转详情 | 跳转详情页 | 22 |
| C5.7 | 详情-关联机床列表 | 有数据 | 4 |
| C5.8 | 详情-采集记录 | 有数据 | 4 |
| C5.9 | 详情-原始JSON | JSON展示区有内容 | 2 |
| C5.10 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
| C5.11 | 重置按钮 | 筛选恢复默认 | 13 |
### C6. 员工管理(/worker + /worker/:id
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C6.1 | 员工列表 | 表格有数据 | 4,5 |
| C6.2 | 新增员工 | 填写→提交→成功 | 15,16 |
| C6.3 | 编辑员工 | 修改→保存 | 15,16 |
| C6.4 | 删除员工 | 确认→行消失 | 23 |
| C6.5 | 启停员工 | 切换→状态变更 | 23 |
| C6.6 | 点击员工名称跳转详情 | 跳转详情页 | 22 |
| C6.7 | 详情-绑定机床 | 列表有数据或可添加 | 4 |
| C6.8 | 详情-今日产量 | 表格有数据 | 4 |
| C6.9 | 详情-产量趋势 | 图表有渲染 | 3.1 |
| C6.10 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
| C6.11 | 重置按钮 | 筛选恢复默认 | 13 |
### C7. 产量报表(/production
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C7.1 | 日汇总卡片有值 | totalQuantity等≠空 | 3 |
| C7.2 | 日产量列表 | 表格有数据,运行时间/切削时间/日状态有值 | 4,5,6 |
| C7.3 | 车间/机床/工人下拉 | 选项≥1筛选生效 | 8,9,10 |
| C7.4 | 日期范围筛选 | 切换→数据变化 | 12 |
| C7.5 | 程序名文本筛选 | 输入→匹配 | 11 |
| C7.6 | 重置按钮 | 筛选恢复默认 | 13 |
| C7.7 | 修正弹窗 | 打开→填写→提交→列表刷新→修正标记出现 | 15,16 |
| C7.8 | 修正历史弹窗 | 打开→有历史记录 | 15 |
| C7.9 | 分页 | 切换页码→数据变化 | 14 |
| C7.10 | 导出 | 触发下载 | 23 |
| C7.11 | 汇总卡片 vs API对账 | 调API→对比卡片值一致 | 17 |
| C7.12 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
| C7.13 | 下拉选项值有效性 | 每项文本非空、value可选中 | 18 |
### C8. 告警中心(/alert
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C8.1 | 告警统计 | 卡片有值(总数/未处理/已处理) | 3 |
| C8.2 | 告警列表 | 表格有数据 | 4,5 |
| C8.3 | 类型/状态筛选 | 选项≥1筛选生效 | 8,9,10 |
| C8.4 | 处理单条告警 | 点处理→状态变为已处理 | 23 |
| C8.5 | 批量处理 | 勾选→批量处理→状态批量变更 | 23 |
| C8.6 | 日期筛选 | 切换→数据变化 | 12 |
| C8.7 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
| C8.8 | 重置按钮 | 筛选恢复默认 | 13 |
### C9. 系统设置(/settings
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C9.1 | 配置项列表 | 表格有数据 | 4 |
| C9.2 | 编辑配置项 | 修改→保存→值更新 | 15,16 |
| C9.3 | 重置Token | 点击→确认→新Token生成 | 23 |
| C9.4 | 修改密码 | 填写→提交→成功提示 | 15,16 |
| C9.5 | 车间管理-列表 | 表格有数据 | 4 |
| C9.6 | 车间管理-新增 | 填写→提交→成功 | 15,16 |
| C9.7 | 车间管理-编辑 | 修改→保存 | 15,16 |
| C9.8 | 车间管理-删除 | 确认→行消失 | 23 |
| C9.9 | 车间管理-启停 | 切换→状态变更 | 23 |
### C10. 操作日志(/log
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C10.1 | 产量修正日志 | 表格有数据 | 4,5 |
| C10.2 | 系统运行日志 | 表格有数据 | 4,5 |
| C10.3 | 日期筛选 | 切换→数据变化 | 12 |
| C10.4 | 导出 | 触发下载 | 23 |
| C10.5 | 表格布局铺满 | 表格宽度=100%容器宽度 | 21 |
### C11. 大屏配置(/screen-config
| # | 测试点 | 期望结果 | 维度 |
|---|--------|---------|------|
| C11.1 | 卡片配置列表 | 表格有数据 | 4 |
| C11.2 | 新增卡片配置 | 填写→提交→成功 | 15,16 |
| C11.3 | 编辑卡片配置 | 修改→保存 | 15,16 |
| C11.4 | 删除卡片配置 | 确认→行消失 | 23 |
| C11.5 | 启停卡片 | 切换→状态变更 | 23 |
| C11.6 | 筛选配置列表 | 表格有数据 | 4 |
| C11.7 | 新增筛选项 | 填写→提交→成功 | 15,16 |
| C11.8 | 编辑筛选项 | 修改→保存 | 15,16 |
| C11.9 | 删除筛选项 | 确认→行消失 | 23 |
---
## 五、测试域D端到端联动测试
> 核心验证:数据从模拟器→采集服务→数据库→管理后台的完整链路。
### D1. 完整数据链路验证
| # | 测试场景 | 操作步骤 | 期望结果 | 验证方法 |
|---|---------|---------|---------|---------|
| D1.1 | 正常采集全链路 | ①模拟器运行 ②采集服务启动 ③等待2个采集周期 | 模拟器输出→采集服务获取→解析→写DB→管理后台可查 | ①查模拟器admin/api/logs有请求记录 ②查collect_record有新数据 ③管理后台设备列表last_collect_time更新 |
| D1.2 | 机床状态实时反映 | 模拟器设备在线→采集→查管理后台 | 机床is_online=1last_device_status非空 | 查cnc_machine表 + 管理后台设备列表 |
| D1.3 | NC程序切换→生产段记录 | ①记录当前程序名和partCount ②触发program_change事件 ③等待2个采集周期 | 旧段结账新段创建quantity计算正确 | 查cnc_production_segment |
| D1.4 | 产量汇总 | 采集运行≥5分钟完成若干段→查仪表盘/产量报表 | 日汇总卡片有值,日产量列表有记录,数量与段记录一致 | 对比cnc_daily_production与cnc_production_segment |
### D2. 采集服务启停联动
| # | 测试场景 | 操作步骤 | 期望结果 | 验证方法 |
|---|---------|---------|---------|---------|
| D2.1 | 管理后台启动采集 | ①仪表盘点"启动采集" ②等待1秒 ③查仪表盘状态 | 状态切换为"运行中"uptime递增 | Playwright + API |
| D2.2 | 停止→数据停止更新 | ①停止采集 ②等待1分钟 ③查collect_record | 停止后无新采集记录 | `SELECT MAX(collect_time) FROM cnc_collect_record` 应早于停止时间 |
| D2.3 | 重启→数据恢复 | ①重新启动采集 ②等待1个采集周期 | 新记录写入心跳恢复running | 查DB |
### D3. 模拟器异常联动
| # | 测试场景 | 操作步骤 | 期望结果 | 验证方法 |
|---|---------|---------|---------|---------|
| D3.1 | 模拟器挂了→采集失败→告警 | ①停止模拟器 ②等待采集重试3次+告警阈值 | 采集记录is_success=0告警表新增collect_fail记录 | 查log_collect_raw + cnc_alert |
| D3.2 | 模拟器恢复→采集恢复 | ①重启模拟器 ②等待采集 | is_success=1fail_count归零 | 查DB |
| D3.3 | 空数据→采集处理 | 模拟器设empty模式 | 采集不崩溃log记录空响应 | 查日志 |
| D3.4 | 超时→采集超时 | 模拟器设timeout模式 | 采集超时,记录失败 | 查log_collect_raw |
### D4. 配置变更联动
| # | 测试场景 | 操作步骤 | 期望结果 | 验证方法 |
|---|---------|---------|---------|---------|
| D4.1 | 新增采集地址→刷新 | ①管理后台新增采集地址 ②仪表盘点"刷新配置" ③查采集服务status | workerCount+1 | 调5800 status API |
| D4.2 | 禁用地址→刷新 | ①禁用某采集地址 ②刷新 | workerCount-1 | 调status |
| D4.3 | 修改采集间隔 | ①DB修改collect_interval ②等配置轮询30秒 ③观察采集频率变化 | 采集间隔变更 | 对比两次collect_time差值 |
### D5. 日终汇总联动
| # | 测试场景 | 操作步骤 | 期望结果 | 验证方法 |
|---|---------|---------|---------|---------|
| D5.1 | 手动触发日终汇总 | ①确保有当日生产段数据 ②修改配置的汇总时间为当前时间+1分钟 ③等待触发 | cnc_daily_production有当日记录total_quantity与段记录quantity之和一致 | 查DB |
### D6. 数据一致性交叉验证
| # | 验证项 | SQL/方法 | 通过标准 |
|---|--------|---------|---------|
| D6.1 | 生产段 vs 采集记录 | `SELECT ps.machine_id, ps.program_name, ps.quantity, COUNT(cr.id) FROM cnc_production_segment ps LEFT JOIN cnc_collect_record cr ON cr.machine_id=ps.machine_id AND cr.collect_time BETWEEN ps.start_time AND IFNULL(ps.end_time, NOW()) GROUP BY ps.id` | 每段至少有1条采集记录 |
| D6.2 | 日产量 vs 生产段 | `SELECT dp.machine_id, dp.production_date, dp.total_quantity, SUM(ps.quantity) FROM cnc_daily_production dp JOIN cnc_production_segment ps ON ps.machine_id=dp.machine_id AND ps.production_date=dp.production_date GROUP BY dp.id` | total_quantity = SUM(quantity) |
| D6.3 | 工人日汇总 vs 日产量 | `SELECT ws.worker_id, ws.total_quantity, SUM(dp.total_quantity) FROM cnc_worker_daily_summary ws JOIN cnc_worker_machine wm ON wm.worker_id=ws.worker_id JOIN cnc_daily_production dp ON dp.machine_id=wm.machine_id AND dp.production_date=ws.production_date GROUP BY ws.id` | 数值一致 |
| D6.4 | 模拟器零件数 vs DB零件数 | 对比模拟器 `/admin/api/full-summary` 的 totalParts 与 DB `cnc_daily_production.total_quantity` | 允许差异(采集周期延迟),但趋势一致 |
| D6.5 | 心跳 uptime 连续性 | `SELECT id, status, uptime_seconds, created_at FROM cnc_log.log_collector_heartbeat WHERE service_id='collector-service' ORDER BY id DESC LIMIT 20` | running记录uptime递增无跳变 |
| D6.6 | 原始JSON vs 解析后数据 | 取一条log_collect_raw.raw_json解析后与cnc_collect_record对应记录对比 | 字段值一致 |
---
## 六、测试通过标准
| 类别 | 标准 |
|------|------|
| **A 模拟器** | 所有A1-A4测试点通过管理API全部可操作异常模式全部可设置和恢复 |
| **B 采集服务** | 所有B1-B6测试点通过数据写入DB正确异常不崩溃 |
| **C 管理后台** | 所有C1-C11模块按维度总表(23维度)逐项通过CRUD操作闭环 |
| **D 联动测试** | D1-D6全部通过数据链路完整交叉验证一致 |
| **零容忍** | 无白屏、无500错误、无数据丢失、无空字段设计允许NULL的除外 |
---
## 七、测试执行顺序
```
1. 启动所有组件模拟器→采集服务→确认IIS运行
2. 域A模拟器独立测试确认数据源正常
3. 域B采集服务独立测试确认采集流程正确
4. 域C管理后台逐页面测试确认展示正确
5. 域D联动测试按D1→D2→D3→D4→D5→D6顺序
6. 域D6数据一致性交叉验证全链路数据对账
```
---
## 八、测试点统计
| 测试域 | 测试点数 |
|--------|---------|
| A 模拟器 | 21 |
| B 采集服务 | 22 |
| C 管理后台 | 65 |
| D 联动测试 | 21 |
| **合计** | **129** |