作者简介:任志伟(1980-),男,中国航空工业洛阳电光设备研究所工程师,研究方向为嵌入式系统软件开发、软件测试。
0引言
随着信息技术的不断发展,与硬件发展日益稳定相比,软件故障却日益突出,因此软件测试的重要性已经越来越被人们所重视。嵌入式软件有着开发工具昂贵、内存较小、实时性要求较高、CPU种类繁多、I/O通道较少等特点,为此,嵌入式软件的测试也与一般PC应用软件的测试有很大的差异。
1嵌入式软件测试概述
1.1嵌入式软件特点分析
嵌入式软件测试的主要目的在于验证软件的可靠性,与通常的PC应用软件相比,嵌入式软件的测试有如下几个特点:①嵌入式软件是针对在特定硬件环境下开发的,其运行和测试也需要依据特定的硬件环境;②实施性要求较高,除了要求有正确的输出结果以外,还需要考虑是否能够在规定的时间内得到运行结果。
1.2嵌入式软件测试环境分析
一般采用交叉开发环境来搭建嵌入式软件的测试环境。例如单元测试、集成测试等可以在PC机上完成的测试,通常都在PC机上进行测试,从而可以避免硬件环境的影响,提高测试效率。在后期的集成测试中,需要在具体的嵌入式软件硬件环境中,搭建交叉测试环境来完成嵌入式软件的测试。交叉测试环境的搭建需要注意以下几个方面的内容:
(1)主机与目标机之间的通信问题。可以通过以太网或者串口进行主机与目标机之间的物理连接,主机与目标机之间的数据格式可以预先进行定义。
(2)主机对目标机的测试控制。主要包括主机如何向目标机发送测试用例,如何跟踪目标机的测试,查看是否正常进行。
(3)目标机测试结果的反馈。通常运行嵌入式系统的目标机没有视频显示等便利的测试结果输出端口,因此目标机上的异常、错误信息和正常响应信息等测试结果都需要返回到主机上进行显示和输出。
在嵌入式软件测试环境的搭建过程中,需要测试嵌入式系统与已建设备是否协调,硬件设备电气特征是否正常,以及主机与目标机之间的物理信道是否通畅等,从而保证测试结果不受到嵌入式软件以外其它因素的影响。
1.3嵌入式软件测试策略
嵌入式软件不同的测试阶段有不同的测试策略。
(1)单元测试。为了提高嵌入式软件的测试效率,一般会将较大的嵌入式软件系统划分成若干相对较小的任务单元进行测试。由于宿主机上有更加丰富的资源,同时也为了方便对嵌入式软件的调试,一般在宿主机上进行单元测试。单元测试一般采用白盒测试策略,尽可能测试到单元模块中的每一个程序语句,每一个分值,从而提高代码测试的覆盖率。
(2)集成测试。为了找出系统逻辑结构错误和各个功能模块之间的数据传递错误,需要采用黑盒和白盒相结合的方式进行嵌入式软件集成测试。需要通过最大程度地模拟嵌入式软件实际运行环境。集成测试分成两个部分,首先可以在宿主机上测试软件是否存在逻辑结构错误,以及测试各功能模块之间是否有传递错误;然后,通过构建真实的嵌入式软件运行环境,来测试软件是否存在内存定位和分配上的错误。
(3)确认测试。确认测试必须是嵌入式软件运行在真实的硬件目标环境中,主要测试嵌入式系统是否由于测试环境的移植而受到影响。由于受到硬件目标环境资源不足、测试结果输出方式等限制,嵌入式软件的确认测试一般采用黑盒测试方案。
2嵌入式软件测试技术
2.1静态测试技术
静态测试可以充分发挥人的逻辑思维能力,包括代码检查、静态结构分析以及代码质量度量等方式。
(1)代码检查。代码检查主要包括对嵌入式软件开发的代码审查、代码走读等工作。代码检查的内容主要包括分析代码是否遵循嵌入式软件设计、开发标准,数据是否正确,接口是否正确等内容。
代码检查能够快速地找到嵌入式软件的缺陷,可以发现70%以上的编码和逻辑设计缺陷。因此,在实际应用中,代码检查可能比动态测试更加有效。
(2)静态分析。静态分析是借助测试工具对软件代码进行分析的方法,只可以分析是否存在内存泄露等特定的缺陷,受其他模块的影响较小。静态分析主要包括对数据流的分析、对控制流的分析以及对软件度量的分析等。
嵌入式软件的静态测试,主要是通过开发、测试人员对软件源代码进行审核分析,不需要进行测试用例的设计,因此嵌入式软件不需要特定的测试环境。
2.2动态测试技术
根据是否需要了解软件内部结构的区别,嵌入式软件的动态测试包括黑盒测试和白盒测试两种。
(1)白盒测试技术。在对嵌入式软件进行白盒测试时,需要对软件进行如下几个方面的检查:至少对系统中所有独立路径进行一次测试;至少在循环限内和循环边界对循环测试一次;对所有的逻辑判定都需要测试一次;对内部数据结构的有效性进行测试。
与通用的PC应用软件相比,嵌入式软件的白盒测试需要更高的代码覆盖率。而且嵌入式软件的白盒测试不需要在目标硬件环境中运行。
(2)黑盒测试技术。黑盒测试需要知道用户需要哪些功能,可能会遇到什么样的问题,在嵌入式软件自动化测试时,采用黑盒测试技术较为方便。但是,黑盒测试的代码覆盖率较低,一般仅为总代码量的30%左右。
2.3覆盖测试技术
覆盖测试技术根据嵌入式软件的内部结构来进行测试用例的设计,是白盒测试技术的一种。覆盖测试的基本准则是:所设计的测试用例要能够尽可能覆盖嵌入式系统的内部结构,从而发现嵌入式系统的问题和错误。覆盖测试的内容包括提高测试覆盖率、未被测试用例激活代码的测试、代码冗余检测等。因此,覆盖测试也是一个提高软件质量的手段,覆盖测试一般在嵌入式系统的单元测试中应用。
2.4程序插桩技术
程序插桩技术是覆盖测试的一个重要实现手段,其含义就是通过对程序测试状态的跟踪,来发现嵌入式软件中的缺陷。
程序插桩的基本思想包括:
(1)探针插入。可以在嵌入式程序中插入计数器、打印语句或者赋值语句来采集程序运行状态。
(2)探针编译。根据设计好的测试用例,重新编译嵌入式软件,通过执行探针来获取嵌入式软件执行的动态信息。
(3)特征数据处理。对特征数据进行分析和处理,从而获得嵌入式软件的数据流或者控制流信息,并且最终得到嵌
入式软件的判定覆盖、语句覆盖等信息,并且形成最终报表。
由于嵌入式软件运行的真实运行环境往往会受到输出方式的限制,为此嵌入式软件的程序插桩测试通常都采用宿主机和目标机结合的方式,其测试流程如图1所示。
在插桩完成之后,需要对嵌入式软件进行重新编译,并且将编译好的程序下载到目标机中,同时通过宿主机与目标机的通信,来对探针的运行以及探针运行结果进行分析。
3嵌入式软件测试内容
嵌入式软件测试的内容主要为:软件代码测试、编程规范标准符合性测试、代码编码规范符合性测试、开发维护文档规范符合性测试、用户文档测试。
其中软件测试服务范围包括:系统级测试、应用测试、中间件测试、BSP及驱动程序测试、嵌入式硬件设计测试。
其中,按照嵌入式软件有无操作系统将嵌入式系统分为两大类:无操作系统的嵌入式软件、有操作系统的嵌入式软件。
3.1无操作系统的嵌入式软件
无操作系统的嵌入式软件主要包括C语言代码、汇编语言代码、Apa代码等。
C语言模式软件测试:硬件设备及其他宏定义(编译阶段处理)、API函数测试、模块初始化(包括系统初始化)、中间功能件测试、功能模块测试、中断处理测试、任务调度测试、区域功能测试、总体功能测试。
汇编语言模式软件测试:硬件设备及其他宏定义(编译阶段处理)、模块初始化(包括系统初始化)、中间功能件测试、功能模块测试、中断处理测试、区域功能测试、总体
功能测试。
3.2基于操作系统的嵌入式软件
基于操作系统的嵌入式软件主要包括应用软件测试、系统软件测试、整体性能测试。
应用软件测试:模块初始化(包括系统初始化)、中间功能件测试、功能模块测试、区域功能测试、总体功能测试。
系统软件测试:硬件设备及其他宏定义(编译阶段处理)、API函数测试、模块初始化(包括系统初始化)、中间功能件测试、功能模块测试、中断处理测试、区域功能测试、总体功能测试、标准符合性测试。
其中,操作系统的标准符合性测试依据的标准主要包括:
IEEE POSIX 1003.1-1990 (VSX4-PSE)
IEEE POSIX 1003.1b-1993/1003.1i-1995 Realtime extension (VSRT-PSE)
IEEE Std POSIX 1003.1c-1995 Threads (pthreads) extension (VSTH-PSE)
IEEE POSIX 1003.13-1998 Profile 52 (VSPSE52)
VSPSE52:2003 - A conformance test suite for IEEE Std 1003.13-2003 Profile PSE52
整体性能测试:基于操作系统之上的嵌入式系统整体软件测试,主要采用应用软件测试,着重分析性能、内存分配、代码覆盖率、软件执行流程,并采用仿真器、逻辑分析仪等硬件测试工具进行整体性能的测试。
4嵌入式软件测试工具
用于辅助嵌入式软件测试的工具很多,下面对几类比较有用的嵌入式软件测试工具加以介绍和分析。
4.1内存分析工具
在嵌入式系统中,内存约束通常是有限的。内存分析工具用来处理在动态内存分配中存在的缺陷。当动态内存被错误地分配后,通常难以再现,可能导致的失效难以追踪,使用内存分析工具可以避免这类缺陷进入功能测试阶段。目前有两类内存分析工具——软件工具和硬件工具。基于软件的内存分析工具可能会对代码的性能造成很大影响,从而严重影响实时操作;基于硬件的内存分析工具价格昂贵,而且只能在工具所限定的运行环境中使用。
4.2性能分析工具
在嵌入式系统中,程序的性能通常是非常重要的。经常会有这样的要求,在特定时间内处理一个中断,或生成具有特定定时要求的一帧。开发人员面临的问题是决定应该对哪一部分代码进行优化来改进性能,常常会花大量的时间去优化那些对性能没有任何影响的代码。性能分析工具会提供有关的数据,说明执行时间是如何消耗的,是什么时候消耗的,以及每个例程所用的时间。根据这些数据,确定哪些例程消耗部分执行时间,从而可以决定如何优化软件,获得更好的时间性能。对于大多数应用来说,大部分执行时间用在相对少量的代码上,费时的代码估计占所有软件总量的5%~20%。性能分析工具不仅能指出哪些例程花费时间,而且与调试工具联合使用可以引导开发人员查看需要优化的特定函数,性能分析工具还可以引导开发人员发现在系统调用中存在的错误以及程序结构上的缺陷。
4.3GUI测试工具
很多嵌入式应用带有某种形式的图形用户界面进行交互,有些系统性能测试是根据用户输入响应时间进行的。GUI测试工具可以作为脚本工具在开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程。很多嵌入式设备没有GUI,但常常可以对嵌入式设备进行插装来运行GUI测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间。
4.4覆盖分析工具
在进行白盒测试时,可以使用代码覆盖分析工具追踪哪些代码被执行过。分析过程可以通过插装来完成。插装可以是在测试环境中嵌入硬件,也可以是在可执行代码中加入软件,也可以是二者相结合。测试人员对结果数据加以总结,确定哪些代码被执行过,哪些代码被巡漏了。覆盖分析工具一般会提供有关功能覆盖、分支覆盖、条件覆盖的信息。对于嵌入式软件来说,代码覆盖分析工具可能侵入代码的执行,影响实时代码的运行过程。基于硬件的代码覆盖分析工具的侵入程度要小一些,但是价格一般比较昂贵,而且限制被测代码的数量。
5结语
嵌入式软件的测试主要是为了保证嵌入式软件系统的高可用性和高质量。嵌入式系统的特殊性,使得嵌入式软件的测试在整个软件的开发过程中都占有非常重要的地位。为此,对嵌入式软件测试的研究势在必行。在具体的嵌入式软件测试过程中,应该根据嵌入式软件自身特点,开发具有针对性的测试工具来提高嵌入式软件测试的效率和质量。
参考文献:
[1]张君施.嵌入式软件测试[M].北京:电子工业出版社,2004.
[2]王璞,张臻鉴.面向实时嵌入式机载软件的测试技术研究[J].航空计算技术,1997 (4).
[3]刘利枚,周鲜成,石彪.嵌入式软件测试系统的设计与实现[J].国外电子测量技术,2008,27(1).