3. 医疗接口测试环境搭建

医疗接口测试与普通互联网接口测试最大的区别在于:被测系统往往不是单一服务,而是 HIS、LIS、PACS、EMR 等多个异构系统通过 HL7 v2、DICOM、FHIR、WebService 等协议互相调用。因此,测试环境不能只起一个 Mock 服务,而要搭建一个"最小可用的医疗业务闭环",让患者建档、开单、采样、检验、报告回传、影像调阅、病历写入这条链路真正跑通。

一、模拟环境部署:先定协议边界,再选部署形态

部署前先明确每个系统在接口测试中扮演的角色和协议:HIS 通常作为患者主索引与医嘱发起方,对外提供 WebService/HTTP 接口,内部通过 HL7 v2 向 LIS 发送 ORM^O01 医嘱消息;LIS 接收医嘱后返回 ORU^R01 结果消息,并可能通过 DICOM Worklist 与 PACS 交互;PACS 提供 DICOM C-STORE、C-FIND、WADO-RS 等影像服务;EMR 则通过 FHIR 或视图接口读取检验、影像结果并写入病历文书。

模拟环境有三种常见形态,可按测试目标选择:

  • 全 Mock 形态:用 MockServer、WireMock 或自研 HL7 模拟器返回固定报文,适合接口契约测试和异常分支覆盖,部署快、可控性强。
  • 轻量真实形态:部署开源组件,如用 HAPI FHIR Server 模拟 EMR/FHIR 端、用 dcm4chee 模拟 PACS、用 Mirth Connect 做 HL7 消息路由,适合端到端联调和消息时序验证。
  • 混合形态:真实系统只读接入、写操作走 Mock,适合在不影响生产数据的前提下验证真实报文结构。

以 Mirth Connect 为例,可在通道中配置 LIS 模拟端:Source 使用 MLLP Listener 监听 6661 端口,Destination 用 JavaScript 根据消息类型分流。下面是一段判断消息类型并返回对应 ACK 的示例逻辑:

// Mirth Connect 通道 Destination 转换器示例
var msgType = msg['MSH']['MSH.9']['MSH.9.1'].toString(); // 如 ORM / ORU
if (msgType === 'ORM') {
    // 收到医嘱,返回 AA 确认,并异步生成结果
    var ack = 'MSH|^~\\&|LIS|LAB|HIS|HOSP|20240520103000||ACK^O01|MSG0001|P|2.4\r' +
              'MSA|AA|MSG0001\r';
    return ack;
} else {
    return 'MSA|AE|UNKNOWN\r'; // 不支持的消息类型返回 AE
}

部署完成后,用 telnet 127.0.0.1 6661 或 nc 发送一条最小 ORM 报文,观察是否返回 MSA|AA,这是判断 MLLP 通道是否可用的最直接依据。

二、测试数据准备:主数据、业务数据、边界数据三层

医疗接口测试数据必须保证"同一患者在多个系统中标识一致",否则链路会在患者匹配环节断裂。建议按三层准备:

层级典型数据关键字段
主数据患者、科室、医生、检验项目、检查项目患者ID、就诊号、机构编码、项目代码
业务数据医嘱、申请单、样本、报告、影像、病历医嘱号、样本号、AccessionNumber、StudyUID
边界数据空值、超长、特殊字符、重复就诊、跨院区患者姓名含生僻字、身份证号校验位错误

患者主索引建议使用统一编码规则,例如 P + 院区码 + 8位流水号,如 P0100000123。检验项目代码要与 LIS 字典对齐,影像检查的 AccessionNumber 必须与 HIS 申请单号一致,否则 PACS 无法通过 C-FIND 匹配到对应检查。测试数据可用 SQL 脚本或 FHIR Bundle 批量导入,导入后应抽查 3~5 条记录,确认跨系统可查到同一患者。

三、网络隔离与安全合规配置

医疗测试环境涉及患者隐私数据,必须做网络隔离。推荐按"测试区—隔离区—生产区"划分:测试区部署模拟系统,隔离区部署 API 网关和消息代理,生产区仅允许只读脱敏数据同步。测试区与生产区之间用防火墙策略限制,只放行必要的源 IP、目的端口和协议,例如仅允许测试网关访问生产 HIS 的只读查询接口。

安全合规方面,重点落实四点:一是数据脱敏,姓名、身份证、手机号在测试库中替换为虚构值,影像文件去除 DICOM 头中的患者身份信息;二是传输加密,HL7 over TLS、DICOM TLS、HTTPS 必须启用,禁用明文 MLLP 跨网段传输;三是访问控制,测试账号按最小权限分配,禁止使用生产管理员账号;四是审计留痕,接口调用日志保留至少 6 个月,记录调用方、时间、患者标识和操作类型。

注意:即使是在测试环境,也不要把真实患者数据直接复制进来。脱敏应在数据进入测试区之前完成,而不是在测试区内"用完再删"。

四、环境可用性验证:一条链路跑通即算达标

环境搭好后,用一条最小业务链路验证:HIS 发起 ORM 医嘱 → LIS 返回 ORU 结果 → PACS 接收影像并返回 StudyUID → EMR 通过 FHIR 读取结果。每一步都应有明确的成功判据,例如 LIS 返回 MSA|AA、PACS 返回 0x0000 成功状态、FHIR 返回 200 OK 且资源中包含 Observation。只要这条链路能稳定跑通,后续的接口自动化用例才有可靠的执行基础。

医疗接口测试环境:最小业务闭环与网络分区 测试区(模拟系统) 隔离区 / 生产只读区 HIS 模拟端 WebService / HL7 ORM LIS 模拟端 MLLP :6661 / ORU PACS 模拟端 DICOM C-STORE / C-FIND EMR 模拟端 FHIR / 视图接口 测试数据三层 主数据:患者ID P0100000123 / 科室 / 项目字典 业务数据:医嘱号 / 样本号 / AccessionNumber / StudyUID API 网关 / 消息代理 TLS 终止 · 访问控制 · 审计日志 生产只读脱敏库 仅放行只读查询 · 数据已脱敏 安全合规四要点 脱敏 · 加密 · 最小权限 · 审计留痕 ORM ORU DICOM FHIR 查询 HTTPS / TLS 成功判据:LIS 返回 MSA|AA · PACS 返回 0x0000 · FHIR 返回 200 OK 且含 Observation

最后提醒一点:模拟环境要能"制造异常"。正常链路跑通只是起点,真正体现测试价值的是消息超时、ACK 返回 AE、DICOM 关联失败、FHIR 返回 422 等异常场景。建议在 Mirth 通道或 Mock 服务中预留开关,通过参数控制返回正常或异常报文,这样自动化用例才能覆盖失败重试、告警和补偿逻辑。