1、医用软件测试概述:IEC 62304对测试的要求、测试级别、测试文档体系
大家好,我是老张。做医疗嵌入式软件这行,一晃十几年了。今天咱们聊聊测试——这个在IEC 62304里占了大头的环节。
说实话,我刚入行那会儿,对测试的理解就是「写完代码跑一跑,没崩就行」。直到有一次,我们一款监护仪在注册审核时被发补,原因就是测试文档不完整。嗯,从那以后,我再也不敢小看测试了。
1.1 IEC 62304对测试的核心要求
IEC 62304把测试当作软件生命周期里不可或缺的一环。它不关心你用什么工具,也不规定你必须写多少行测试代码。它只关心一件事:你有没有证据证明你的软件是安全的。
我个人习惯把62304对测试的要求总结成三点:
- 可追溯性:每个测试用例都要能追溯到对应的需求。说白了,你测的东西得是有来源的,不能拍脑袋想出来的。
- 独立性:测试人员最好不是写代码的那个人。我在项目里见过太多「自己测自己」的坑——写代码的人总觉得自己的逻辑没问题,结果漏掉一堆边界情况。
- 文档化:测试计划、测试用例、测试报告,一个都不能少。审核老师看的就是这些纸面证据。
重点提醒:IEC 62304对测试的要求是分安全等级(A/B/C级)的。C级最宽松,A级最严格。但不管哪个等级,测试文档都是硬性要求。
1.2 测试的三个级别
62304把测试分成三个级别:单元测试、集成测试、系统测试。这三个级别不是随便分的,它们对应着软件开发的不同阶段。
1.2.1 单元测试
单元测试,说白了就是测最小的代码单元。在嵌入式领域,通常是一个函数或者一个模块。
我记得有一次,我们做输液泵的流速控制算法。单元测试时发现一个PID参数溢出问题——如果用户设置的流速特别小,积分项会一直累加,最终导致电机突然猛转。这种问题,系统测试根本发现不了,因为触发条件太特殊了。
单元测试的关键点:
- 覆盖所有分支路径(if-else、switch-case)
- 边界值测试(最大值、最小值、空值)
- 异常输入测试(非法参数、越界数据)
我的小技巧:单元测试最好在代码提交前就跑一遍。我团队里有个规矩——单元测试没过,代码不许合并。刚开始大家觉得麻烦,后来发现bug率降了至少一半。
1.2.2 集成测试
集成测试,就是把各个单元拼起来,看它们能不能好好配合。嵌入式软件里,最常见的问题是接口不匹配。
举个例子,我们做过一个心电采集系统。ADC驱动模块和信号处理模块是两个人写的。ADC驱动输出的是原始电压值,信号处理模块却期望输入的是经过校准的毫伏值。单元测试各自都过了,一集成就崩。这就是集成测试要抓的问题。
集成测试的策略有两种:
- 大爆炸集成:所有模块一次性拼起来。快,但出了问题很难定位。
- 增量集成:一个一个模块往上加。慢,但安全。我个人推荐这种方式,尤其是安全等级B级以上的软件。
1.2.3 系统测试
系统测试,是在真实或模拟的硬件环境下,验证整个系统是否满足需求。这时候测的不只是软件,还有软硬件交互。
系统测试要关注:
- 功能完整性(所有需求都实现了)
- 性能指标(响应时间、吞吐量、内存占用)
- 异常场景(断电、通信中断、传感器故障)
- 压力测试(长时间运行、高负载)
注意:系统测试不能替代单元测试和集成测试。我曾经见过一个团队,为了赶进度跳过单元测试,直接做系统测试。结果呢?系统测试发现的问题,定位花了两周,修起来只花了半天。得不偿失。
1.3 测试文档体系
说到文档,很多工程师觉得烦。但没办法,医疗软件审核就是看文档。你代码写得再漂亮,没有文档,审核老师不认。
IEC 62304要求的测试文档体系,我习惯用一张表来概括:
| 文档名称 | 内容 | 什么时候写 |
|---|---|---|
| 软件测试计划 | 测试范围、策略、资源、进度、通过准则 | 测试开始前 |
| 软件测试描述 | 具体的测试用例、测试步骤、预期结果 | 测试执行前 |
| 软件测试报告 | 测试结果、发现的缺陷、通过/失败统计 | 测试完成后 |
这里有个坑,我踩过。测试计划里一定要写清楚「通过准则」。什么叫通过?是所有测试用例100%通过?还是允许有已知的、已评估风险的缺陷?
我个人建议:对于安全等级B级以上的软件,所有与安全相关的测试用例必须100%通过。非安全相关的,可以允许有少量已知缺陷,但必须在测试报告里明确说明,并且经过风险评估。
1.4 测试与软件安全等级的关系
不同安全等级的软件,测试要求不一样。我整理了一个对照表:
| 测试活动 | A级 | B级 | C级 |
|---|---|---|---|
| 单元测试 | 必须,100%语句覆盖+分支覆盖 | 必须,100%语句覆盖 | 建议 |
| 集成测试 | 必须,包含接口测试 | 必须 | 建议 |
| 系统测试 | 必须,包含压力测试 | 必须 | 必须 |
| 测试文档 | 完整的三件套 | 完整的三件套 | 至少测试报告 |
你想想看,C级软件可能只是一个辅助功能,比如记录日志。但A级软件直接关系到患者生命安全,比如呼吸机的通气控制。要求严格,是应该的。
1.5 我的经验总结
做了这么多年医疗软件,我最大的体会是:测试不是找bug,而是证明软件是安全的。
这个思路很重要。如果你把测试当成找bug,你会觉得「差不多就行了」。但如果你把测试当成「证明安全」,你就会认真对待每一个测试用例,每一份文档。
最后分享一个避坑指南:
- 测试用例要写清楚「预期结果」,不能模棱两可
- 测试报告里要记录测试环境(硬件版本、软件版本、工具版本)
- 发现缺陷后,要记录复现步骤,方便开发人员定位
- 测试文档要版本控制,和软件版本对应起来
好了,这一章就聊到这儿。下一章咱们深入讲讲单元测试的具体做法,包括怎么搭测试框架、怎么写测试用例。到时候我会拿一个真实的血压测量算法来举例,敬请期待。