打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
软件错误注入测试技术概述(转载)
软件错误注入测试技术概述
2015.6.16
上海市浦东科技信息中心   石习   2010-09-28
关键字:软件错误注入 测试 SFIT 浏览量:663
软件错误注入测试(software fault injection testing,简称SFIT)技术经过近30 年的发展,一直是软件测试领域最活跃的研究内容之一.作为一种非传统的测试技术,在提高软件质量、减少软件危害及改进软件开发过程等方面起着重要作用。
一、 SFIT基本原理及方法
SFIT 的目的是根据一定的错误类型模拟注入相关错误,以便观察系统的输入与输出并评估系统的鲁棒性和可靠性,最终避免在实际应用中发生软件失效并造成损失.通常,可注入的错误类型有:1) 内存错误;2) 处理器错误;3) 通信错误;4) 进程错误,如死锁、活锁、进程循环、进程挂起及使用过多的系统资源等;5) 消息错误,如失去消息、已损坏的消息、无序的信息、信息复制和组件间等待消息时间超时;6) 网络错误;7) 操作程序错误;8) 程序代码错误,如语句、变量等。
1. 主要的软件错误注入方法
(1) 程序变异。程序变异是一种基于源代码的SFIT 测试常用方法.主要有代码变异和数据状态变异两类,其中代码变异是直接修改源代码,从而改变程序执行状态;数据变异是指程序运行时修改程序的内部状态,如内存、全局变量及时间等。
(2) 软件陷阱。错误注入指令可以放置在目标程序的任何地方,当程序运行到设置的trace bit 时,程序被切换到错误注入进程,这时由错误注入进程执行系统调用完成错误注入.典型的实现工具是FERRARI。
(3) 基于反射机制的错误注入方法。利用某些高级语言的反射功能实现错误注入,如FIRE 方法.当程序运行时,通过反射机制获取元对象信息并改变方法调用顺序,从而执行错误注入。
(4) 封装测试法。增加适当的错误注入机制于被测试对象并封装成一个封装对象,然后对该封装对象进行错误注入.主要用在COTS 软件的测试上.例如,FST(fault simulation tool)工具,把DLL 组件封装并用伪DLL进行替换实施错误注入,用来评估Windows NT 系统的鲁棒性。
(5) 增加扰动函数法。通过扰动函数强制修改变量的内部状态实施错误注入.扰动函数通常用于源代码中,为了不被侵扰通常被编译成字节码或独立的程序体.如flipBit 函数,倒置二进制位,即使指定位从0 到1 或从1 到0,也可用于数据变异测试。
(6) 接口变异测试。修改组件接口层语法单元实施错误注入,如修改函数调用、调用顺序、返回值、参数及共享变量等。
(7) 断言违背机制。代表程序当前状态的断言在程序执行前,执行中及运行后都应为真值.真值代表当前程序运行正常,假值代表程序运行有错误.断言违背就是故意使断言为假的错误注入测试.另外,断言违背还可以增加测试覆盖性。
(8) 环境错误注入法。对运行时待测对象和操作系统交互的环境进行扰动,如注入内存、网络、磁盘文件等错误;而对基于消息的测试对象可注入通信时的环境错误,如注入多通信方进行压力测试及损坏消息错误等。主要技术是采用系统API 截获法。
(9) FUZZ 测试法。也称随机测试法.根据不同的待测试对象采用不同的随机函数生成FUZZ 测试用例,目前主要有对文件名、文件格式、文件内容、函数参数、程序变量及内存值的FUZZ 测试方法.FUZZ 法容易实现,现实应用较多,但测试效率不高。
(10) 规约变异。该方法对软件需求设计时的规约(合约)进行变异,通过定义有效的变异算子来减少规约变异体的数量,从而降低变异测试的计算代价,提高测试效率.进一步可发现由于规约被错误理解或实现所导致的软件错误。
2. SFIT 主要优点
1) 加速错误的发生;
2) 能够测试COTS(commercial- off-the-shelf)软件。当前仅有的一些构件安全测试方法也主要采用传统的软件测试方法,不适应于构件特别是COTS构件安全性测试。COST 软件源代码不可知及高度独立,而错误注入特别是环境错误注入是一种较好的构件安全性测试技术。使用SFIT 可以在一些公共方法及API等接口层注入错误,进而观察和评估待测试软件;
3) 增加测试覆盖性.对于一些小概率错误及难以达到的路径具有较好的测试效果; 4) 能够进行变异分析.通过测试用例及变异充分度推测错误隐藏性.一般有3 个分析过程,即执行分析、感染分析和传播分析);
5) 对系统鲁棒性和可靠性测试具有较好的测试效果等.有两类问题将引起软件问题,一类是有缺陷的软件,另一类是有缺陷的软件环境.当前绝大部分的软件保证手段都是解决第1 类问题,但它却误导了软件质量的检测范围.软件错误注入技术包含很多方法试图解决上面提到的两类问题。
二、 基于SFIT的应用
1. 基于错误注入的构件鲁棒性测试
目前,越来越多的商业软件包括一些安全关键软件使用COTS 构件,如军事、医疗、银行及金融等行业.COTS 构件的鲁棒性决定了整个软件的可靠性与安全性,测试COTS 构件成了重要一环,也是较为困难的一环. 下图是COTS 构件鲁棒性测试的一般步骤,图中虚线框为根据不同的测试方法采用的不同错误注入模块.当前的一些研究也主要采用了随机法(FUZZ)、封装测试法、API 扰动法和环境错误注入法,如FUZZ,FST,Ballista等COTS 构件测试工具.FUZZ,FST 和Ballista 都是较早用于测试系统构件鲁棒性的工具,且均具有一定的测试数据自动化生成能力。
近两年的研究集中在基于错误注入的COTS 构件安全性测试技术、基于错误注入技术的实时COTS软件的鲁棒性验证与评估和利用错误注入技术加固COTS 软件的鲁棒性和安全性。利用错误注入技术对COTS 软件的鲁棒性和安全性进行加固技术其工作过程是: 首先静态分析COTS 构件的接口信息及运行环境,找出可能的错误注入点;然后动态注入一些假设的常用错误参数并观察构件反应;最后总结、分析输入参数和发生异常的情况,对COTS 构件进行封装并增加对异常输入的处理功能以加固构件的鲁棒性和安全性。
2. 基于错误注入技术的Web 服务可靠性测试
传统的错误注入技术由于实时性限制等原因并不适用于分布式应用系统的测试; 而目前利用错误注入技术对分布式系统的测试研究工作也仍然聚焦在基于紧密耦合的系统,这对于测试Web 服务显然是不合适的. 此外现存的网络层错误注入技术在测试网络消息丢失毁坏时很有用, 但是在更详细地测试系统的其它性能时是无效的. 而由于所有的RPC 交互都通过消息交换发生在网络层边界, 所以合乎逻辑的Web服务测试应该是网络层错误注入. 因而我们采用一种网络层错误注入方法的修改版本来对Web 服务进行可靠性测试. 这种方法与标准的网络层错误注入技术的区别在于它的错误注入器对SOAP 消息进行译码并能够将有意义的错误注入消息, 而不是将或多或少的随机错误注入消息。
SOAP 应用系统可以两种模式工作, 一种被称为RPC, 另一种叫法不统一, 在Microsoft 的文档中称作document-oriented. 而在Apache 的文档中, 被称为message-oriented, 这是一种可以利用XML 交换更为复杂的结构数据的应用. 本文主要讨论基于RPC 的SOAP 应用系统测试, 测试模型见图
SOAP 按照服务描述协议(WSDL) 所提供的Web 服务接口, 封装RPC 调用的各个条目, 然后把他们变成固定格式的XML 消息, 再使用HTTP 把请求发送到Web 服务. 在发送过程中中间节点截获SOAP 消息, 通过XML parser 和序列化器将其中的RPC 参数序列分析提取以便于错误注入, 再经另一个过XML parser 和反序列化器重新封装成SOA P 消息转发出去, 这样Web 服务接收到的就是经过参数扰动的SOAP 请求, 从而实现对Web 服务进行可靠性测试的目的。
三、 SFIT 存在的问题及其研究展望
1. 存在的问题
SFIT 在为用户提高测试效率及保障软件质量的同时,还存在一些问题.既有技术上的因素,也有设计的原因,还有用户的需求影响.概括起来有以下几个方面:
(1) 错误注入措施改变了系统的运行状态并影响了被测试系统的性能
无论是静态错误注入还是动态错误注入,都将给被测系统带来额外的负荷,进一步易产生Heisenbugs(间歇性、不确定性错误).静态错误注入在代码执行前注入相关错误,虽然在程序运行时无须控制或扰动即可完成错误注入.但因缺乏控制及交互,无法获知错误被激发时间及对被测试系统的影响,可能改变系统的运行状态.运行时,错误注入由外部错误注入机制对被测系统进行控制、监测和分析,这样将影响被测系统的行为和性能,甚至改变原始软件结构,增加系统的负荷。
(2) 不同环境不同系统不同类型的错误模拟成为难点
软件错误注入测试的本质是模拟各种不同的错误,包括硬件和软件错误.一些系统复杂而多样、代码量大,准确而全面模拟真实的错误很困难.即使能够模拟,穷尽测试也是不现实的,错误注入测试技术也不能满足其效率要求.此时需要精心设计错误注入测试用例,注入一些最大可能触发被测试系统失效的错误.但目前要设计不同平台、不同系统及不同环境下的错误注入用例往往很困难.另外,SFIT 模拟故障延时、故障繁殖及短时延错误很困难,且不能很好地监测并观察被测试系统反应,错误更不能被注入到软件不能访问的位置。
(3) 软件oracle 难以确定及错误注入测试用例难以自动生成
软件oracle 难以确定,给测试结果的判断提出了挑战.即使有些错误可以根据需求规约给出oracle,但也要测试者手动给出,很难自动产生.另外,错误注入测试用例自动产生也很困难,特别是对一些复杂系统的环境动态错误注入,首先要分析系统运行的环境找出一些可能的错误注入点及注入方式,然后再设计可行的错误注入用例进行测试,最后评估错误注入的结果.这些过程本身是很依赖环境的,很难独立地自动运行.一旦环境发生变化,原有的错误注入测试用例生成步骤也必须作相应的变更。
(4) 依赖于其他的辅助机制才能完成错误注入测试
有时单凭错误注入技术很难发现程序隐匿故障、软件错误异常及错误类型,需要结合动态监测机制或断言违背机制进行识别.此外,错误注入测试用例的生成也依赖于程序分析机制、静态扫描机制及反射机制等其他软件工程方法。
(5) SFIT 的研究大多停留于理论,缺乏商用系统
当前学术界对SFIT 技术的研究如火如荼,各种理论与技术不断提出,研发的原型系统也不断增加.但是,许多研究(如源代码变异测试、扩展传播分析及AVA 分析等)仅停留于理论,且SFIT 原型系统一般都是针对特定平台、特定对象的,大多数系统中都使用其自行研发的错误注入环境,各研究机构开发的系统因缺乏相应的公共工作平台或移植困难而无法运转,原型系统的安装与配置复杂且应用范围小.这些都极大地限制了SFIT 原型系统的共享与普及。
(6) 其他一些问题.例如,没有很好地解决错误注入后的现场恢复问题;预测SFIT 注入的错误传播到一些指定的程序位置成为技术难点;SFIT 度量标准不够完善;资源可用性的约束,如代码、时间及其他系统资源等;在错误注入测试下的软件异常反应并不能验证软件是否符合需求说明.因此,SFIT 测试只是传统软件测试的一种补充,而不是替代,更不是银子弹。
2. 研究展望
硬件错误注入花费高及适应范围小,软件错误注入具有较好的应用前景.近几年的研究成果显示,SFIT 的检测效率在50%~90%.选择SFIT 何种方法取决于被测试系统的规模及测试时间,采用动态错误注入方法具有较好的性价比,如FERRARI,DOCTOR等.SFIT技术的目的是解决测试的效果及效率,提高软件质量,从其过去的研究历程与当前的研究状况来看,SFIT 的未来发展趋势主要有:
(1) 错误模拟范围将更广、更全、更准确
为了测试软件系统各种复杂的错误,模拟各种错误将是亟待解决的问题.SFIT 技术将探索模拟各种需求、各种平台、各种环境、各种类型及各种语言错误,只有这样才能测试复杂软件系统的各种错误.如模拟规格说明错误将能测试出软件设计相关错误;对于一些嵌入式系统、实时系统、并发系统及分布式系统等含有时间逻辑的软件系统,模拟时间逻辑将能够有效地检测与时间相关的错误等。
(2) 基于错误注入的安全性测试度量与评估方法
AVA 是一种基于源代码的软件脆弱性评估方法,但对一些待测COTS 软件在给定的错误注入用例作用下,如何根据输出域及输入域评估待测试系统的安全性将是一个很有意义的研究课题.此外,SFIT 技术也可与马尔可夫模型相结合用于软件安全性预测与评估中。
(3) 不确定环境下的软件错误注入测试研究
很多跨平台的软件系统其部署环境无法预先说明,这必然加大错误注入测试的难度.现在系统环境复杂多样,硬件环境有Intel CPU,AMD CPU 及单片机处理器等;软件环境有基于Unix, Windows 及SunOS 等系统平台;语言环境有基于JAVA,C/C++,Fortran 等语言.研究在不同环境下的错误注入点、错误注入方式及错误注入测试用例的生成将极大地提高SFIT 系统的应用范围及实效性。
(4) SFIT 过程应逐步实现自动化与智能化
当前,SFIT 大多数都需要人工参与,远远没有做到测试的自动化与智能化.尽管人工操作可以避免测试的机械化,降低了一些因错误注入测试用例当机的可能,有效地防止测试中断等问题.但从SFIT 的长远发展来看,测试智能化是一种趋势,必然会逐渐减少人工参与的步骤.此外,人工参与效率低下,出错的主观因素更不可控制.SFIT 测试的自动化与智能化应沿着测试用例生成的自动化与智能化、错误注入的自动化与智能化、错误注入反馈的智能化及错误注入结果分析与评估的智能化路线进行研究。
(5) SFIT 将更注重应用与实践
一项技术或理论的提出、发展及成熟,乃至最终被人们所接受,一定要应用于实际,给人们的工作和研究带来方便.因此,SFIT 的逐步发展(包括理论研究与原型系统开发),都将体现在实际测试应用与工具系统中.目前,SFIT 相关技术及原型系统比较多,但尚未见较有实效的商业系统.SFIT 在未来发展中应更多地开发设计一些具有通用接口的错误注入构件,研究开发一些商业化产品,这将更有利于SFIT 的发展与成熟。
(6) SFIT 的其他技术及新的应用
基于SFIT 的一些新技术研究有:更准确的错误注入现场恢复技术;基于SFIT 的形式化验证与测试方法,如生成动态故障树、测试树、执行树等形式化方法等.SFIT 的一些新的应用场景有:Web 服务可靠性测试、网格服务测试及网构软件测试,DBMS 中安全性与可靠性测试,高安全关键分布式软件系统的测试,基于agent 模型的容错系统测试等.此外,SFIT 与软件缺陷预测技术[69]相结合也将成为一个新的研究点。
参考文献:
[1] 陈锦富等; 软件错误注入测试技术研究,软件学报,2009
卢炎生等,一种采用接口错误注入的构件安全性测试方法,小型微型计算机
系统,2010
[3] 吴蕾等,基于错误注入技术的Web服务可靠性测试研究,小型微型计算机系统,2007
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
软件产品质量要求和测试国家标准GB/T 25000.51-2016解读
蔬菜溯源管理系统功能测试报告
COTS|美国军方尝试建立COTS硬件分层标准
浅谈软件开发项目的质量控制
雷达目标模拟器,评估雷达性能(附下载)
引用 高手告诉我们计算机专业修学哪些知识:附(清华大学计算机全套教程!【珍藏】) - 成靖...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服