并行程序中缩减测试用例方法与流程

文档序号:18475217发布日期:2019-08-20 20:56阅读:185来源:国知局
并行程序中缩减测试用例方法与流程
本发明涉及一种缩减测试用例方法,特别涉及一种并行程序中缩减测试用例方法。
背景技术
:测试用例缩减方法并不是一个新的问题,贪心算法、启发式算法、线性规划、遗传算法等都曾应用在这个课题上。在之前的工作中,许多研究者探索了关于测试用例自动生成或是优先级的一些技术。文献“刘晓强,解筱梦,杜明,etal.面向云测试的并行测试用例自动生成方法[j].计算机应用,2015,35(4):1159-1163.”提出了一种针对并行测试的用例自动生成方法。该方法首先根据场景流图采用深度优先遍历算法生成并行测试路径,录制组合产生并行测试脚本,并进行参数化处理;然后,使用基于搜索的软件测试(sbst)方法自动生成可经过目标路径的有效测试数据集,脚本与数据耦合形成大量可并行部署的自动化测试用例。但是文献所述方法只是对并行测试用例的生成进行考虑,并没有针对并行错误测试用例最小化给出一个优化。并行系统线程调度的特性使得它的空间复杂度和时间复杂度都要更高,使其检测相对比较困难。在给定的输入条件下,先前的工作已经对并行错误的检测有了显著的成效,但软件测试总是会面对大量的输入情况,以现存技术来说不可能对所有输入进行测试。因为一个多线程的程序可以采取多种不同输入,并以更多不同交互来执行每个输入,由此造成的巨大输入空间和交互空间大幅降低了测试运行速度,其后的错误校验使输入执行时间减慢了10倍甚至100倍,导致执行所有测试输入的代价过高而无法接受。同时即使是同样的输入,由于线程调度的原因,也不一定每次都会得到相同的结果。技术实现要素:为了克服现有缩减测试用例方法复杂的不足,本发明提供一种并行程序中缩减测试用例方法。该方法首先对并行程序进行研究,选取与并行错误密切相关的变异算子,并以此为基础为待测程序生成多种变异体。采用线程调度工具javapathfinder(jpf)作为线程调度工具来执行测试用例,根据每一个测试用例变异评分与平均时间成本进行对测试用例进行排序。在排序后的测试用例集中,从上到下依次选取检测能力不重复的测试用例,从而得到面向并行错误检测的最小测试用例集。本发明保证在同等并行错误检测能力的情况下,缩减了测试用例集,降低了测试的时间成本,方法简单。本发明解决其技术问题所采用的技术方案:一种并行程序中缩减测试用例方法,其特点是包括以下步骤:步骤一、选择变异算子。根据源代码特性,在程序中选取变异算子:mxt,rtxc,rjs,rsk,rsb,msp和esp。步骤二、生成变异体。根据变异算子生成变异体:airline_mxt,airline_rtxc,airline_rjs,airline_rsk,airline_rsb,airline_msp和airline_esp。步骤三、执行测试用例并获取其结果。采用线程调度工具jpf作为线程调度工具来执行测试用例,使每个测试用例都在原程序中执行一次。将在原始程序执行的结果视为期望结果。执行变异体程序并将结果与原始程序对比,如果与期望结果相同,这个变异体对应的测试用例项被标记为s,否则被标记为f。步骤四、计算ms值和ac值。在测试用例优先级评定方面,从变异评分ms和平均成本ac两个方面来评价。给定一个程序p和一个测试集t,ms和ac的定义如下:变异评分ms是测试中所检测出的变异算子占整个程序中变异算子总数的比例,在给定程序p和测试用例集t的情况下,变异评分ms采用公式(1)计算:其中,km是指被程序发现并杀除的变异算子的数目,tm是程序中变异算子的总数,em是发现的等价变异体的数目。平均成本ac是指一个测试用例分别以不同变异体运行时的平均执行时间。采用公式(2)计算:其中,n表示所有变异体的数量;ci表示对一个变异体mi执行测试集t中的一个测试用例t的实际运行时间。步骤五、根据ms值和ac值排序。根据ms值对各个测试用例进行降序排序,得出该测试集t中各个测试用例的优先级为t2-t6-t1-t4-t5-t3。由于t2与t6的ms值相同,t1与t4的ms值相同。各测试用例的优先级进一步优化为:t6-t2-t4-t1-t5-t3。新生成的序列中,t6优先级最高,因此将其第一个选入最小测试用例集t’中。t6所发现变异体为airline_mxt,airline_rtxc,airline_rjs,airline_rsk,airline_msp和airline_esp。以t6为基准,将其所发现的变异体加入至已发现变异体集m’中。在此基础上判断下一个测试用例t2是否发现新的变异体,即是否检测出不在m’中的变异体。若有,则将t2加入到最小测试用例集t’中,否则舍弃t2。继续进行判断下一个测试用例t4,t1…t3,直至判定完所有的测试用例。得到最小测试用例集t’。最终产生的测试用例集t’中包含两个测试用例t6和t4,其余测试用例未检测到新的变异体,因此将其舍弃,得到并行程序中缩减的测试用例。本发明的有益效果是:该方法首先对并行程序进行研究,选取与并行错误密切相关的变异算子,并以此为基础为待测程序生成多种变异体。采用线程调度工具javapathfinder(jpf)作为线程调度工具来执行测试用例,根据每一个测试用例变异评分与平均时间成本进行对测试用例进行排序。在排序后的测试用例集中,从上到下依次选取检测能力不重复的测试用例,从而得到面向并行错误检测的最小测试用例集。本发明保证在同等并行错误检测能力的情况下,缩减了测试用例集,降低了测试的时间成本,方法简单。表1试验中采用的程序数据程序代码行数变异体数目测试用例数aireline3876linkedlist179620unsortedtree1223820linkshareservice13803293573实验选择了4个程序作为实验数据集,其中aireline、linkedlist以及unsortedtree是三个来自于jpf所附带的测试程序集,另外一个较大规模程序linkshareservice为一个大型智能社区平台系统中的一个后台服务。表1中给出了实验采用的4个程序的代码行数、测试用例数、以及采用本文表1中给出的9个变异算子所产生的变异体数量。实验中,通过分别计算和对比原始测试集与最小测试集所发现全部变异体消耗的时间成本poc(percentageofcost)和测试用例执行比率pot(percentageofexecutedtestcases)这两项标准对最小测试集生成算法的效果进行评价。具体计算结果展现在表2中。其中poc-o与pot-t分别表示原始测试集发现全部变异体所消耗的“时间成本比率”及“测试用例执行比率”;而poc-m与pot-m表示应用本文算法所产生的最小测试集发现所有变异体消耗的“时间成本比率”与“测试用例执行比率”。表2四个被测项目耗费成本项目poc-opoc-mpot-opot-maireline0.88430.26360.83330.3333linkedlist0.81380.19010.80150.1536unsortedtree0.65120.13490.71340.1398linkshareservice0.93420.07820.99010.0418得知,生成的最小测试集在发现所有变异体所需要执行的测试用例及时间成本均远低于原始测试集,且随着程序规模的增加,这种差距更加明显。对于最小程序集aireline,其测试用例执行比率为原始测试用例集的33.33%,而消耗时间为执行原始测试集中全部测试用例时间的26.36%。对于规模较大的程序linkshareservice,发现所有变异体所需测试用例数仅为原始测试用例的4.18%,执行时间仅为原始时间的7.82%。因此,在大规模程序中,针对并行错误的测试用例选择是极其重要的。运用本文所给出的算法可以保证在同等并行错误检测能力的情况下,大幅降低测试成本,同时也为面向并行错误的测试用例选择提供了一种有效方法。下面结合附图和具体实施方式对本发明作详细说明。附图说明图1是本发明并行程序中缩减测试用例方法的流程图。具体实施方式参照图1。本发明并行程序中缩减测试用例方法具体步骤如下:步骤一、选择变异算子。表3aireline.java测试输入编号t1t2t3t4t5t6输入48,492,270,169,22,220,2表4与线程和同步相关的变异算子以并行程序“aireline.java”为例,详细说明使用该算法生成一个最小测试用例的过程。“aireline.java”是测试工具jpf库的一个并行程序示例,拥有两个输入参数,分别为{numoftickets}和{numthreads}。针对这个程序自动生成6个不同的测试输入组:根据实际意义,变量numoftickets的取值范围为0到100,变量numtreads的取值范围为1到5的整数。生成的测试用例如以表3的形式体现。在bradburyjs等人的工作中,他们基于java并行错误模式和特性对其提出了27种变异算子。根据源代码特性,在程序中选取了六个可被使用的变异算子:mxt,rtxc,rjs,rsk,rsb,msp,esp。表4是和在本实验中和线程同步相关的九种变异算子,剩余其他变异算子在本实验中对研究内容影响不大。步骤二、生成变异体。根据六个变异算子将对应生成的变异体命名为:airline_mxt,airline_rtxc,airline_rjs,airline_rsk,airline_rsb,airline_msp,airline_esp。步骤三、执行测试用例并获取其结果。以jpf作为检测工具来实现所有可能的并行调度,使每个测试用例都在原程序中执行一次。将实验在原始程序执行的结果视为期望结果。执行变异体程序并将结果与原始程序对比,如果与期望结果相同,这个变异体对应的测试用例项被标记为s(successful),否则将被标记为f(fail)。示例程序的执行结果展现在表5中。表5测试用例执行结果编号t1t2t3t4t5t6airline_mxtffsfffairline_rtxcffsfsfairline_rjssfsssfairline_rsksfsssfairline_rsbssssfsairline_mspffsfsfairline_espffsfsf步骤四、计算ms值和ac值。在测试用例优先级评定方面,我们从变异评分(ms)和平均成本(ac)两个方面来评价。给定一个程序p和一个测试集t,ms和ac的定义如下:定义1:变异评分(mutationscore,ms)变异评分是一个测试中所检测出的变异算子占整个程序中变异算子总数的比例,在给定程序p和测试用例集t的情况下,ms的计算方式如公式(1)所示:其中,km是指被程序发现并杀除的变异算子的数目,tm是程序中变异算子的总数,而em是发现的等价变异体的数目。变异评分用来评估一个测试集检测错误的能力,理想状态为评分1,即表示该测试集t下的变异算子能检测出程序p中的所有错误。定义2:平均成本(averagecost,ac)平均成本是指一个测试用例分别以不同变异体运行时的平均执行时间。计算公式如公式(2)所示:此时n表示所有变异体的数量;ci表示对一个变异体mi执行测试集t中的一个测试用例t的实际运行时间。根据执行结果以及前文计算公式可以得出各个测试用例的ms值和ac值,结果展现在表6中。表6测试用例的ms值表7列出了“aireline.java”不同变异体的每个测试用例的实际执行时间。根据公式2可以计算出其各自的ac值,将结果展示在表8中。表7不同变异体测试用例执行代价表8不同测试用例的ac值编号ac值t11.389714299t21.291576212t30.618283999t40.791285719t50.636714318t60.61742944步骤五、根据ms值和ac值排序。评价测试用例的错误检测能力的第一要素是ms值。基于表6的ms值对各个测试用例进行降序排序,得出该测试集t中各个测试用例的优先级为t2-t6-t1-t4-t5-t3。从表6中可以看出,t2与t6的ms值相同,同时t1与t4也具有相同的ms值。为了进一步优化测试,节省测试成本,该算法同时也考虑到执行时间的不同带来的效果。因此根据表8的ac值,将各测试用例的优先级进一步优化为:t6-t2-t4-t1-t5-t3。新生成的序列中,t6优先级最高,因此将其第一个选入最小测试用例集t’中。由表5知,t6所发现变异体为airline_mxt,airline_rtxc,airline_rjs,airline_rsk,airline_msp和airline_esp。以t6为基准,将其所发现的变异体加入至已发现变异体集m’中。在此基础上判断下一个测试用例t2是否发现新的变异体,即是否检测出不在m’中的变异体。若有,则将t2加入到最小测试用例集t’中,否则舍弃t2。由表5得知t2无法检测出新的变异体,因此将其舍弃。继续进行判断下一个测试用例t4,t1…t3,直至判定完所有的测试用例。至此可得到最小测试用例集t’。在示例“aireline.java”中,最终产生的测试用例集t’中包含两个测试用例(t6,t4),其余4个测试用例由于并未检测到新的变异体,因此将其舍弃。由此得到了并行程序中缩减的测试用例。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1