2. 医疗系统接口生态与协议解析

医疗系统的接口生态不是单一协议栈,而是由多种协议按“临床场景—数据形态—交互时效”分工协作形成的组合体。做接口自动化测试时,如果只按 HTTP 状态码和 JSON 字段做断言,很容易漏掉医疗语义层的错误。本节先建立一张协议分工图,再逐个拆解每种协议的接口形态与测试关注点。

医疗接口协议分工与测试关注点 临床场景层 检验结果回传 影像调阅 患者主索引查询 监护实时推送 协议与数据形态层 HL7 v2.x 管道分隔消息 MLLP/TCP 传输 ADT/ORU/ORM FHIR R4 REST + JSON/XML 资源化建模 Patient/Observation DICOM 影像+元数据 C-STORE/C-FIND DIMSE / DICOMweb SOAP WSDL 契约 XML Envelope WS-Security WebSocket 长连接双向 订阅/推送 实时生命体征 测试关注点(按协议差异化) HL7 v2.x • MSH 字段与编码 • 段/字段/分量边界 • ACK 应答码 AA/AE/AR • 转义字符与重复字段 FHIR R4 • 资源结构与必填项 • 搜索参数与分页 • OperationOutcome 错误 • 版本与并发控制 DICOM • SOP Class/Instance UID • 传输语法与压缩 • 标签一致性与像素 • C-STORE 状态码 SOAP • WSDL 契约符合性 • Envelope/Body 结构 • Fault 错误解析 • WS-Security 头 WebSocket • 握手与子协议 • 消息顺序与丢失 • 心跳与重连 • 推送延迟与背压

HL7 v2.x:管道分隔消息与 MLLP 传输

HL7 v2.x 是医院内部系统间最普遍的接口形态,典型场景是 LIS 向 HIS 回传检验结果(ORU^R01)。消息以段(Segment)为单位,段内字段用竖线 | 分隔,字段内分量用 ^ 分隔,重复字段用 ~ 分隔。传输层通常使用 MLLP(Minimal Lower Layer Protocol),即在消息前后加 0x0B 和 0x1C 0x0D 作为帧边界。

测试关注点首先是帧边界与编码:MLLP 帧头帧尾缺失会导致接收端一直等待,表现为连接不关闭但无响应。其次是 MSH 段中的 MSH-9 消息类型、MSH-10 消息控制 ID、MSH-11 处理 ID 和 MSH-12 版本号,这些字段决定接收端如何路由和去重。第三是 ACK 应答:接收端返回 MSA-1 为 AA 表示接受,AE 表示错误,AR 表示拒绝。自动化测试不能只断言“收到 ACK”,必须解析 MSA-1 并核对 MSA-2 是否回显了原消息控制 ID。

一个可复用的断言示例:发送 ORU^R01 后,在 5 秒内读取 ACK,断言 MSA-1 == "AA" 且 MSA-2 == 原 MSH-10;若为 AE,则进一步读取 ERR 段中的错误码和错误位置,定位是字段缺失还是编码不合法。

FHIR R4:资源化 REST 接口

FHIR 把医疗数据抽象为资源(Resource),如 Patient、Observation、Encounter、DiagnosticReport,通过 RESTful 风格暴露:GET /Patient/{id}、POST /Observation、GET /Patient?identifier=...。数据格式以 JSON 为主,也支持 XML。FHIR 的价值在于资源之间的引用关系,例如 Observation 通过 subject 引用 Patient,通过 encounter 引用就诊。

测试关注点与普通 REST 不同:一是资源结构校验,必填元素、基数(0..1、1..1、0..*)和数据类型必须符合 Profile;二是搜索参数,_count、_offset、_sort、_include 的行为需要逐项验证,尤其是分页时 Bundle.link 中 next 链接是否可用;三是错误响应,FHIR 要求返回 OperationOutcome 资源,其中 issue.severity 和 issue.code 是判断错误类型的关键;四是版本与并发,ETag 和 If-Match 用于乐观锁,测试时应验证版本冲突时返回 409 而非静默覆盖。

