近年来,随着嵌入式系统的功能和复杂性不断增加,其开发时间和成本也随之不断上升。对于安全关键领域的嵌入式系统和软件来说,其稳定性和可靠性往往需要通过大量的测试和验证来保证。
嵌入式软件测试针对嵌入式软件进行,建立在一般软件测试的基础之上,大多数软件的测试方法都可以直接或间接用于嵌入式软件的测试。但由于嵌入式系统专用性强、实时性要求高,嵌入式软件测试与一般软件测试也存在一些不同之处。
▲表1 一般软件测试与嵌入式软件测试的区别
根据测试阶段和重点的不同,嵌入式软件测试需要考虑多个层面的因素:
第一层:不同测试阶段的测试需求。嵌入式软件测试通常分为单元测试、软件集成测试、系统测试及验收维护四个阶段。对不同的测试阶段的测试需求分析往往是不同的,采取的测试方法及进行测试的程度也不相同。
测试通常需要满足“需求可追溯”:不同的测试阶段会验证不同的设计/编码是否符合需求,以确保该软件能够实现预期的功能,并且仅构建了所需的功能。需求可分为低层级需求和高层级需求,各行各业存在的功能安全标准即为满足高层级需求的存在,如汽车领域的ISO 26262,测试人员通常会以满足本领域高层级需求的功能安全标准来分析测试需求,并通过简单测试来解释和测试所有未发现的测试案例。
嵌入式软件的开发通常遵循V模型,下图所示的V模型结合了“测试左移”:在未开始编码的需求规格分析阶段,测试人员便可同步开始系统测试及验收维护的测试需求分析。
▲图1 嵌入式软件开发过程的V模型
单元测试阶段作为完整测试过程的最初阶段,需要确保各个组件都能够正常工作。在此过程中,测试人员需要对较低级别的需求进行定义,以确保每个功能和功能集都能被正常使用并为系统其余部分提供合适的接口。
第二层:待测软件的特性。不同的嵌入式软件应用背景不同,所要求的特性也不相同,测试的侧重点自然也不同。航空、航天领域的嵌入式软件一般需要具备很强的实时性——飞行控制系统必须快速调整飞机姿态以确保飞行安全性。对航空、航天领域的嵌入式软件进行测试时,需要格外关注输入、运算、输出的时效性。
第三层:测试需求的优先级。根据所测的功能点进行分析、分解,从而得出哪些功能点为主要功能点、哪些为次要功能点。测试需求优先级别的确定,需要测试人员清晰了解核心的功能、特性及测试流程,有利于测试工作有的放矢地展开。
第四层:测试需求的覆盖程度。如果一个软件的需求已经与测试需求存在一对一或一对多的对应关系,可以说测试需求已经覆盖了该功能点,测试需求的覆盖率达到100%,并不意味着测试需求的覆盖程度高。测试需求的覆盖率只计算了显性因素,而隐性因素并未被计算在内。因此,测试人员需要不断了解系统的隐性需求,对测试需求进行补充和优化。
第五层:不同的测试环境。由于执行故障注入、覆盖率分析等测试步骤需要在不同的测试环境中进行,在进行测试需求分析时就需要考虑到相应的搭建、数据准备及接口等变量。
第六层:测试工具的选择。根据测试的要求和测试阶段,选择成熟且可靠的测试工具也非常重要。
(一)静态测试工具
单元测试要求在功能和模块级别设置输入和输出参数并进行检查,以确保输入和输出之间的连接正确,并遵循覆盖逻辑。因此,了解功能和模块级别的接口很重要。静态分析工具可以显示这些接口,并连接不同级别的逻辑。
静态分析通过执行源代码分析,在不实际执行代码的情况下模拟系统的运行。静态分析在代码编写后可以立即进行,以帮助开发人员最大程度提高代码的清晰度、可维护性和可测试性。静态分析工具的主要功能包括:
1.代码复杂性分析:了解代码不必要的复杂之处,以便工程师执行合适的简化措施。
2.程序流程分析:绘制程序执行的设计-审查流程图,以确保程序按预期流程执行。
3.预见性运行时错误检测:通过尽可能多的可执行路径对代码执行进行建模,查找潜在的错误,例如数组边界溢出和除零错误。
4.编码标准合规性检测:通常选择编码标准(如C/C++的MISRA代码合规标准)来确保网络与功能安全。编码标准也有助于确保代码遵循最佳编程实践。
(二)全数字仿真平台
在系统级测试阶段,全数字仿真测试平台是目前常用的测试工具之一。
全数字仿真是用数学模型在数字计算机上进行实验和研究的过程。嵌入式软件与支持其运行的硬件有很强的耦合性,而硬件测试环境与软件测试环境相比,灵活性差,对故障产生过程的记录很困难。全数字仿真是综合解决嵌入式软件测试中由环境限制带来的测试困难的有效方案,可通过全数字仿真测试平台进行实现。
全数字仿真测试平台指嵌入式软件在通用计算机环境(相对真实目标系统)中运行测试。利用全数字实时仿真平台,测试人员可以在软件配置项级开展并发式的功能测试及快速的回归测试,加快问题定位和排查故障的效率。
全数字仿真测试通常在宿主机上进行,被包括在基于宿主机的嵌入式软件测试中。基于宿主机的嵌入式软件测试指完全利用宿主机平台上丰富的资源和工具(包括全数字仿真测试平台)来对嵌入式软件进行测试,不需要依赖目标系统的支持,可大大提高被测软件执行的可视性和可控性,以较低的代价、较高的效率发现和定位软件设计中的错误。
此外,在完全脱离目标系统的情况下完成对嵌入式软件的测试工作,可以尽早发现软件设计中的错误,避免了等到软硬件集成时才能寻找和定位问题而存在的风险,减少了软件的测试成本及开发风险。
SkyEye,中文全称天目全数字实时仿真软件,是仿真嵌入式目标系统的虚拟平台,能够完全仿真目标系统中的CPU(Central Processing Unit,中央处理器)、寄存器、内存、外设接口,如图所示:
▲图2 SkyEye功能图
开发、测试人员在SkyEye上运行被测软件,可以获得在真实目标系统上运行这些软件的相同效果。在SkyEye上进行软件测试与在真实目标系统上相比,具有以下2个优点:
1.支持检查点分析。通过插入检查点,SkyEye 能够保存软件运行状态,支持运行状态的回放分析,便于软件问题的定位;
2.支持访问目标系统状态。在真实硬件上,测试人员很难对寄存器、状态寄存器进行跟踪和控制,但通过SkyEye,目标系统就像一个白盒,可以清楚看到内部的状态,这对于软硬件问题的排查十分有帮助。
此外,SkyEye还可进行外围设备仿真建模,主要指对目标系统外围器件、接口的建模仿真,包含各种器件(如内存、寄存器、外部定时器、Flash等)和各种标准的通信接口(如RS422、RS232、CAN总线、1553B、1394B、FC总线)。
综上,嵌入式软件进行测试需要测试人员对其与一般软件测试的不同点和特性具备明确认知,并通过需求确认来建立完整的测试流程。只要结合需求、采用正确的测试工具来进行严格测试,便可更高效地开发高质量嵌入式软件。