基于Android多线程数据依赖的变异测试方法与流程

文档序号:16627962发布日期:2019-01-16 06:17阅读:567来源:国知局
基于Android多线程数据依赖的变异测试方法与流程

本发明属于软件测试技术领域,是一种基于android多线程数据依赖的变异测试方法。



背景技术:

“变异测试”(mutationtesting)是一种软件测试方法。该测试方法是根据定义的变异算子(mutationoperators)在源代码中改变某些语句并检查测试用例是否能够找到错误,进而验证和提高测试集的有效性,常用于单元测试。在变异过程中,变异算子的选择是至关重要的,它将直接影响到变异测试检测测试用例的有效性。但是,现有变异测试工具(mujava,pit等)的变异算子大多是通用型算子,采用符号类型检测根据待变异代码语句的数据类型并运用对应的变异算子,适用于大部分java项目,但若直接运用于android项目,则会增加变异测试过程的时间成本,带来更多的工作量。由于开发android应用程序需要开发人员掌握很多预备知识,而这些知识不在传统变异工具的负责范围之内,现有的变异算子也无法针对性地在android应用程序中找到合适的程序变异位置进行变异。上述原因最终导致变异过程生成大量的死胎变异体(stillbornmutants,无法编译的变异体)和琐碎的变异体(trivialmutants,启动会crashes的变异体):开发人员对于一个具有特定上下文环境(例如多线程触发的上下文环境代码)的代码变异时,现有的变异算子难以给出足够精确的程序变异位置进行变异测试,而在没有针对性的代码段中应用算子,势必会得到大量的无效变异体,并且变异体的较大规模使得软件测试者也难以快速发现其中可能存在的测试集问题,进而直接影响了变异测试的效果。总之,提供一种变异测试的方法可以直接运用在android应用程序上,并可以提供多线程相关上下文相关的变异体,同时降低变异测试的效率和成功率,是当前变异技术无法解决的问题。



技术实现要素:

本发明的目的是针对现有技术的不足而提供的一种基于android多线程数据依赖的变异测试方法。该方法通过将android应用程序的数据流分析结果和抽象语法树相结合的方式,分析相关代码是否具备多线程触发的上下文场景,再结合java符号类型解析方法应用合理的变异算子,生成对应的变异体。该方法可以减少死胎变异体和琐碎变异体的生成,产生可影响线程执行的变异体,提高变异体的有效性。

实现本发明目的的具体技术方案是:

一种基于android多线程数据依赖的变异测试方法,该方法包括以下具体步骤:

步骤1:对android应用程序进行数据流分析,获取程序的数据流信息;

步骤2:利用抽象语法分析器分析得到每个源码文件的抽象语法树;

步骤3:结合java符号类型解析和字符串匹配方法得到多线程触发位置;

步骤4:结合数据流分析结果和抽象语法树,确定可变异的源码位置;

步骤5:对源程序中的可变异位置,应用变异算子,生成多线程数据依赖相关的变异体;

步骤6:编译每一个变异体并构建成android应用程序,运行android应用程序,执行测试用例集,记录测试结果。

所述步骤1,具体包括:

对待测程序的apk程序包进行反编译,并分析dex文件,结合android的四大组件的特性,在android组件的基础上构建主入口,并构建对应的跨过程数据依赖图(inter-proceduraldatadependencegraph,ipddg)。

所述步骤3,具体包括:

首先,获取步骤2中所述源码文件的抽象语法树,再依据android多线程的特征关键字,利用字符串匹配方法初步定位所有可能的多线程调用位置,最后利用java符号类型解析器,判定是否是多线程触发语句,得到较为精确的结果,并记录线程类型和调用位置信息;其中,所述android多线程包括thread,handler,runonuithread,asynctask四种类型。

所述步骤4,具体包括:

基于分析得到的多线程调用语句,选取数据流分析目标片段,通过分析得到多线程调用语句的数据依赖图,再结合抽象语法树,获取对应依赖的数据位置,标记为可变异位置。

所述步骤5,具体包括:

