基于模糊测试的自动化软件测试方法

时间:2022-08-23 04:39:50

基于模糊测试的自动化软件测试方法

摘要:为了解决在大规模软件测试中,人工的软件测试费时费力而且测试效果差的问题,该文提出了一种基于模糊测试技术和路径覆盖分析方法的软件测试方法。该测试方法可以自动完成用例生成、用例运行、收集目标程序信息和计算可疑语句的可疑度。通过实验,该方法在不降低代码覆盖率和错误发现率的情况下,缩短了软件测试的时间。

关键词:自动化软件测试;模糊测试;错误定位

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)06-1231-04

计算机的应用越来越多地深入到人们的日常生活中,然而计算机软件还远没有达到零错误的要求。提高软件质量已经成为软件工程领域亟待解决的重要问题。软件测试,作为一种提高软件质量的重要手段而备受重视。在软件的开发生命周期中,软件测试是一个耗时耗力的过程,已成为软件开发的瓶颈之一[1]。据统计,软件测试约占软件开发和维护成本的50%~75%[2],因此,改进和改善软件测试技术变得十分迫切与重要。模糊测试[3]是一种通过提供非预期的输入并监视异常结果来发现软件漏洞的技术。模糊测试一般是一个自动或半自动的过程,这个过程包括反复操纵目标软件并为其提供处理数据。近年来,有很多学者在不同类型软件的软件测试中都证实了模糊测试技术的有效性和自动化的特点。模糊测试技术针对不同类型的测试环境有不同的测试策略。例如,张等人[4]提出了一种针对网络协议及模糊测试框架。沈等人[5]提出了一种基于文件规范描述的文件模糊测试算法,有效避免“无效”测试用例的生成,提高效率同时也增加了测试的全面性。

上面提到的模糊测试的研究重点主要集中在模糊器的设计与实现上,几乎没有涉及到错误定位的技术。基于频谱的错误定位方法是基于实际执行的动态错误定位技术的具体应用。Harrold等人证实了程序频谱与程序行为之间的关系,论证了通过研究运行失败测试用例得到的频谱信息与运行成功测试用例得到的频谱信息之间的差异性可为定位出错语句提供帮助[6]。该文调研了模糊测试技术和自动化错误定位技术的研究进展;第2节论述了自动化错误挖掘与定位技术可行性,并解释本文技术的动机;第3节介绍自动化错误挖掘与定位技术的实现方法;模型的实现将在第4节给出;第5节总结并展望未来的研究方向。

1 研究动机

在软件的生命周期中,软件的维护成本所占比例特别大,所以一个好的软件测试方法是非常必要的。一种优秀的测试方法可以发现软件中存在的大部分漏洞,从而可以降低软件的维护成本,提高软件的质量。模糊测试是1989年由Bartoon Miller教授首先提出的,并通过模糊测试在UNIX存在的大量漏洞。在1999年Oulu大学开发PROTOS测试集,这标志着模糊测试发展历程的一个重要里程碑。2002年PROTOS开始成熟,在2004年文件模糊测试开始兴起,AxtiveX模糊测试在2006年开始流行。到目前为止模糊测试取得了一定的发展,已经是软件漏洞挖掘中不可或缺的技术,但是这项技术仍然不是特别成熟[3]。图1给出了模糊测试的过程。

软件错误定位技术是通过运行测试用例得到程序的各条语句被测试用例覆盖的信息,然后利用覆盖信息计算出程序中语句的出错可疑度[7]。在实际的测试过程中,有很多情况是测试用例导致程序的崩溃,程序崩溃时寄存器中的信息也是非常重要的。所以利用程序的覆盖信息与程序崩溃是寄存器存储的信息共同来定位程序的出错信息可以提高定位的精度和速度。利用GCC中的GCOV命令可以收集C程序的运行的详细信息,包括覆盖率、代码的执行路径、程序的执行结果等信息。利用GDB调试器可以查看程序运行时CPU寄存器的状态。

随着计算机的不断发展,程序的代码越来越庞大,基于源代码审核的白盒测试需要大量的人力和时间,这会大大增加软件开发的成本。软件测试的自动化是未来软件测试发展的主要方向,通过把模糊测试技术和软件错误定位技术结合起来,可以实现软件测试的自动化,提高软件维护的效率。

2 自动化错误挖掘与定位技术

在这一节将介绍自动化错误挖掘与定位技术的总体结构,以及对结构中各主要模块的功能与实现。

2.1 自动化错误挖掘与定位技术的总体结构

