199 lines
6.8 KiB
Markdown
199 lines
6.8 KiB
Markdown
# 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 秒,模拟真人操作 |
|