DICOM:影像与元数据一体化

DICOM 不是文本消息协议,而是二进制对象协议。一次 CT 检查包含多个 SOP Instance,每个实例由 SOP Class UID 和 SOP Instance UID 唯一标识,像素数据与患者、检查、序列等元数据封装在同一数据集中。传统 DIMSE 服务使用 C-STORE 存储、C-FIND 查询、C-MOVE 检索;现代 DICOMweb 则提供 WADO-RS、QIDO-RS、STOW-RS 等 REST 接口。

测试关注点集中在 UID 一致性和传输语法:同一 Study 下 Series 与 Instance 的层级关系必须正确,StudyInstanceUID、SeriesInstanceUID、SOPInstanceUID 不能混用;传输语法(如 Implicit VR Little Endian、Explicit VR Little Endian、JPEG Baseline)决定了解析方式,压缩影像需要验证解压后像素与原始一致。C-STORE 的响应状态码 0000 表示成功,0110 表示处理失败,A700 表示资源不足,自动化测试应逐实例断言状态码并统计失败实例数。

SOAP:契约优先的 Web Service

SOAP 在医疗领域常见于旧版 HIS、医保结算和区域平台接口。其接口形态由 WSDL 定义,请求体是 XML Envelope,包含 Header 和 Body。测试关注点首先是契约符合性:请求 XML 必须符合 WSDL 中定义的 schema,元素顺序、命名空间、必填属性都不能错。其次是 Fault 处理:SOAP Fault 的 faultcode 和 faultstring 是判断业务错误与系统错误的关键,不能只依赖 HTTP 500。第三是 WS-Security,涉及用户名令牌、时间戳和签名时,需要验证过期时间、签名有效性和重放保护。

WebSocket:实时生命体征推送

WebSocket 用于监护仪、可穿戴设备等需要持续推送的场景。客户端与服务端通过 HTTP Upgrade 握手建立长连接,之后以帧为单位双向传输。测试关注点包括:握手阶段子协议协商是否正确;消息顺序与丢失,推送数据通常带时间戳和序列号,需要验证乱序和丢包;心跳与重连,长时间无数据时是否发送 Ping/Pong,断线后是否自动重连并补发;背压处理,当客户端消费慢时服务端是否丢弃或缓冲,丢弃策略是否符合临床要求。

协议选择不是互斥的:一家医院可能同时运行 HL7 v2.x 的 LIS 接口、FHIR 的互联网医院接口、DICOM 的 PACS 接口和 WebSocket 的监护接口。自动化测试框架应按协议分层封装,把“传输层连接”“消息编解码”“业务语义断言”分开,避免把 MLLP 帧解析逻辑写进 FHIR 测试用例。

跨协议测试的公共关注点

无论哪种协议,医疗接口测试都有四个公共关注点。第一是患者标识一致性:同一患者在 HL7 的 PID-3、FHIR 的 Patient.identifier、DICOM 的 PatientID 中必须指向同一主索引,否则会出现“结果找不到患者”。第二是时间语义:HL7 的 YYYYMMDDHHMMSS、FHIR 的 dateTime、DICOM 的 DA/TM 格式不同,时区和精度必须统一。第三是编码系统:性别、检验项目、诊断编码可能使用 HL7 表、LOINC、SNOMED CT、ICD-10,测试要验证编码映射而非仅验证文本。第四是幂等与重传:医疗接口常因网络抖动重发,接收端必须能通过消息控制 ID 或资源版本去重,自动化测试应构造重复消息并断言不产生重复记录。

把上述关注点落到测试用例设计上,可以按“协议—场景—断言”三层组织:协议层验证连接、帧、编码;场景层验证一次完整的业务闭环,如“开医嘱—采样—出结果—回传—归档”;断言层则分别检查传输成功、结构合法、语义正确和业务状态一致。只有三层都通过,才能认为该接口在医疗场景中可用。