# WebServer 前端测试程序 本目录存放 RTU 项目 WebServer 前端的 Python 自动化测试脚本。 ## 📁 目录结构 ``` mimo/webserver测试工程师/ ├── README.md # 本文件 ├── test_ws_raw.py # 最简 WebSocket 连通性测试 ├── test_debug_dc.py # datacenter out 命令调试 ├── test_verify_push.py # 推送验证(添加后检查 out 推送) ├── test_verify_immediate_push.py # 验证 curd:add 立即推送修复 ├── test_ws_dc_out.py # 数据中心→信号管理页 端到端测试 (v1) ├── test_ws_dc_out_v2.py # 数据中心→信号管理页 端到端测试 (v2) ├── test_ws_dc_out_v3.py # 数据中心→信号管理页 端到端测试 (v3) └── test_regression_final.py # 全面回归测试(多信号+立即推送) ``` ## 🔧 前置条件 1. **RTU 已运行**:目标设备上 RTU 进程已启动,WebSocket 服务已监听 `8000` 端口 2. **目标 IP**:默认 `198.120.0.100`(RK3568),可在脚本中修改 `IP` 变量 3. **Python 3**:所有脚本仅依赖 Python 标准库(`socket`, `json`, `struct`, `base64`, `os`, `time`, `sys`, `hashlib`),无需额外安装 4. **网络可达**:测试机与目标 RTU 之间网络互通(ping 通) ## 📋 测试程序说明 ### 1. test_ws_raw.py — 最简 WebSocket 连通性测试 **功能**:验证与 RTU 的 WebSocket 基本通信是否正常。 **流程**: 1. TCP 连接 `198.120.0.100:8000` 2. 执行 WebSocket 握手升级 3. 发送 `get_cmds` 请求 4. 接收并解析所有 WebSocket 帧(区分 text/binary/close/ping/pong) 5. 打印响应内容 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_ws_raw.py ``` **适用场景**:首次排查连通性问题,验证 WebSocket 协议握手是否成功。 --- ### 2. test_debug_dc.py — datacenter out 命令调试 **功能**:调试 `datacenter out` 命令的行为,排查命令是否正常执行。 **流程**: 1. WebSocket 握手后,先接收初始数据(cmd_list) 2. 发送 `get_cmds` 获取可用命令列表 3. 发送 `{"type":"cmd","cmd":"datacenter out"}` 注册数据中心 out 信号 4. 逐帧解析响应,识别 `dc_data` 类型的 JSON 消息 5. 统计各类信号数量(out/in/yk/ao/param) **使用方法**: ```bash python3 mimo/webserver测试工程师/test_debug_dc.py ``` **适用场景**:诊断 `datacenter out` 命令无响应问题时使用。 --- ### 3. test_verify_push.py — 推送验证测试 **功能**:注册数据中心信号后,精确验证 WebSocket 推送是否包含所有信号。 **流程**: 1. 发送 `datacenter out` 注册信号 2. 添加指定信号 `sys.ch.tcp_s0_if` 到 out 配置页 3. 等待 3 秒后收集所有 WebSocket 推送 4. 打印 `out` 推送中的信号列表(saddr + val) 5. 清理:删除测试信号,关闭连接 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_verify_push.py ``` **适用场景**:验证特定信号的注册和推送是否正常。 --- ### 4. test_verify_immediate_push.py — curd:add 立即推送验证 **功能**:验证 `curd:add` 操作后服务端是否立即推送(而非等 ws_task 定时轮询)。 **流程**: 1. WebSocket 握手连接 2. 发送 `curd:add` 注册测试信号 3. 立即监听收发,检查服务端是否在 add 后立刻推送 out 数据 4. 对比定时推送和立即推送的延迟差异 5. 清理测试数据 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_verify_immediate_push.py ``` **适用场景**:验证 `ws_method.cpp` 中 `curd:add` 的立即推送逻辑修复。 --- ### 5. test_ws_dc_out.py — 端到端测试 v1(初版) **功能**:完整测试"数据中心注册信号 → 信号管理页添加 → 推送验证 → 清理"全流程。 **流程**: 1. 依次执行 `datacenter out/in/yk/ao/param` 注册所有类型信号 2. 从 `dc_data` 中选择 out 信号(优先选 ctrl_type=1/2 的直控/选控信号) 3. 发送 `curd:add` 添加信号(2 秒间隔模拟真人操作) 4. 等待 ws_task 定时推送 out 数据(最多 10 秒) 5. 验证添加的信号是否出现在推送列表中 6. 清理:发送 `curd:del` 删除测试信号 **技术特点**: - 使用 `drain_sock` 逐帧接收(区分 text/binary/close/ping 帧) - 关键发现文档:dc_data 通过二进制帧发送,curd:add 不会立即推送 - `ws_recv` 函数支持 126/127 长度扩展和掩码处理 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_ws_dc_out.py ``` --- ### 6. test_ws_dc_out_v2.py — 端到端测试 v2(改进版) **功能**:与 v1 相同,但改进了接收方式,使用 `ws_recv_all` 原始帧集中接收。 **改进点**: - 增加了初始 `get_cmds` 握手,打印可用命令列表 - 信号选择逻辑更宽松(直接从 out_signals 选前 3 个) - 增加了 fallback:当没有 out 信号时尝试添加已知信号 - 等待超时延长到 15 秒 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_ws_dc_out_v2.py ``` --- ### 7. test_ws_dc_out_v3.py — 端到端测试 v3(修复版) **功能**:与 v1/v2 相同,但**修复了终端命令的 JSON 格式**。 **关键修复**: - v1/v2 使用 `{"type":"cmd","cmd":"datacenter out"}`(错误) - v3 使用 `{"type":"cmd","data":"datacenter out"}`(正确) - 终端命令消息体中命令内容放在 `"data"` 字段,而非 `"cmd"` 字段 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_ws_dc_out_v3.py ``` > **推荐使用 v3**,因为命令格式与前端实际发送的格式一致。 --- ### 8. test_regression_final.py — 全面回归测试 **功能**:数据中心→信号管理页的全面回归测试,覆盖多信号添加、立即推送验证、删除清理全流程。 **流程**: 1. WebSocket 握手连接 2. 注册 datacenter out/in/yk/ao/param 所有信号类型 3. 从 dc_data 中批量选取多个 out 信号 4. 逐个添加信号并验证立即推送的完整性 5. 统计成功/失败比例 6. 批量删除测试信号并清理 **使用方法**: ```bash python3 mimo/webserver测试工程师/test_regression_final.py ``` **适用场景**:代码修改后的完整性回归验证,确保信号 CRUD 全流程无退化。 --- ## 🔄 消息协议要点 | 要点 | 说明 | |------|------| | dc_data 帧类型 | **二进制帧**(opcode=0x02),非文本帧 | | curd:add 行为 | 添加后**不会立即推送**,需等 ws_task 定时轮询检测 has_change | | ws_task 周期 | 约 1 秒 | | 终端命令格式 | `{"type":"cmd","data":"<命令>"}` | | curd 消息格式 | `{"saddr":...,"signal_type":"out","curd":"add","setting_zone":"0","signal_data":""}` | | 操作间隔 | 添加/删除建议间隔 2 秒,模拟真人操作 |