分析程序源码文件和依赖库,对可变异位置进行符号类型标识,若符合变异算子变异的语句要求,则将原语句替换为变异语句,生成变异体。

所述步骤6,具体包括:

编译变异体文件,使用多个模拟器并行运行apk,抛弃死胎变异体和琐碎变异体,记录有效的变异体数目;人工设计或使用android自动化测试用例生成工具生成测试用例;对每一个apk文件,输入测试用例集,记录输出结果并和待测程序输出结果对比,若输出结果不同则变异体被检测出来,计算出被“杀死”的变异体数量。

与现有变异测试方法相比,本发明有以下优点:

本发明创新性地提出了一种基于android多线程数据依赖的变异测试方法,该变异测试方法具有特定的变异作用域,与传统的变异测试方法不同,本发明变异测试方法只针对具有多线程数据依赖的代码块进行变异,以产生可影响线程执行的变异体,进而可对具有多线程数据依赖的代码块进行变异测试。因此,相比现有的变异测试方法,这种变异测试方法可以减少冗余的变异体,提高变异测试的效率,高效的检测特定测试用例集的有效性。本发明变异测试方法在变异时,克服了现有一些变异方法无法解析android文件中的数据类型问题,对android源文件数据类型进行解析,以减少无效的变异体生成;本发明的变异测试方法能够为测试人员提供方便,提高测试人员的工作效率。本发明进行了一系列的实验评估来验证本发明的有效性。最终结果显示,本发明的方法与最新的现有变异测试方法相比,不仅有全新的变异算子,算子生成的变异体更具有针对性,准确率有明显的提高。

附图说明

图1为本发明变异测试流程图。

具体实施方式

为了使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图以及具体实施例进行详细描述。

参阅图1,本发明变异测试方法主要包括两个阶段,变异体生成阶段和变异体测试阶段。由于变异测试需要定义变异算子来生成不同的变异体,为了验证本发明的变异测试方法,本发明定义了以下七个变异算子,见表格1。

表格1变异算子

以表格1中的flr变异算子为例。

变异生成阶段,根据图1的分析流程,本发明变异测试方法会先分析apk文件,以apk的各组件为入口点,分析整个app的过程间数据流图;接着会迭代读取待测程序源文件,使用抽象语法分析器分别对每一个java文件进行抽象语法树分析;再使用java符号类型解析和字符串匹配方法分析抽象语法树,判断文件是否具有多线程触发代码块,若不存在,则跳过当前文件,继续下一个文件,若存在,继续分析该多线程数据依赖的代码块;进一步地,遍历数据代码块,分析可应用flr算子的语句;对于flr算子,需要对表达式进行判断,解析出表达式类型,若表达式为for语句类型,则应用该算子在这个语句上,否则,跳过该语句,直至遍历完所有可变异的位置。最后,输出变异的结果,包括变异记录,变异体,以及变异位置的多线程触发类型。

实施例

本实施例中,以下面这段具有多线程调用的待测源代码p为例:

在apk分析时,会得到p中第19行语句中的变量rowids的数据流图,其包含的代码行有12,13,14,19;接着该方法会对源码p进行抽象语法树分析,分析到16行是thread类型的多线程触发位置;结合数据流图和抽象语法树,获取该类文件中16行语句的数据依赖语句链包含12,13,14;接着遍历这个语句链,若发现是for语句则应用flr算子,生成变异体,比如for(inti=0;i<citycount;i++)变异为for(inti=1;i<citycount;i++)。

变异测试阶段,该阶段的输入是前一个阶段生成的变异体,以及预先定义好的测试用例集。首先,使用编译器编译变异体生成可运行的apk,接着使用apk运行引擎并发启动变异体程序,并以测试用例(人工设计或android自动化测试用例生成工具生成)作为变异体输入,测试变异体;记录测试输出结果,与未变异的源apk测试结果对比,若输出结果不同,则变异体被检测出来;利用被检测出的变异体数量和有效变异体的数量之比量化测试集的有效性,比例越高测试用例集越有效;最后,所有数据结果形成测试结果报告并输出,结束。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1