为了实现软件测试的自动化,所提出的解决方案由一下几个模块组成:模糊器模块,测试结果记录模块,错误位置分析模块。图2为自动化错误挖掘与定位技术的流程图。

图2 自动化错误挖掘与定位技术的流程图

2.2 模糊器模块

模糊器模块的主要作用是生成测试用例,并把测试用例提交给被测软件,是模糊测试的核心结构。模糊测试可分为两类[8]:基于变异的模糊测试和基于生成的模糊测试。对于不同的测试目标有不同的模糊器,其中主要的分类有:

1) 环境变量和参数。测试对象主要是命令行参数和环境变量,主要的模糊器是iFuzz。

2) Web应用程序和服务器。针对Web服务器的存在漏洞的模糊器有Dave Aitel开发的SPIKE和WebScarab。

3) 文件格式。针对特定的文件格式,用于挖掘客户端文件解析漏洞,主要的模糊器有notSPIKEfile、SPIKEfile和FileFuzz。

4) 网络协议。通过特定的Socket形式将变异或者含有错误的数据包发送给目标程序,相应的模糊器有SPIKE和ProtoFuzz。

此外对于特定的测试目标,我们也可以手动构造模糊器,在构造模糊器时要充分考虑程序中可能存在的问题,例如:拒绝服务、整数处理问题、简单的栈和堆溢出、格式化字符串和目录遍历等。对于不同的问题确定模糊器不同的用例生成规约。例如,对于整数处理问题,我们可以设计这样的用例规约:生成边界值附近的测试用例0,-1,1,2,3,0XFFFFFFFF-1,0XFFFFFFFF-2等测试用例。此外,我们还可以直接在网上下载有用的工具和库,具体请查看文献[12]。

2.3 测试结果记录模块

我们的目标是实现软件测试的自动化,所以就不能依赖人工识别错误。为了实现这个目标,我们需要一种可靠的,可编程的方法。有一种方法是检查程序的返回代码[9],在现在的UNIX和Linux系统中,如果一个应用程序因为一个为处理的信号而中止,那么Shell的返回代码将等于128加上该信号数字。可以利用这个值来判断不同的错误。还有就是把应用程序连接到调试器,错误处理机制将阻止由模糊测试所导致的许多错误的明显标记,但是这些错误一般可以通过使用一个调试器来发现。在Linux操作系统中,GDB就是一个特别好的调试器,一般来说,GDB主要帮助你完成下面四个方面的功能:1)启动你的程序,可以按照你的自定义的要求随心所欲的运行程序;2)可让被调试的程序在你所指定的调置的断点处停住;3)当程序被停住时,可以检查此时你的程序中所发生的事;4)动态的改变你程序的执行环境。对于有些应用程序,我们也可以通过见识其运行日志带识别程序的运行结果。

测试用例执行路径是用于错误定位分析的主要数据,检测程序的主要方法是在程序的源代码中进行插桩,根据程序的执行结果来得到一个测试用例的执行路径。但是这种方法是基于语句的,在前期对源代码的处理中费时费力,效率低下。在这里提出了一种新的插桩策略,在程序运行的时候,有很多语句块只要语句块的第一条指令被执行,其后面的所有语句都会被执行,把这样的代码块称为基本块。在插桩时以基本块为单位,这样可以减少前期的准备工作,又可以提高程序的运行效率。

对于每个测试用例的结果都进行保存,用于最后的定位分析。我们把用例执行的相关信息保存到数据库中,其中数据库有三个标,分别用为:

1) 代码表(codes),用来存储程序的源代码;

2) 用例执行信息表(info),用来存储用例执行的各种信息,主要用,测试用例、执行路径、执行结果等;

3) 异常表(abnormal),存储导致程序出现异常时CUP各寄存器以及堆栈中的信息。

下面是记录模块的结构图。

图3 记录模块结构图

2.4 错误位置分析模块

错误位置分析模块的功能是根据数据库中的测试数据计算可能出错或存在漏洞的语句。因为数据库中记录了每条测试用例的执行路径和执行结果。可以利用数据库强大的数据处理能力,计算出错路径中每条语句的可疑度,其计算公式如公式(1):

[RESULTi(s)=TFi(s)TFi(s)+TP(s)] (1)

其中,TFi(S)经过语句S出错(错误类型为i)的测试用例个数,TP(S)是正常经过语句S的测试用例数。最后得到的结果为一系列语句可疑度的列表,其中可疑度最大的,出错的可能性也最大。

