4. 星务软件接口测试自动化
星务软件的接口测试与普通业务软件最大的不同,在于它面对的是"多协议、多物理层、强时序"的混合接口环境。一颗典型卫星的星务计算机,向上要通过遥测遥控接口与测控地面站交互,向下要通过总线接口管理各分系统单机,同时还要通过串口与载荷、GNSS 接收机等设备通信,通过网口与数传、星间链路等设备交换数据。接口测试自动化的核心任务,就是把这四类接口的"激励—响应—判据"用脚本固化下来,让回归测试可以无人值守地反复执行。
一、四类接口的自动化测试特征
在设计脚本之前,必须先明确每类接口的"可编程边界"在哪里。遥测遥控接口通常以 CCSDS 空间包为数据单元,遥控上行是 PCM/SPDU 帧,遥测下行是源包或传输帧,自动化脚本需要能构造遥控包、注入到被测软件、再解析遥测包验证执行结果。总线接口(如 CAN、1553B、SpaceWire)的自动化依赖总线仿真卡或板卡驱动,脚本通过调用厂商 API 完成帧收发。串口通信相对简单,用串口库打开端口、按协议组帧、读写即可。网络接口则基于 TCP/UDP,脚本作为客户端或服务端与星务软件建立连接。
这四类接口的自动化脚本,结构上可以统一为"接口适配层 + 用例逻辑层 + 判据层"三层。接口适配层封装物理通道的打开、发送、接收、关闭;用例逻辑层描述测试意图;判据层负责比对期望值与实际值。这样分层的好处是,同一套用例逻辑可以复用到不同物理接口上,回归时只需替换适配层实现。
二、遥测遥控接口脚本设计
遥控上行脚本的关键是"包构造"。以 CCSDS 遥控空间包为例,一个遥控包由主包头(6 字节:版本号、类型、副导头标志、应用过程标识符、序列标志、序列计数、包数据长度)和数据域组成。脚本中通常定义一个 build_tc_packet(apid, seq, data) 函数,把 APID、序列计数和指令码按位拼装成字节串,再通过 PCM 帧封装后发送。
def build_tc_packet(apid, seq, cmd_code, params=b''):
# 主包头:版本(3bit)+类型(1bit)+副导头(1bit)+APID(11bit)
header = (0b0001 << 13) | (0b1 << 12) | (0b1 << 11) | (apid & 0x7FF)
seq_field = (0b11 << 14) | (seq & 0x3FFF)
data = bytes([cmd_code]) + params
pkt_len = len(data) - 1
return header.to_bytes(2,'big') + seq_field.to_bytes(2,'big') + pkt_len.to_bytes(2,'big') + data
遥测下行脚本则相反,需要从接收到的字节流中按包同步字(如 0x1ACFFC1D)定位帧头,解析出源包,再按 APID 分发到不同的解析函数。判据通常包括:遥测参数值是否等于期望值、状态字是否置位、包计数是否递增。例如验证"某加热器开机指令"是否生效,脚本发送遥控包后,等待 2 秒,从遥测中提取加热器状态参数,判断其是否由 0 变为 1。
三、总线接口脚本设计
总线接口自动化的难点在于硬件依赖。以 CAN 总线为例,脚本通过 CAN 分析仪(如周立功 USBCAN、Kvaser)的 Python 库打开通道,设置波特率(如 500 kbps),然后调用 send 和 recv 完成帧收发。1553B 总线则更复杂,需要配置 RT 地址、子地址、收发模式,脚本通常封装成 bc_send(rt_addr, sub_addr, data) 和 bc_recv(rt_addr, sub_addr) 两个原语。
总线测试的判据不只是数据内容,还包括时序。例如某单机要求在收到指令后 50 ms 内回传状态帧,脚本需要记录发送时刻和接收时刻,计算时间差,判断是否超时。这类时序判据在回归测试中尤其重要,因为软件改动可能不影响功能正确性,却破坏实时性。
四、串口通信脚本设计
串口脚本相对直接,但要注意星务软件常用的 RS-422 是全双工差分信号,脚本侧需要确认串口参数:波特率(常见 115200 或 921600)、数据位 8、停止位 1、无校验。Python 中用 pyserial 打开端口后,按协议组帧发送,再用 read 或 readline 接收。若协议有帧头帧尾和校验和,脚本需要实现校验函数,接收后先校验再解析。
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
frame = bytes([0xEB, 0x90, cmd]) + payload
checksum = sum(frame) & 0xFF
ser.write(frame + bytes([checksum]))
resp = ser.read(64)
assert verify_checksum(resp), "校验失败"
五、网络接口脚本设计
网络接口在星务软件中常用于数传数据交互或星地链路模拟。脚本可以作为 TCP 客户端连接星务软件的监听端口,也可以作为服务端等待星务软件主动上报。UDP 则常用于遥测广播。网络接口测试要特别关注粘包问题:TCP 是字节流,脚本不能假设一次 recv 就收到一个完整包,必须按协议长度字段循环读取,直到收满一包再解析。
六、回归测试中的脚本组织
四类接口的脚本最终要纳入统一的回归框架。建议用 pytest 组织用例,每个接口一个 fixture 负责打开和关闭通道,用例函数只写测试逻辑。测试数据(遥控指令码、期望遥测值、总线帧内容)放在 YAML 或 CSV 中,便于版本管理和批量回归。执行后生成 JUnit XML 报告,接入 CI 流水线,每次星务软件版本更新自动触发全量接口回归。