RTU/mimo/webserver测试工程师/test_regression_final.py

135 lines
4.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""全面回归测试: 数据中心→out 多信号添加+立即推送验证"""
import socket, base64, os, struct, json, time
IP = '198.120.0.100'; PORT = 8000
def ws_handshake(sock):
key = base64.b64encode(os.urandom(16)).decode()
req = (f"GET /ws HTTP/1.1\r\nHost: {IP}:{PORT}\r\nUpgrade: websocket\r\n"
f"Connection: Upgrade\r\nSec-WebSocket-Key: {key}\r\n"
f"Sec-WebSocket-Version: 13\r\n\r\n")
sock.sendall(req.encode())
resp = b""
while b"\r\n\r\n" not in resp:
c = sock.recv(4096)
if not c: break
resp += c
if b"101" not in resp.split(b"\r\n")[0]: raise Exception("握手失败")
return resp
def ws_send(sock, msg):
if isinstance(msg, dict): msg = json.dumps(msg, ensure_ascii=False)
p = msg.encode(); L = len(p); mask = os.urandom(4)
m = bytes(p[i] ^ mask[i%4] for i in range(L))
f = bytearray([0x81])
if L<126: f.append(0x80|L)
elif L<65536: f.append(0x80|126); f.extend(struct.pack('>H',L))
else: f.append(0x80|127); f.extend(struct.pack('>Q',L))
f.extend(mask); f.extend(m); sock.sendall(bytes(f))
def ws_recv_all(sock, t=2.0):
sock.settimeout(t); data=b""
try:
while True:
c=sock.recv(65536)
if not c: break
data+=c
except socket.timeout: pass
msgs=[]; offset=0
while offset+2<=len(data):
b0,b1=data[offset],data[offset+1]; op=b0&0xF; L=b1&0x7F; offset+=2
if L==126: L=struct.unpack('>H',data[offset:offset+2])[0]; offset+=2
elif L==127: L=struct.unpack('>Q',data[offset:offset+8])[0]; offset+=8
if op in (1,2) and offset+L<=len(data):
p=data[offset:offset+L]
try: msgs.append(json.loads(p.decode()))
except: msgs.append(p.decode(errors='replace'))
offset+=L
return msgs
def find_out_push(msgs):
for msg in msgs:
if isinstance(msg, dict) and isinstance(msg.get('out'), list):
return msg['out']
return None
print("="*70)
print(" 全面回归测试 — 数据中心→out 添加信号")
print("="*70)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10); sock.connect((IP,PORT))
ws_handshake(sock); print("[✓] 连接成功")
# 1. 注册 dc 信号
ws_send(sock, {"type":"cmd","data":"datacenter out"})
time.sleep(1); ws_recv_all(sock,1)
# 2. 选择 3 个不同前缀的信号测试
targets = [
"sys.ch.tcp_s0_if",
"sys.ch.uart0_if",
"iec.run_cnt"
]
expected = set(targets)
# 3. 逐个添加,验证每个都能收到立即推送
print(f"\n--- 添加 {len(targets)} 个信号 ---")
all_ok = True
for i, t in enumerate(targets):
ws_send(sock, {"saddr":t,"signal_type":"out","curd":"add","setting_zone":"0","signal_data":""})
time.sleep(0.4)
msgs = ws_recv_all(sock, 2)
out_data = find_out_push(msgs)
if out_data:
saddr_set = {o['saddr'] for o in out_data}
ok = t in saddr_set
status = "" if ok else ""
print(f" [{i+1}] {t} add → 推送 {len(out_data)}个信号 {status}")
if not ok:
all_ok = False
print(f" 推送内容: {saddr_set}")
else:
print(f" [{i+1}] {t} add → ❌ 无推送")
all_ok = False
# 4. 最终验证 — 检查所有 3 个是否都在列表中
print(f"\n--- 最终验证 ---")
ws_send(sock, {"type":"cmd","data":"datacenter out"})
time.sleep(1); msgs = ws_recv_all(sock, 2)
# 忽略 dc_data看有没有 out 推送
out_data = None
for msg in msgs:
if isinstance(msg, dict) and isinstance(msg.get('out'), list):
out_data = msg['out']
if not out_data:
# 再等 ws_task
time.sleep(3)
msgs = ws_recv_all(sock, 3)
out_data = find_out_push(msgs)
if out_data:
saddr_set = {o['saddr'] for o in out_data}
all_found = expected.issubset(saddr_set)
print(f" out已注册: {len(out_data)}个 → 目标全部找到: {'' if all_found else ''}")
if not all_found:
print(f" 缺少: {expected - saddr_set}")
else:
print(" ❌ 未收到 out 推送")
# 5. 清理
print(f"\n--- 清理 ---")
for t in targets:
ws_send(sock, {"saddr":t,"signal_type":"out","curd":"del","setting_zone":"0","signal_data":""})
time.sleep(0.3)
msgs = ws_recv_all(sock, 1)
out_data = find_out_push(msgs)
cnt = len(out_data) if out_data else '?'
print(f" del {t} → 剩余 {cnt}")
print(f"\n{'✅ 全部通过!' if all_ok else '❌ 存在失败'}")
try: sock.sendall(b'\x88\x80'+os.urandom(4))
except: pass
sock.close()