摘要:针对嵌入式软件的特点,通过对现有一些软件缺陷分类方法进行研究分析,本文提出了一种基于故障模型的缺陷分类方法,这种方法在软件测试中能有效的发现一些极易疏忽的软件故障。
关键词:嵌入式测试;软件缺陷;故障模型;缺陷分类
一、引言
在嵌入式领域目标系统的应用系统日益复杂,开发技术日新月异,同时硬件发展的日益稳定,而软件缺陷问题却日益突出,软件的重要性逐渐引起人们的重视,越来越多的人认识到嵌入式系统的测试势在必行。但由于嵌入式系统具有实时性、内存不丰富、I/O通道少,CPU种类繁多等特点,相对非嵌入式软件开发和策略有很大不同,测试更复杂。
针对嵌入式软件难测的特点,使用有效的测试策略是唯一的出路,而面向故障的软件测试方法是比较有效的方法之一。面向故障的测试包括故障模型和基于该模型的软件测试方法。软件的故障模型一直是软件测试的瓶颈,而如何对软件故障进行分类,是软件故障模型研究的关键点之一。
二、软件缺陷分析
1、软件缺陷
软件缺陷不只是程序中存在的错误或疏忽,还包括在软件相关产品中存在的错误。在软件工程整个生命周期中,任何背离需求,无法正确完成用户所要求的功能问题,都属于缺陷范畴。
2、软件缺陷的分类
软件缺陷的分类方法很多,各种分类方法的目的不同,观察问题的角度和复杂程度也不一样。程序是软件的具体表现,所以为了便于测试,其定义的故障模型必须落实到程序上,也就是说,故障是程序中某个或某几个程序元素的错误。定义在程序中的故障必须满足下列几个条件:
1)故障必须是和实际是对应的。
2)故障必须能引起错误。
3)故障的个数是可以容忍的。
根据以上对缺陷的分析和研究以及项目研究的特点,我们尝试对缺陷进行一种新的分类,即按照故障模型来对缺陷进行分类。
三、缺陷分类模型
根据嵌入式软件应用的特点,可以分为以下几类型,分别是存储型、计算型、分支型、循环型、功能型、死锁型。
1、存储型
包括坏的存储和存储泄露错误;坏的存储指没有指向存储块的指针被释放,或用Delete释放被new[]定义的简单数组等。存储泄漏指动态分配的指针变量没有释放,造成存储泄漏。
2、计算型
包括变量的定义与使用方面的错误、数据的冗余、全局变量与局部变量(静态变量与动态变量)的混淆、数组变量的越界错误、用错指针变量、数据类型不匹配的错误、还有数据操作方面错误,包括函数调用参数传递错误、赋值语句错误等,该模型应该尽可能包括关于计算方面的各种错误。
3、分支型
主要是对分支结构进行建模,因为分支结构会在整个程序中占有很大比例,所以这种模型的建立是非常重要的。该模型中应该包括谓词的错误、包括判定变量被赋予了错误的值、谓词操作符不正确或少操作符、谓词中的变量不正确或少变量、谓词的结构不正确(if else 不匹配,分号位置不对)、少默认情况或默认情况不对,少动作或动作不对、出现额外动作等故障。
4、循环型
这也是一种程序控制流的模型,是对程序中同样占很大比例的循环结构建立的模型。主要包括永不循环故障或死循环故障,这主要是由循环变量引起的。因此这种模型中包括的物理故障有:循环谓词中循环变量被赋予了错误的值、循环谓词中操作符不正确或缺少操作不符、谓词中的变量本省不正确或少变量。
5、功能型
是指一些软件功能或性能不完善的故障。具体包括功能或性能规定的有错误、遗漏了某些功能、规定的某些冗余的功能、为用户提供的信息有错误、对意外情况的处理有错误、设计界面用户不满意、功能的结果不完善、提供的用户接口不完善等等。在很多应用商业软件中,这种故障模型所覆盖的故障占有相当大的比例。
6、死锁型
对于一些实时控制程序,如果需同时处理的任务较多的时候,往往需要多线程进行并行处理,当遇到多个线程相互等待的时候就进入了死锁。产生死锁的根本原因在于系统提供的资源少并发线程所要求的该类资源数。为了测试死锁是否发生,当线程进行资源请求时检查并发进程组是否构成资源的请求和保持环路。有限状态转移图和petriNet等技术都可用来有效的判断死锁发生。
四、结束语
软件缺陷作为软件开发过程的产物隐含了许多的信息,通过对这些缺陷的深入分析,不仅可以发现引发软件缺陷的根本原因,还能对软件进行更有效的测试。本文针对嵌入式软件的特点,提出按故障模型分类的嵌入式软件缺陷分类方法,在嵌入式软件测试中能有效的发现一些极易疏忽的软件故障。