3 模型实现与实验

实验模型是建立在ubuntu 13.04 操作系统上,应用的开发语言是Python 2.7.4,数据库是Mysql Server 5.5.31。在实验模型中主要用到的软件有GCov 4.7.3和GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu。GCov用于收集用例执行路径,Gdb用于查看测试软件的执行细节。实验用的目标程序是从SIR[10](http://sir.unl.edu)网站上下载的grep。实验中数据库表结构如下表。

表1 目标程序代码表

表2 用例执行路径表

表3 用例执行路径表

通过简单的模拟实验,验证了该方法在软件测试中代码覆盖率、漏洞定位准确性有明显的提高,并且为发现的漏洞提供了相应的信息。并且在整个软件测试过程中,需要人干预的地方很少,基本实现了从用例生成、错误检测和错误定位的自动化。

4 总结与展望

本文中提到的软件测试方法实现了软件测试中用例生成、测试与错误定位分析的自动化,提高了软件测试的效率,加快了软件开发的周期,降低了软件维护的成本。同时该方法也存在一定的局限性,不能测试出软件中存在的逻辑错误,也不能能验证软件功能的完整,只对软件中存在其他错误(非法引用、堆栈溢出、格式化字符串等)有效。

在以后的研究中,应探索新的软件错误定位的方法和技术。可以从一下几个方面展开研究:

1) 利用动态的二进制插桩。在软件测试中,有很多错误不能直接被发现,例如:函数的堆栈溢出,如果溢出只是覆盖了函数中的一些变量,没有覆盖函数的返回地址,即EIP的值。这种情况程序是不会报错的,根据程序的运行结果很难定位错误。所以利用动态二进制插桩来实时监控程序的运行状态是一个不错的研究方向。

2) 利用人工只能,实现软件错误定位与自动修复。随着计算机技术的发展,软件规模越来越大,Binkley 估计到 2025 年人们开发的代码将达到万亿行[11]。面对数量庞大的代码,数据挖掘、机器学习等人工智能技术将会在故障定位方面得到很好的应用。

参考文献:

[1] Zhang Yu-Qian,Zheng Zheng,Ji Xiao-Hui. Markov Mpdel-Based Effectiveness Predicting for Software Fault Location[J].Chinese Journal of Computer, 2013,36(2):445-448.

[2] Yu Kai,Lin Meng-Xiang.Advances in automatic fault localization techniques.Chinese Journal of Computer,2011,34(8):1411-1422.

[3] Sutton M,Amini A G P.Fuzzing: Brute Force Vulnerability Discovery[M]. 黄陇,于莉莉,李虎,译.北京:机械工业出版社,2009:13-20.

[4] 张宝峰,张斌,许源.基于模糊测试的网络协议漏洞挖掘[J].清华大学学报:自然科学版,2009,49(S2):2113-2118.

[5] 沈亚楠,赵荣彩,王小芹,等.基于规范生成的文件模糊测试[J].计算机工程与设计,2010,31(16):3591-3594.

[6] Harrol M J,Rothermel G,Wu R,Yi L.An empirical investigation of program spectra[C].Proceedings of the ACM SIGPLAN/SIGSOFT Workshop Program Analysis for Software Tools and Eng (PASTE' 98). Montreal, Quebec,Canada,1998:83-90.

[7] 谭德贵,陈林,王子元,等.通过增大边际权重提高基于频谱的错误定位效率[J]. 计算机学报,2010,33(12):2335-2338.

[8] 陈衍铃,王正.模糊测试研究进展[J].计算机应用与软件,2011,28(7):291-293.

[9] Sutton M,Amini A G P.Fuzzing:Brute Force Vulnerability Discovery[M].黄陇,于莉莉,李虎,译.北京:机械工业出版社,2009:65-66.

[10] Do H,Elbaum S G,Rothermel G.Supporting controlled experimentation with testing techniques: an infrastructure and its potential impact[J]. Empirical Software Engineering,2005,10(4):405-435.

[11] Binkley D.Source code analysis: a road map[C].Proceeding of Future of Software Engineering (FOST' 07),Minneapolis, USA, May 23-25,2997. Washington,DC,USA:IEEE Computer Society,2007:104-119.

[12] Sutton M, Amini A G P Fuzzing: Brute Force Vulnerability Discovery[M]. 黄陇,于莉莉,李虎,译.北京:机械工业出版社,2009:48-50.

上一篇:越做越大的土地蛋糕 下一篇:粉煤灰对混凝土抗冻性能影响研究