摘 要:分析了嵌入式软件的特点及测试方法;针对嵌入式软件的特点,提出了嵌入式软件系统测试中具有交互式错误检测定位功能的仿真系统架构设计模型,并结合铁路微机联锁系统的测试实例进行分析。
关键词:测试方法 仿真系统 结构设计 嵌入式软件
1 嵌入式系统概述
嵌入式系统是以计算机技术为基础,以应用为中心,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
嵌入式软件是基于嵌入式系统设计的软件,是计算机软件的一种,同样由程序及文档组成,可细分成系统软件、支撑软件、应用软件三类。嵌入式软件大量应用于家用、工业、商业、通讯和国防领域。我国目前在嵌入式应用软件方面具有优势。在嵌入式系统中,软件的工作量约占全部工作量的80%,其中测试与验证的工作量占软件工作量的70%。
1.1 嵌入式软件特点和测试难点
嵌入式系统开发有其自身的特点。通常,在嵌入式系统软件中,底层驱动程序、操作系统和应用程序的界线是不清晰的,有时甚至混编在一起。这主要是因为嵌入式系统中软件对硬件的依赖性造成的。由于嵌入式软件对硬件的依赖性,软件测试时必须最大限度地模拟被测软件的实际运行环境,以保证测试的可靠性。底层程序和应用程序界限的不清晰增加了测试难度。测试时,只有在确认了嵌入式系统平台及底层程序正确的情况下才能进行应用程序的测试,而且在系统测试时,对错误的检测定位较为困难。软件的专用性也是嵌入式软件的一个重要特点。由于嵌入式软件设计是以一定的目标硬件平台为基础、面向固定任务进行的,因此,一旦被加载到目标系统上,功能必须完全确定。这个特点决定了嵌入式应用软件的继承性较差,延长了系统的测试时间,增加了测试费用。嵌入式软件的另外一个重要特点就是实时性,这是从软件执行的角度考虑的,也就是说嵌入式软件的执行要满足一定的时间约束。嵌入式系统中,应用软件自身算法的复杂度和操作系统任务调度,决定了系统资源的分配和消耗。因此,对系统实时性进行测试时,要借助一定的测试工具对应用程序算法复杂度和操作系统任务调度进行分析测试。
1.2 嵌入式软件测试方法
软件测试是软件开发中的一个重要环节,嵌入式软件也不例外。图1给出了嵌入式软件测试的一般流程。根据不同的指标,软件测试方法[1]有不同的划分方法。根据软件开发过程中测试所处的不同阶段可分为模块测试、集成测试和系统测试;根据是否需要运行目标代码分为动态测试和静态测试;根据目标代码的可见性可分为白盒测试(结构测试)和黑盒测试(功能测试)。在软件测试中,每种测试方法都不是孤立的。为了最经济、最有效地达到测试目的,各种测试方法往往互相嵌套。例如,在软件的单元测试阶段,可以用黑盒测试和白盒测试的方法分别进行动态测试。而在系统测试阶段,只能使用黑盒测试方法进行测试。
为了更有效地进行嵌入式软件的系统测试,提出了嵌入式软件系统测试中具有交互式错误检测定位功能的仿真系统架构设计方案。使用此仿真系统不仅可以按照第一类测试方法[2]和第二类测试方法[3]辅助进行系统测试,而且还可以利用仿真系统的交互式学习功能,不断积累错误定位经验,实现错误检测定位,为测试人员和开发人员节省大量时间。这是其他测试方法所不具备的。
2 仿真系统结构设计
嵌入式软件的硬件载体大部分为专用计算机设备,并且通常没有外围设备用于测试过程中的监测或观察。而有些嵌入式软件还会存在交互式操作。在被测软件移植到目标机上的实际硬件环境以后,由于与嵌入式系统平台和底层程序融为一体,对系统进行黑盒测试时,错误定位将变得非常困难。因此根据嵌入式软件的特点,提出了一个具有交互式错误检测定位功能的仿真系统结构模型。图2为仿真系统分层结构图。仿真系统在设计上采用分层结构、分层设计、分层实现的方式,每一层的内部实现对其他层透明。
仿真系统由硬件驱动、交互操作模块、驱动模块、桩模块、分析模块和人机界面六个部分组成。下面分别介绍各个模块的功能。
(1)硬件驱动部分负责驱动硬件,向上一层提供底层硬件的操作接口。仿真系统通过硬件驱动为嵌入式软件提供相应的通信接口,用于嵌入式软件和仿真系统之间的数据交换。通信接口根据具体嵌入式软件的接口设计实现,一般为各种通讯协议。各通讯协议模块之间松散耦合,且具备可扩展性,保证硬件接口的改变不会影响上层的功能实现。
(2)交互操作模块负责与嵌入式软件的交互操作。此部分可裁剪,主要根据嵌入式软件是否需要交互操作而定。其主要功能需要根据特定的软件设计实现。
(3)驱动模块负责封装与仿真系统测试数据有关的处理逻辑,向人机界面提供独立于体系结构的操作接口。系统测试阶段除了正常的功能和性能测试,更应该进行意外测试和破坏性测试,即测试系统正常执行情况下不该发生的激发活动和人为的破坏性测试,进一步验证系统性能。而驱动模块则将测试用例中各种测试数据传输给被测嵌入式软件。
(4)桩模块为嵌入式软件提供各种必要的输入数据。嵌入式软件的正常运行需要必要的外界输入数据,以完成系统的正常运行和交互。无论这些输入数据通过什么方式提供,桩模块都应该为嵌入式软件模拟各种输入数据。对于系统测试来说,输入数据也应该包括正常数据和非法数据两种。
(5)分析模块包括测试结果、预期结果和故障模型三部分。测试结果为执行测试用例以后被测软件执行的结果;预期结果为测试开始之前,测试人员针对不同测试用例输入的预期结果;故障模型中包括对各种故障的定位。故障模型在一个测试结束后,积累的错误定位模型可以通过外部接口导出,既可以用作其他测试系统的故障模型,也可以导出Word或Excel文件,用于开发人员进行分析总结。
分析模块在得到测试结果以后,首先与预期结果比较。如果相同,则测试通过;否则在故障模型中搜索相应的故障,并定位故障。如果故障模型中没有相应的错误定位,分析模块直接将未通过测试的测试结果和测试用例反馈给测试人员,由测试人员进行定位。当错误定位以后,测试人员根据测试实例修改故障模型,增加错误判断事件。通过不断循环,故障模型部分的各种故障定位逐渐增加,仿真系统在不断学习过程中实现错误定位。
(6)人机界面用于各种数据、结果的输入和显示,以及交互操作的人工输入界面。
3 铁路微机联锁系统测试
被测铁路微机联锁2乘2取2系统运行在CPU(486DX)上,属于典型的嵌入式软件。逻辑图如图3所示。
被测嵌入式软件运行在图3中A系和B系的CPU中,通过以太网接收人工下达的联锁命令,经过处理后通过DP协议网络传输给输出模块,控制现场设备。A、B系中只能以一个系为主系,主从系的切换可以通过手动切换实现,也可以自动切换。
3.1 测试实施
测试实施之前,首先编制测试用例,并针对每个测试用例给出预期结果和可能产生的错误以及相应错误的故障定位。把这些数据输入仿真系统的分析模型中,为即将进行的测试工作做准备。
在测试实施过程中,首先利用此仿真系统按照第一类测试方法进行测试,验证铁路联锁2乘2取2系统被测软件是'工作的',也就是软件的功能是按照预先的设计执行的。然后按照第二类测试方法进行测试,验证软件是不工作的。
使用仿真系统设计并实施了很多在实际软硬件环境中不可能实现的测试用例。举例说明如下:
(1)非法数据的输入。正常运行的系统,操作人员不可能发送错误的联锁命令给被测软件,输入模块也不可能产生测试需要的各种非法输入数据。使用仿真系统的驱动模块和桩模块,可以很轻松地发送任何组合形式的非法数据,以测试铁路联锁2乘2取2系统被测软件的安全性。结合分析模块的使用,具体实施过程为:
通过人机界面输入超长非法测试数据6,244,244,80,0,17,1,0,80,0,255,255,255,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0给被测软件,预期结果为无测试结果数据返回,即嵌入式软件将非法数据过滤掉,不进行任何操作。仿真系统通过人机界面提示测试通过,实际情况也确实是微机联锁系统未进行任何操作,便将超长的非法数据过滤了。通过人机界面输入固定码的非法测试数据170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,预期结果为无测试数据返回,即嵌入式软件将非法数据过滤,不进行任何操作。仿真系统通过人机界面提示测试通过,而实际情况是微机联锁单元出现了死机现象。针对这种情况,修改预期结果内容为“无测试数据返回且与被测应用软件正常通讯”,而在故障模型中增加了“与被测应用软件无任何通讯”项,以修正仿真系统的错误定位为微机联锁单元死机。同理也要修改前面超长非法测试数据的预期结果和故障模型的内容。如此反复,仿真系统的分析模型也在不断完善中。
(2)通信容量测试。铁路联锁2乘2取2系统被测软件中的基本功能包括系统通信最大I/O模块总数为100。在正常测试过程中,一般无法为测试搭建如此大规模的硬件测试环境,即使可以搭建,也会因为性价比较低而不实施此项测试。使用仿真系统,可以通过桩模块和驱动模块轻松实现100个I/O模块的通信量,同时可以省去购置I/O硬件模块的费用。
(3)铁路联锁系统软件需要满足IEC61508标准[4]中SIL4的要求。通过仿真软件驱动模块重复发送联锁命令,可以很容易地测试铁路联锁2乘2取2系统中的软件是否满足SIL4的要求,而这些测试如果单纯用人工输入进行测试是不可能实现的。交互操作模块则可以在测试过程中完成软件与人必需的交互操作功能。
被测软件第一次测试结束后,开发人员根据仿真系统的错误定位集中修改软件中的BUG,然后提交进行第一次回归测试。经过在第一次测试中人机交互的不断完善,仿真系统的分析模型趋于成熟,在回归测试过程中能很快定位错误,为测试及开发人员节省了大量时间,缩短了软件开发周期。
3.2 测试结果
通过使用仿真系统对铁路联锁2乘2取2系统被测软件实施测试,共发现涉及软件故障安全原则的致命问题和严重问题10个,涉及软件漏洞安全的致命问题和严重问题5个,涉及功能未实现的致命问题和严重问题6个,涉及可靠性的致命问题1个,一般和提示问题30个。
针对嵌入式软件的特点提出的具备交互式错误检测定位功能的仿真系统架构模型,实现了在系统测试过程中检测定位软件错误,解决了嵌入式软件系统测试过程中,由于被测程序与嵌入式系统平台和底层程序融合在一起,错误不容易定位的问题。通过在铁路微机联锁测系统试项目中的应用,发现了很多关键性问题,并且为测试人员和开发人员节省了大量时间,加快了测试进度,在回归测试阶段表现尤为明显。事实表明,此仿真系统架构模型不仅可以应用于嵌入式软件的系统测试,也可以应用于非嵌入式软件的黑盒测试。在以后的研究中,将应用人工智能学科的学习理论,实现仿真系统分析模块的自动学习功能,以实现在测试过程中自动定位软件错误,而无需人工干预。
参考文献
[1] 郑人杰.软件工程(高级).北京:清华大学出版社,1997.
[2] HETZEL D B.The complete guide to software testing(second
edition).John Wiley&Sons,Inc,1988.
[3] PATTON R.软件测试.北京:机械工业出版社,2005.
[4] IEC61508-7-2000.电气/电子/可编程电子安全相关系统的功能安全,第7部分:技术和措施综述.国际电工委员会,2000.
|