论文部分内容阅读
随着软件系统规模的不断扩大、复杂度迅速的上升,对软件质量提出了更高的要求,软件质量受到人们越来越多的关注。软件测试这一确保软件质量的有效方法也越来越被学术界和工业界所重视。基于语句覆盖的测试方法,如语句、分支覆盖等,即使达到了100%覆盖率,也无法确保100%检测出程序所含故障。为解决该问题,人们提出了一种高故障检测率方法,主要思想是使用变异测试方法来检测语句覆盖无法检测出的那一部分故障。本文完成了该框架中:去除冗余的变异算子、面向数值型变异体的值域分析和设计实现了高度可扩展的变异系统三个主要部分,并对整体检测效果进行了实验。此外,故障定位也是测试总体流程中承上启下重要的一环,现有基于程序执行频谱的方法,受偶然正确性用例等影响,而基于变异的故障定位方法则可以避免这一类噪音的影响。本文提出一种基于变异测试的去算子敏感性的故障定位方法。本论文依托国家自然科学基金重大研究计划“代码自动化覆盖测试的关键技术研究与系统研发”(课题编号:91318301)、国家自然科学基金项目“基于抽象内存模型的复杂类型测试用例生成方法研究”(课题编号:61202080)、国家高技术研究发展计划(863计划)“网构化软件协同生产和运行演化集成平台及服务环境”(课题编号:2012AA011201)和中国博士后科学基金(2015M581032)开展研究。本文将变异测试这一有效的测试方法,分别结合到高故障检测和故障定位两个测试领域。本文以提升高故障检测率方法的效率和精度、提升基于变异的故障定位的精度为目标,具体研究内容包括:(1)基于程序上下文的冗余变异体选择方法高故障检测率方法的目标是寻找一个小的变异体集合,该集合相对覆盖用例集是难测的。但变异测试可以生成海量的变异体,会大大提升测试成本和分析难度。因此,高故障检测率方法首先要去除冗余变异体,来降低测试成本。该部分工作贡献有:本文提出了一种基于程序上下文的冗余变异体选择方法,来降低变异测试成本。针对程序中的顺序语句所产生的变异体,基于故障的可达-感染-传播模型,提出了使用区间抽象域来表示程序状态,通过区间运算判断变异体之间冗余关系的算法;针对程序中的条件语句,基于谓词故障层级,分别给出了面向简单谓词和复合谓词的冗余变异体选择算法。并对这两种算法对冗余变异体的判定效果进行了分析,最后给出了在分层抽样背景下,非冗余变异体生成的约束边界条件。对Siemens和开源项目等共8个工程进行了实验,并与随机选择法进行了对比。结果表明,本文所提方法在减少变异测试时间成本的同时,可以保持较高的变异得分。(2)变异分析中基于仿射运算的变异体值范围分析方法高故障检测率方法将对非冗余变异体进行分析,选取难测故障集,分析过程涉及变异分析和变异测试用例生成等。其中,对数值型变异体的分析是一个重要的环节。这是因为在国防、航天、金融等关键领域所使用的计算机软件中,许多物理属性是通过数值变量来描述的,一些核心业务也是通过对这些变量进行数值计算来完成的。为寻找这些程序中难测故障,就需要对数值变量进行分析,计算结果的精度会直接影响高故障检测率方法的准确度。目前变异测试已有研究并未对数值型变异体采取优化分析,只是按字表含义进行简单的值域划分;或是使用了初级的精度不高的区间运算,严重影响了整体精度。该部分工作贡献有:本文在基于路径的程序分析背景下,结合变异测试的自身特点,使用精度更高的仿射运算来代替区间运算,给出了一种基于仿射运算的变异体值范围分析方法,给出了抽象域的定义、抽象语句的操作并描述了所支持的具体语义。提出了具体程序语句的预处理算法、具体语义向抽象语义的转化和变异约束的处理及仿射运算规则等。该方法作为变异测试/分析的前端处理模块,是难测故障分析的基础,是数值型难测故障分析的前置条件,可为其提供更加紧凑精确的输入域,以提升变异测试/分析的总体精度。此外,为验证本文方法整体的高故障检测率,进行了两组实验,分别使用了开源的TCASP和5个benchmark函数,实验结果表明:本文方法对条件型变异体,最高可以检测传统覆盖方法无法检测的故障的93.8%。对数值型变异体,平均可以检测78.5%传统覆盖方法无法检测的故障。(3)去算子类型敏感性的基于变异测试的故障定位方法随着变异测试研究的不断深入,人们发现除其自身的高故障检测率,和其他测试领域结合仍产生了不错的效果,如基于变异的故障定位等。基于变异的故障定位作为一种新出现的软件故障定位方法,相比基于程序频谱的定位方法,一定程度上克服了偶然正确用例带来的噪音问题,但现有的基于变异的故障定位未考虑变异算子类型敏感性问题,即随机使用算子会导致结果有很大的波动。该部分工作贡献有:为提升基于变异的故障定位效果,本文给出一种精度更高的基于变异测试的故障定位方法。具体的,针对关系变异算子、逻辑变异算子和值相关变异算子分别提出了算子选择算法。这种针对程序上下文进行的变异算子选择方法,可以一定程度上缓解使用随机算子所带来的定位不准确问题。使用两组疑似度计算公式对六个SIR开源程序和11个Linux实际程序进行了实验,结果表明本文所提方法可以缓解随机算子带来的算子类型敏感性问题,提升基于变异测试的故障定位方法的定位精度。(4)具有高可扩展性的变异测试系统为支持上述高故障检测率和基于变异的故障定位方法,设计实现了一款具有高可扩展性的变异测试系统。该部分工作贡献有:本系统针对现有C语言变异测试工具的算子类型不易扩充、自动化程度较低、对实际工程支持有限等问题进行研发,具体由故障注入、故障模型、批量执行与结果分析四个模块组成。使用自然的抽象语法树结构来表示变异体,具有高度的可扩展性;给出了针对循环体、字符串函数、数学计算函数和复杂数据结构的变异算子扩展方法,并可自定义更为丰富的变异算子,扩大变异测试的故障检测范围。使用实际开源项目中的程序,和其他故障注入工具进行实验对比,本系统具有更佳的测试效果。