张 翔 彭 珲 张晓娜 金朋飞
(复杂电磁环境效应国家重点实验室,河南 洛阳 471003)
随着人们对嵌入式设备的功能多样化的要求和行为智能化的期望,嵌入式软件作为嵌入式设备的“大脑”,软件复杂度将更高,规模将更大,如何更准、更快、更高效地对嵌入式软件测试,是摆在嵌入式软件测试行业的首要问题。为更好地进行嵌入式软件的测试,测试环境的构建是测试工作的重要基础。
嵌入式软件的实时性、嵌入性和反应性特点[1],使得软件测试面临更多的困难。因此,根据不同种类的嵌入式软件运行的需求,构建正确有效的测试环境是保证测试过程顺利进行,提高测试效率,保证测试质量的基础。实践过程中,测试人员需根据嵌入式软件的特点搭建相应的测试环境,主要分为:仿真测试环境、交叉测试环境和插桩环境[2]。在嵌入式软件测试过程中,仿真测试技术提高了测试效率,缩短了测试周期,加强了嵌入式软件测试的充分性和全面性。
由于嵌入式设备种类的多样性和运行环境的不同,使得嵌入式软件测试环境的构建必须根据实际条件选择合适的策略方法。目前三种产生方式即真实、纯软件虚拟、硬件和软件结合的半实物,嵌入式仿真测试环境包括全实物仿真测试环境、半实物仿真测试环境和全数字仿真测试环境三类[3]。
全实物仿真测试环境直接将嵌入式软件运行所需要的整个系统,包括目标硬件平台和其交联的物理设备建立真实的连接,在实际运行条件下对软件进行测试,测试框架如图1所示。
图1 嵌入式软件全实物仿真测试环境框架
嵌入式软件的开发环境安装在宿主机,开发人员利用开发工具完成后,通过仿真软件调试,而嵌入式软件最终实际工作运行在目标机上。测试方法通常是外接一些测试辅助设备,比如:示波器、逻辑分析仪等。示波器是应用广泛的电子测量仪器,通过示波器测量目标机电信号,转化成波形图像,测试人员分析信号幅度、周期、频率和相位等参数,与目标机的期望信号进行分析对比。逻辑分析仪的主要作用是时序判定,测试人员需要设定不同的逻辑条件,实时记录内存访问行为,通常采用统计采样的方式进行测试。
全实物仿真测试侧重于被测系统与其交联设备的接口进行测试,是整个软件系统和硬件系统总体运行情况的全面测试,是适用于系统测试阶段采取的测试方法。
半实物仿真测试环境是被测软件运行在真实目标硬件上,而与之连接的交互设备用仿真模型来替代,利用仿真模型模拟被测软件的整体运行环境。测试环境主要模拟在真实环境中与被测软件有数据交互的输入和输出关系,并能通过外部仿真模型控制对被测软件输入信号,也可以接收被测软件的输出信号并实时分析和记录。交联仿真模型为目标硬件提供激励信号输入,接收并处理目标硬件的输出数据,进行对被测软件自动、实时、非侵入性的闭环测试。但是并不是所有的交联设备都必须构建仿真模型,可以随着项目的进展以及根据外设的复杂性,有选择性地加入真实外部设备[4]。
嵌入式软件半实物仿真测试环境通常可实现对被测系统进行接口测试、功能测试和性能测试等。利用搭建好的仿真环境模拟被测系统在真实运行环境中的输入,乃至从边界条件、极端条件等不同情况下可能出现的输入,在运行过程对被测系统进行全面的测试,从而尽可能在正式交付前发现嵌入式软件的缺陷问题,提高嵌入式软件的可靠性。半实物仿真测试环境的形式可能多种多样,但基本的实现体系结构由上位机、下位机和被测系统构成,在一些情况下可能还包含部分与被测硬件交联的设备。
嵌入式软件半实物仿真测试环境的工作原理和结构如图2所示,上位机和下位机之间通过TCP/IP协议交互,下位机通过总线、AD/DA转换接口,串口和USB接口等不同板卡接口与被测系统通信。
图2 嵌入式软件半实物仿真测试环境结构图
3.1 全数字仿真测试环境框架
全数字仿真测试环境是指将被测软件运行的目标硬件全部以仿真的方式进行替代,还包括有交互关系的外围设备。全数字仿真环境在宿主机上构造嵌入式软件运行所硬件环境,硬件功能全部由仿真模型替代,被测软件的测试过程全部在计算机上完成,无须被测系统硬件参与。
嵌入式软件全数字仿真测试环境基本框架如图3所示,被测软件可以是源代码也可以是目标码,嵌入式软件测试的主要对象是目标码,目标码导入虚拟目标机中运行,测试过程由测试控制端管理和控制。测试控制端进行外设建模仿真、测试用例生成,测试脚本载入、测试数据采集记录和测试结果分析等功能。通常可为测试环境配置各种模型库,增强测试用例、外设仿真模型、嵌入式处理器模型库的复用性,减少测试过程重复性工作,提高软件测试效率。
图3 嵌入式软件全数字仿真测试环境框架图
3.2 全数字仿真测试环境关键实现技术
3.2.1 嵌入式处理器仿真技术。利用仿真技术实现全数字嵌入式软件测试环境构建的一个核心技术就是处理器的仿真,嵌入式处理器的仿真实际上是相应嵌入式处理器指令集的仿真,即指令集仿真器,是用软件模拟一个处理器上程序执行过程的软件工具,它建立了处理器的仿真模型,通过模拟每条指令在目标处理器上的执行效果来模拟执行被测程序。
指令集仿真器的实现方式主要分为解释型和编译型两类。解释型方式是对每条目标机机器指令按照取指、译码、本地执行的流程进行处理和执行。编译型方式是将目标处理器的可执行二进制机器指令整体直接编译为本地机器的二进制机器指令,然后统一执行。两种方式各有优缺点,解释型设计实现简单,可控性好,但执行速度较慢。编译型执行速度快,但可控性和可移植性较差。
3.2.2 外设仿真及故障定位。被测软件的目标机硬件通常只是真实系统中的一部分,外围设备环境为软件运行提供必要的资源。全数字仿真测试环境要模拟被测软件的整个运行系统,与目标硬件产生数据交互连接的外部设备同样通过仿真模型的方式实现。全数字仿真测试环境外围设备仿真与半实物交联设备仿真的主要不同点是,半实物的交联设备仿真模型最终通过硬件接口将信号传入真实的被测硬件系统,而全数字仿真都是以软件方式实现,即通过建立硬件接口的仿真模型实现信号传输过程的模拟。由于运行在宿主机平台,不受目标机硬件资源制约,可以对不同故障类型下软件进行充分测试,相比硬件更容易实现故障定位和复现。
3.2.3 调试与测试。调试通常由测试人员使用调试工具进行,使用调试器可以对虚拟目标机和被测软件的运行状态进行控制和查看。通过调试器设置运行断点,记录运行中的某一时刻寄存器中的数据,记录函数执行的时间和覆盖率等。良好的调试器可以测试人员提供更加灵活的测试,在运行过程中随时产生指定故障,随时采集指定数据,查看并修改寄存器的值,随时可对已执行代码进行覆盖率分析等功能,并且在获取状态后不影响被测软件的继续运行。普通的调试器设置断点是使用指令替换的方式,在断点处获得程序执行过程中的内部状态信息。但如果软件中存在将指令本身作为数据输入的功能,例如,计算自身校验和,则计算校验和的输入就会随着断点的设置而发生改变,从而影响被测软件的运行,这和软件插桩技术面临的问题是相同的。
全数字仿真测试环境有较高的灵活性和可控性,能够实现各种异常数据和异常状态的输入,对测试用例的支持较好,不受目标硬件及其外围设备的限制。同时也要认识到全数字仿真测试环境无法替代真实硬件,如果仿真的完整性和准确性差,则无法反映出真实系统的实时特性,就无法完成与硬件时序特性联系紧密的测试。
本文整理分析了嵌入式软件仿真测试环境构建的类型和方法,梳理了每种测试环境框架的适用场景和优缺点,可为测试人员构建仿真测试环境提供参考和借鉴。测试用例和测试脚本的自动生成等技术促使软件测试的自动化程度不断增强,逐步向智能化测试发展,并且使通用化进一步加强。随着嵌入式软件自动化测试框架的不断丰富,嵌入式软件测试方法技术会不断完善发展,尤其随着大数据、深度学习技术在测试领域深入应用,会出现越来越多的测试方法和测试工具,提高测试人员的效率和改善测试的效果。