3. 平台技术选型与架构设计
航空软件自动化测试平台的技术选型,本质上是在“机载软件验证的严谨性”与“测试资产复用效率”之间寻找平衡点。本节围绕三组关键决策展开:C/S 与 B/S 的交互形态选择、微服务与单体架构的部署粒度选择,以及 Python、Java、C++ 三种语言在平台不同层次中的适用性划分。这三组决策并非彼此独立,而是共同决定了平台后续的可维护性、可扩展性与适航符合性证据链的完整性。
一、C/S 与 B/S:交互形态的取舍
C/S(Client/Server)架构在客户端安装专用程序,通过 TCP、串口或专用总线与测试设备通信;B/S(Browser/Server)架构则把交互界面收敛到浏览器,服务端统一处理业务逻辑。航空测试场景中,两者并非互斥,而是按“实时控制面”与“数据管理面”分层使用。
实时控制面涉及硬实时信号激励与采集,例如 ARINC 429 总线周期发送、离散量 IO 翻转、1553B 消息调度。这类操作要求确定性时延,通常由本地 C/S 客户端或嵌入式代理直接驱动硬件,避免浏览器网络抖动引入不确定延迟。数据管理面则包括测试用例编辑、测试结果查询、覆盖率报告浏览、缺陷跟踪等,适合 B/S 形态,便于多角色(测试工程师、验证工程师、适航审查员)通过统一入口访问。
一个可落地的折中方案是“B/S 管理 + C/S 执行”的混合形态:浏览器端负责用例编排与结果展示,本地执行代理以 C/S 方式连接目标机与总线板卡。这样既保留了 Web 端的协作便利,又保证了实时通道的确定性。
二、微服务与单体:部署粒度的权衡
单体架构把所有功能打包为一个进程,部署简单、调用链短、事务一致性强;微服务把用例管理、执行调度、结果分析、设备代理拆分为独立服务,各自可独立部署与扩缩容。航空测试平台的选型需要看团队规模与迭代节奏。
在项目初期,测试用例数量有限、设备种类单一,单体架构配合模块化包结构(如 case_manager、executor、reporter、device_proxy)足以支撑,且调试链路清晰。当平台需要同时接入多型号目标机、多总线类型,且不同团队并行开发不同设备代理时,微服务的边界优势才真正显现:设备代理可独立升级而不影响用例管理服务,执行调度可按负载水平扩容。
需要警惕的是,微服务会引入分布式事务、服务发现、链路追踪等额外复杂度。对于适航审查而言,服务边界越多,证据链的拼接与追溯成本越高。因此建议采用“渐进式拆分”:先以模块化单体交付,待设备代理种类超过 3 类、并发执行任务超过 20 个时,再将设备代理与执行调度拆为独立服务。
三、Python、Java、C++ 的适用性划分
三种语言在平台中承担不同职责,选型依据是“实时性要求、生态成熟度、团队技能”三者的交集。
| 语言 | 典型职责 | 优势 | 局限 |
|---|---|---|---|
| Python | 测试用例脚本、结果分析、报告生成、设备代理原型 | 开发效率高,pySerial、ctypes、pytest 生态完善,适合快速迭代 |
GIL 限制多核并行,硬实时能力弱,不适合直接驱动高精度时序总线 |
| Java | 平台服务端、用例管理、调度服务、Web 后端 | JVM 成熟稳定,Spring 生态完整,跨平台部署方便,适合长周期维护 | 启动开销较大,与底层硬件交互需 JNI 或 JNA 桥接 |
| C++ | 总线驱动、实时执行代理、信号采集与激励 | 零开销抽象,可直接操作内存与硬件寄存器,时延可控 | 开发周期长,内存管理复杂,团队门槛高 |
一个典型的组合是:C++ 编写 ARINC 429 与 1553B 驱动及实时执行代理,通过共享内存或本地 socket 暴露接口;Java 构建平台服务端与 Web 后端,负责用例管理、调度与结果聚合;Python 作为测试脚本层,调用平台 API 编写用例,并利用 pytest 与 allure 生成可读报告。这种分层让每种语言都在其最擅长的位置发挥作用。
四、架构决策的落地建议
综合以上三组决策,推荐的目标架构是:B/S 管理面 + C/S 实时执行面 + 模块化单体起步 + 按需微服务拆分 + 三语言分层。具体落地时,先定义执行代理与平台服务之间的接口契约(如基于 JSON-RPC 或 gRPC 的 execute_case、query_status、collect_result 三个核心方法),再分别用 C++ 实现代理、Java 实现服务端、Python 实现脚本层。接口契约一旦稳定,后续无论把单体拆成微服务,还是替换某一层的语言实现,都不会影响整体测试流程的连续性。
需要强调的是,航空软件测试平台的选型没有“最优解”,只有“与当前团队、设备、适航要求最匹配的解”。在做出决策前,建议先用一个真实型号的 3~5 条典型测试用例做端到端验证,观察执行时延、结果追溯完整性与团队上手成本,再据此调整架构粒度与语言分工。