一种基于配置项性能期望的软件性能缺陷检测方法与流程

文档序号:22083407发布日期:2020-09-01 19:44阅读:303来源:国知局
一种基于配置项性能期望的软件性能缺陷检测方法与流程

本发明涉及大型软件中的性能缺陷检测领域,具体涉及一种基于配置项性能期望的软件性能缺陷检测方法。



背景技术:

随着社会的不断进步,软件系统已经在各个领域得到广泛应用,在现代社会中扮演着举足轻重的角色,发挥了重要的作用。随着软件系统的不断发展,人们对软件的可靠性,安全性,性能(软件运行速度)要求越来越高,导致软件规模不断增大,软件复杂度不断提升。例如,hadoop分布式开源软件的2.8.0版本,源码文件数量超过8000,代码总行数接近千万。同时,软件系统提供更多更加灵活的配置项以使用户根据需求配置软件。例如,apachehttpd软件中共有个1000多个配置项,mysql中有800多个配置项。且非功能属性的所占的比例日益增加,这些配置项与计算资源(如cpu、内存等)、性能优化策略密切相关。同时,随着软件规模不断增大,提高软件性能是软件演化和维护最重要的任务之一。xuehan等人在esem2016发表的文章“anempiricalstudyonperformancebugsforhighlyconfigurablesoftwaresystems(高可配置软件系统中的性能缺陷实证研究)”表明:配置项也成为引发软件性能问题的主要原因之一,比例高达59%。在对148家企业的调查中,92%的企业认为提高软件性能是软件发展过程中最重要的任务之一。近年来,软件配置项相关的代码缺陷导致的软件性能问题造成了巨大的商业损失。

针对软件性能问题,现有技术主要采用两类方法对其进行检测。第一类方法,如dushen等人在issta2015发表的“automatingperformancebottleneckdetectionusingsearch-basedapplicationprofiling(一种基于搜索和profiling的性能缺陷自动检测方法)”,主要基于profiler等性能瓶颈诊断工具生成使软件运行缓慢的测试用例,并将执行该用例耗时最长的函数作为性能缺陷报告给开发者。虽然此类方法检测性能缺陷的覆盖率较高,但会存在大量误报。原因是测试用例执行缓慢可能并非由于性能缺陷导致,而是因为测试用例本身所需的时间较长。即,该类方法缺乏有效的性能测试预言(testoracle:incomputing,softwareengineering,andsoftwaretesting,atestoracle(orjustoracle)isamechanismfordeterminingwhetheratesthaspassedorfailed.测试预言:在计算机、软件、软件测试领域,测试预言是判断一个测试是否通过测试的标准)。

第二类方法,如adriannistor等人在icse2013发表的“toddler:detectingperformanceproblemsviasimilarmemory-accesspatterns(通过相似的内存读写模式检测性能缺陷)”,通过总结循环结构中的性能缺陷代码模式和变量读取模式,匹配待测软件中的性能缺陷。此类方法基于缺陷代码模式构建测试预言,能够有效减少性能故障的误报。然而,循环结构中的性能缺陷仅占一般性能缺陷的少量比例,因此该类方法局限于检测某种特定类型的故障(如循环结构中的缺陷),且经验证,该类方法仅能检测出9.8%配置项相关的性能故障。

综上,如何构建低误报、高覆盖的性能测试预言,并自动化生成相应的测试样例,以有效、全面地检测软件性能缺陷是本领域技术人员正在探讨的热点问题。



技术实现要素:

本发明要解决的技术问题是提供一种基于配置项性能期望的软件性能缺陷检测方法。此方法利用软件配置项性能期望构建测试预言(即当软件实际性能与配置项性能期望不符时,则存在性能缺陷),同时自动预测待测软件的测试预言;基于测试预言,自动生成测试样例,有效检测出配置项相关的性能缺陷。

为解决上述技术问题,本发明的技术方案为:首先,利用hehaochen在esec/fse2019发表的“tuningbackfired?not(always)yourfault:understandinganddetectingconfiguration-relatedperformancebugs(配置调节适得其反?不总是你的错!理解并检测配置相关的性能缺陷)”所述的配置项性能期望构建由配置项期望预测模块、测试样例生成模块、性能缺陷检测模块构成的性能缺陷检测系统;然后,读入人工标记了配置项期望的训练数据集,对配置项期望预测模块进行训练;最后读入待检测软件(包括软件、软件自带测试集、软件配置项用户手册),由配置项期望预测模块预测配置项的性能期望并发送到测试样例生成模块和性能缺陷检测模块,测试样例生成模块根据性能期望和软件测试集生成测试样例并发送到性能缺陷检测模块,性能缺陷检测模块执行测试样例并检测性能期望和实际性能是否相符,若不相符则输出性能缺陷。

本发明包括以下步骤:

第一步,构建性能缺陷检测系统,性能缺陷检测系统由配置项期望预测模块、测试样例生成模块、性能缺陷检测模块构成。

配置项期望预测模块是一个加权投票分类器,与测试样例生成模块、性能缺陷检测模块相连,从待检测软件的配置项用户手册读取配置项的描述、取值范围,对待预测配置项的性能期望进行预测,得到配置项的性能期望标签(用标签表示性能期望的类别),将配置项的性能期望标签发送给测试样例生成模块和性能缺陷检测模块。

测试样例生成模块与配置项期望预测模块、性能缺陷检测模块相连,从配置项期望预测模块接收配置项的性能期望标签,从待检测软件的测试集读取测试命令,根据配置项的性能期望标签和待检测软件测试集生成测试样例集合t。

性能缺陷检测模块与配置项期望预测模块、测试样例生成模块相连,从测试样例生成模块接收测试样例集合t,从配置项期望预测模块接收配置项的性能期望标签,执行测试样例集合t中测试样例并检测配置项的性能期望标签所对应的期望性能和实际性能是否相符,若不相符则输出待检测软件的性能缺陷。

第二步:训练性能缺陷检测系统的配置项期望预测模块。读入人工标注期望的配置项和配置项的官方文档描述,训练配置项期望预测模块。

2.1构建训练集,方法是:从mysql、mariadb、apache-httpd、apache-tomcat、apache-derby、h2、postgresql、gcc、clang、mongodb、rocksdb、squid共12款软件的1万多个配置项中随机选取n(其中,n≥500)个配置项。

2.2根据n个配置项的官方文档描述,对配置项人工标注其性能期望标签,方法为:根据配置项(记为c)的文档描述(记为d),如果调节该配置项的目的是为了开启优化开关(即性能期望标签的含义是开启优化开关),则该配置项的性能期望标签为label1;如果调节该配置项的目的是为了提升性能牺牲可靠性等非功能需求,则该配置项的性能期望标签为label2;如果调节该配置项的目是为了分配更多计算机资源,则该配置项的性能期望标签为label3;如果调节该配置项的目的是为了开启软件额外功能,则该配置项的性能期望标签为label4;如果调节该配置项与软件性能无关,则该配置项的性能期望标签为label5;最终得到训练集,记为其中,n1+n2+n3+n4+n5=n;n1、n2、n3、n4、n5分别为性能期望标签为label1,label2,label3,label4,label5的配置项文档描述的个数。是训练集中性能期望标签为labell的第il个配置项。的文档描述,由单词组成。其中,1≤l≤5,1≤il≤nl。令中的单词总数为记为(单词1,单词2,…,单词…,单词)。

2.3配置项期望预测模块预处理训练集;

2.3.1初始化变量l=1;

2.3.2初始化变量ol=1;

2.3.3对进行预处理,方法是:

2.3.3.1令变量

2.3.3.2将单词转化为其中为单词的词性标签(如名词(noun),动词(verb)等),为计算机领域同义词(如memory、cpu的ds均为resource);

2.3.3.3若转2.3.3.2;若则得到预处理后的为如下形式:简记为转2.3.4;

2.3.4判断il是否等于nl,若是,转2.3.5,否则令il=il+1,转2.3.3;

2.3.5判断l是否等于5,若是,转2.4,否则令l=l+1,转2.3.2;

2.4配置项期望预测模块挖掘频繁子序列。使用jianpei等人在icde2001发表的文献“prefixspan:miningsequentialpatternsefficientlybyprefix-projectedpatterngrowth(prefixspan:通过前缀投影模式有效地挖掘序列模式)”的prefixspan算法分别对集合进行频繁子序列挖掘,得到5个频繁子序列集合:其中q1,q2,…,ql,…,q5为正整数,表示当l=1,2,…,5时,prefixspan算法从集合挖掘出的频繁子序列的个数;1≤q≤ql;

2.5对p1,p2,…,p5中的所有频繁子序列计算置信度(confidence),方法是:

2.5.1初始化变量l=1;

2.5.2初始化变量q=1;

2.5.3计算频繁子序列p(l,q)的置信度confidence(l,q):

中的匹配次数之和)。其中,若p(l,q)是的一个子序列,则判定p(l,q)与一次匹配。

2.5.4判断q是否等于ql,若是,转2.5.5;若否,令q=q+1,转2.5.3;

2.5.5判断l是否等于5,若是,表示得到了p1,p2,…,p5中的所有频繁子序列的置信度,转2.6;若否,令l=l+1,转2.5.2。

2.6根据p1,p2,…,p5中的频繁子序列的置信度confidence,对p1,p2,…,p5中的频繁子序列进行筛选。方法为:

2.6.1初始化变量l=1;

2.6.2初始化变量q=1;

2.6.3若其中5为期望标签种类数,则将plq放入集合pl'中;

2.6.4判断q是否等于ql,若是,转2.6.5;若否,令q=q+1,转2.6.3;

2.6.5判断l是否等于5,若是,表示得到了筛选后的频繁子序列集合p1',p2',p3',p4',p5',转2.7;若否,令l=l+1,转2.6.2。

2.7采用p1',p2',p3',p4',p5'对配置项期望预测模块进行训练,方法是:

2.7.1初始化:从p1',p2',p3',p4',p5'中分别随机选出(选出后放回)100个频繁子序列,构成随机选出频繁子序列集合p1”,p2”,p3”,p4”,p5”。p1”,p2”,p3”,p4”,p5”中共包含500个频繁子序列,即:

{p(1,1),p(1,2),…,p(1,r),…,p(1,100)},…,{p(l,1),p(l,2),…,p(l,r),…,p(l,100)},…,

{p(5,1),p(5,2),…,p(5,r),…,p(5,100)},1≤r≤100;

2.7.2分别计算p1”,p2”,p3”,p4”,p5”在训练数据集上的准确率(precision)、召

回率(recall)、f-score(准确率和召回率的调和平均数):

2.7.3判断f-score最大值的估计累积分布函数值是否大于阈值δ,δ一般为99%-99.9%,若大于,转2.8;若小于等于阈值δ,转2.7.1;

2.8配置项期望预测模块选取f-score最大时对应的p1”,p2”,p3”,p4”,p5”构建加权投票分类器。方法为:将加权投票分类器的输入设定为任一待预测期望标签的已预处理的配置项描述《posx,dsx》(简记为x),输出为5个期望标签的得票,x的性能期望标签为得票最高的期望标签。其中,类别l的得票为频繁子序列的置信度之和,1≤rx≤100,且为x的子序列。分类器输出得票五元组,记为

其中,的含义为:“在pl”中,满足“为x的子序列”的的置信度之和(其中l=1,2,…,5)”。若votes(x)中有元素不为0,则找到votes(x)中最大值所对应的元素,该元素对应的序号l即为x的性能期望标签对应的序号,为labell,转第三步;若votes(x)=[0,0,0,0,0],则x的性能期望标签为空,转第三步;例如,若votes(x)=[1.1,1.4,5.3,0,2.0],则x的性能期望标签为label3,若votes(x)=[0,0,0,0,0],则该配置项x的性能期望标签为空;

第三步,利用训练后的配置项期望预测模块为待检测软件生成性能期望标签集合l,将l发送给测试样例生成模块和性能缺陷检测模块,方法是:

训练后的配置项期望预测模块从待检测软件的配置项用户手册读取配置项描述,的加权投票分类器对所有待测配置项c={c1,c2,…,cz,…,cn'},其中,1≤z≤n′(令n′为配置项用户手册中配置项的个数)的性能期望进行预测,得到性能期望标签集合l=[lab1,lab2,…,labz,…,labn′],其中labz∈{label1,label2,label3,label4,label5,null(空)};将l发送给测试样例生成模块和性能缺陷检测模块。

第四步,测试样例生成模块为待检测软件生成测试样例集合t,并将t发送给性能缺陷检测模块,方法是:

4.1测试样例生成模块使用tianyinxu等人在sosp2013发表的文章“donotblameusersformisconfigurations(不要责备用户的配置错误)”的spex算法,对c中的软件配置项的语法类型和取值范围进行提取。spex最终提取出的语法类型分为四类:数值类型(int)、布尔类型(bool)、枚举类型(enum)、字符串类型(string);

4.2测试样例生成模块为配置项集合c={c1,c2,…,cz,…,cn'}生成待测值集合v,v={v1,v2,…,vz,…,vn'},其中为配置项cz的一个取值,kz为测试样例生成模块为cz生成的值的个数。方法为:

4.2.1初始化变量z=1;

4.2.2若cz对应的期望标签为空,则令转4.2.7;

4.2.3若cz为布尔类型(bool),则令vz={0,1},转4.2.7;

4.2.4若cz为枚举类型(enum),则令其中为spex算法提取到的cz的全部可能取值,转4.2.7;

4.2.5若cz为字符串类型(string),则令(根据何浩辰在esec/fse2019发表的“tuningbackfired?not(always)yourfault:understandinganddetectingconfiguration-relatedperformancebugs(配置调节适得其反?不总是你的错!理解并检测配置相关的性能缺陷)”的结论,极少数字符串类型的配置项会导致性能缺陷),转4.2.7;

4.2.6若cz为数值类型(int),则对cz的值进行抽样,方法为:记spex算法提取到的cz的最小取值和最大取值记为min、max,令vz={min,10·min,102·min,max,10-1·max,10-2·max},转4.2.7;

4.2.7若z=n′,转4.3;否则,令z=z+1,转4.2.2;

4.3对v1,v2,…,vz,…,vn'取笛卡尔积,得到笛卡尔积vcartesian=v1×v2×…×vn';

4.4软件的性能测试集一般以性能测试工具的形式提供。因此测试样例生成模块基于性能测试工具(如sysbench、apache-benchmark)生成测试命令。方法为:采用经典的pair-wise方法(pair-wisetestingisacombinatorialmethodofsoftwaretestingthat,foreachpairofinputparameterstoasystem,testsallpossiblediscretecombinationsofthoseparameters.“pair-wise方法是一种软件测试领域的组合方法,该方法针对系统的每对输入参数,测试这些参数的所有可能的离散组合”--《pragmaticsoftwaretesting:becominganeffectiveandefficienttestprofessional》“实用软件测试:成为一个高效的测试专业”)对性能测试工具的参数进行抽样,然后将参数(如并发度、负载类型、数据表大小、数据表数量、读操作比例、写操作比例)输入性能测试工具,输出测试命令,得到测试命令集合b={b1,b2,b3,…,by,…,by},1≤y≤y,y为b中测试命令的个数;

4.5测试样例生成模块生成测试样例集合t,t=b×vcartesian={t1,t2,t3,…,ta,…,tw},1≤a≤w,ta为一个二元组,(其中,的含义是:cz的取值为),w为t中测试样例的个数,为c1的第u(1≤u≤k1)个可能取值,为cz的第h(1≤h≤kz)个可能取值,为c8′(1≤j≤k8′)的第j个可能取值,k1、kz、k8′分别为spex算法提取到的配置项c1、cz、c8′的可能取值的个数,且k1、kz、kn′均为正整数;将测试样例集合t发送给性能缺陷检测模块;

第五步:性能缺陷检测模块根据t和l检测待测软件可执行文件的性能缺陷:

5.1性能缺陷检测模块执行t中的测试样例,得到测试样例的性能值,方法是:

5.1.1初始化变量a=1;

5.1.2为防止因测试环境不稳定导致的性能波动,性能缺陷检测模块重复执行每个测试样例a次,a为正整数,a优选为10;因此,令变量repeat=1(变量repeat记录当前重复执行的次数);

5.1.3性能缺陷检测模块将测试样例ta输入待检测软件,运行待检测软件,记录第repeat次输入ta运行得到的性能值设定检测性能值的默认性能指标为软件数据吞吐量;

5.1.4判定repeat是否等于a,若是,则得到一组关于测试样例ta的性能指标,记为:转4.1.5;否则令repeat=repeat+1,转4.1.3;

5.1.5判定a是否等于w,若是,记输出为out={[t1,r1],…,[ta,ra],…,[tw,rw]}(其中,二元组[ta,ra]的第一个元素为测试样例,第二个元素为执行该测试样例a次得到的性能值集合),转5.2;否则令a=a+1,转5.1.2;

5.2性能缺陷检测模块将out依据测试样例进行分组,方法是:

5.2.1初始化变量a=1;

5.2.2判断若[ta,ra]已被分组,则令a=a+1,转5.2.2;否则转5.2.3;

5.2.3将[ta,ra]按ta中的配置项取值和测试命令进行分组,即[ta,ra]与{[t1,r1],…,[ta,ra],…,[tw,rw]}中,若ta和ta'同时满足以下3个条件,则将[ta,ra],[ta’,ra’]组成一组:

条件1,ta和ta'仅有某一个配置项cz(其中,1≤z≤n′)的取值不同;

条件2,测试命令均为

条件3,[ta,ra],[ta’,ra’]未被分组;

令与[ta,ra]满足以上条件的共有numa个,即分为一组,记为group(z,y),group(z,y)={[ta,ra],[ta‘,ra‘],[ta’‘,ra“],…,[ta*,ra*]}(其中,1≤a',a”,…,a*≤w,numa为正整数,numa的大小与cz的类型有关:若cz为布尔类型,则numa=2;若为枚举类型,则numa=kz;若为数值类型,则numa=6;若为字符串类型,则numa=1)。例如:ta为并且ta’为时,将[ta,ra],[ta’,ra’]组成一组;

5.2.4若a=w,表示分组完成,得到分组后的测试结果集合g={group(1,1),group(1,2),…,group(1,y),…,group(z,y)…,group(n',y)},转5.3;否则令a=a+1,转5.2.2;

5.3性能缺陷检测模块根据配置项集合c的性能期望标签l以及分组后的测试结果集合g,使用假设检验(假设检验(hypothesistesting),又称统计假设检验,是用来判断样本与样本、样本与总体的差异是由抽样误差引起还是本质差别造成的统计推断方法。假设检验参数β为小于1的正实数.优选β=0.05)的方法判别待检测软件是否存在缺陷。假设检验原理为:若任意一配置项cz的期望标签为label1、label2或label3,调节cz的性能预期为性能提升,若实际测试结果为性能下降,则软件存在性能缺陷;若cz的期望标签为label4,调节cz的性能预期为性能合理下降,若实际测试结果为性能大幅下降,则软件存在性能缺陷;若cz的期望标签为label5,调节cz的性能预期为性能不变,若实际测试结果为性能下降,则软件存在性能缺陷。方法为:遍历r中每一个分组,使用假设检验的方法判别待检测软件是否存在缺陷:

5.3.1初始化变量z=1;

5.3.2初始化变量y=1;

5.3.3若labz=label1,(其中,labz为cz的期望标签)设定待验假设h0:ra≤ra'(其中,cz在ta中的值为0,cz在ta'中的值为1)。转5.3.8;

5.3.4若labz=label2,设定待验假设h0:ra≤ra'(其中,cz在ta中的值大于cz在ta'中的值)。转5.3.8;

5.3.5若labz=label3,设定待验假设h0:ra≤ra'(其中,cz在ta中的值小于cz在ta'中的值)。转5.3.8;

5.3.6若labz=label4,设定待验假设h0:5·ra≤ra'(其中,cz在ta中的值为1,cz在ta'中的值为0)。转5.3.8;

5.3.7若labz=label5,设定待验假设h0:ra≠ra'。转5.3.8;

5.3.8当假设检验结果表明h0被拒绝时(即使用假设检验方法计算得到的被拒绝概率≥1-β),表明软件存在一个与配置项cz有关的性能缺陷,且触发该缺陷的测试命令为

5.3.9若y=y,则转5.3.10;否则令y=y+1,转5.3.3;

5.3.10若z=n′,结束检测;否则令z=z+1,转5.3.2。

与现有技术相比,采用本发明能达到以下有益效果:

1、采用本发明能有效检测出软件性能缺陷。采用本发明在12款大型开源软件mysql、mariadb、apache-httpd、apache-tomcat、apache-derby、h2、postgresql、gcc、clang、mongodb、rocksdb、squid中的61个历史性能缺陷中,基于52个配置项的预期,运行了23418个测试样例,耗费178个小时,成功检测出54个性能缺陷,仅产生7个假阳性(误报)。而已有工作(adriannistor等人在icse2013发表的“toddler:detectingperformanceproblemsviasimilarmemory-accesspatterns”通过相似的内存读写模式检测性能缺陷)仅能检测出6个。

2、采用本发明能为软件社区检测出11个新的性能缺陷,防止了潜在的因软件性能问题可能导致的经济、用户损失。缺陷id为:clang-43576,clang-43084,clang-44359,clang-44518,gcc-93521,gcc-93037,gcc91895,gcc91852,gcc-91817,gcc-91875,gcc-93535。

3、本发明第二步给出了一个详尽的配置项性能期望分类并给出了自动预测配置项性能期望的方法,并给出了包含大量配置项及其期望的数据集;本发明基于配置项的预期,可有效判别无缺陷软件和有缺陷软件的性能差异,具有良好的应用前景。

附图说明

图1是本发明的总体流程图;

图2是本发明第一步构建的性能期望检测系统逻辑结构图;

图3是本发明第二步使用的配置项性能期望表。

具体实施方式

下面结合附图对本发明进行说明。

如图1所示,本发明包括以下步骤:

第一步,构建性能缺陷检测系统,性能缺陷检测系统如图2所示,由配置项期望预测模块、测试样例生成模块、性能缺陷检测模块构成。

配置项期望预测模块是一个加权投票分类器,与测试样例生成模块、性能缺陷检测模块相连,从待检测软件的配置项用户手册读取配置项的描述、取值范围,对待预测配置项的性能期望进行预测,得到配置项的性能期望标签,将配置项的性能期望标签发送给测试样例生成模块和性能缺陷检测模块。

测试样例生成模块与配置项期望预测模块、性能缺陷检测模块相连,从配置项期望预测模块接收配置项的性能期望标签,从待检测软件的测试集读取测试命令,根据配置项的性能期望标签和待检测软件测试集生成测试样例集合t。

性能缺陷检测模块与配置项期望预测模块、测试样例生成模块相连,从测试样例生成模块接收测试样例集合t,从配置项期望预测模块接收配置项的性能期望标签,执行测试样例集合t中测试样例并检测配置项的性能期望标签所对应的期望性能和实际性能是否相符,若不相符则输出待检测软件的性能缺陷。

第二步:训练性能缺陷检测系统的配置项期望预测模块。读入人工标注期望的配置项和配置项的官方文档描述,训练配置项期望预测模块。

2.1构建训练集,方法是:从mysql、mariadb、apache-httpd、apache-tomcat、apache-derby、h2、postgresql、gcc、clang、mongodb、rocksdb、squid共12款软件的1万多个配置项中随机选取n(其中,n≥500)个配置项。

2.2根据n个配置项的官方文档描述,对配置项人工标注其性能期望标签,方法如图3所示:根据配置项(记为c)的文档描述(记为d),如果调节该配置项的目的是为了开启优化开关,则该配置项的性能期望标签为label1;如果调节该配置项的目的是为了提升性能牺牲可靠性等非功能需求,则该配置项的性能期望标签为label2;如果调节该配置项的目是为了分配更多计算机资源,则该配置项的性能期望标签为label3;如果调节该配置项的目的是为了开启软件额外功能,则该配置项的性能期望标签为label4;如果调节该配置项与软件性能无关,则该配置项的性能期望标签为label5;最终得到训练集,记为其中,n1+n2+n3+n4+n5=n;n1、n2、n3、n4、n5分别为性能期望标签为label1,label2,label3,label4,label5的配置项文档描述的个数。是训练集中性能期望标签为labell的第il个配置项。的文档描述,由单词组成。其中,1≤l≤5,1≤il≤nl。令中的单词总数为记为(单词1,单词2,…,单词…,单词)。

2.3配置项期望预测模块预处理训练集;

2.3.1初始化变量l=1;

2.3.2初始化变量il=1;

2.3.3对进行预处理,方法是:

2.3.3.1令变量

2.3.3.2将单词转化为其中为单词的词性标签,为计算机领域同义词;

2.3.3.3若转2.3.3.2;若则得到预处理后的为如下形式:简记为转2.3.4;

2.3.4判断il是否等于nl,若是,转2.3.5,否则令il=il+1,转2.3.3;

2.3.5判断l是否等于5,若是,转2.4,否则令l=l+1,转2.3.2;

2.4配置项期望预测模块挖掘频繁子序列。使用的prefixspan算法分别对集合进行频繁子序列挖掘,得到5个频繁子序列集合:其中q1,q2,…,ql,…,q5为正整数,表示当l=1,2,…,5时,prefixspan算法从集合挖掘出的频繁子序列的个数;1≤q≤ql;

2.5对p1,p2,…,p5中的所有频繁子序列计算置信度(confidence),方法是:

2.5.1初始化变量l=1;

2.5.2初始化变量q=1;

2.5.3计算频繁子序列p(l,q)的置信度confidence(l,q):

中的匹配次数之和)。其中,若p(l,q)是的一个子序列,则判定p(l,q)与一次匹配。

2.5.4判断q是否等于ql,若是,转2.5.5;若否,令q=q+1,转2.5.3;

2.5.5判断l是否等于5,若是,表示得到了p1,p2,…,p5中的所有频繁子序列的置信度,转2.6;若否,令l=l+1,转2.5.2。

2.6根据p1,p2,…,p5中的频繁子序列的置信度confidence,对p1,p2,…,p5中的频繁子序列进行筛选。方法为:

2.6.1初始化变量l=1;

2.6.2初始化变量q=1;

2.6.3若其中5为期望标签种类数,则将plq放入集合pl'中;

2.6.4判断q是否等于ql,若是,转2.6.5;若否,令q=q+1,转2.6.3;

2.6.5判断l是否等于5,若是,表示得到了筛选后的频繁子序列集合p1',p2',p3',p4',p5',转2.7;若否,令l=l+1,转2.6.2。

2.7采用p1',p2',p3',p4',p5'对配置项期望预测模块进行训练,方法是:

2.7.1初始化:从p1',p2',p3',p4',p5'中分别随机选出(选出后放回)100个频繁子序列,构成随机选出频繁子序列集合p1”,p2”,p3”,p4”,p5”。p1”,p2”,p3”,p4”,p5”中共包含500个频繁子序列,即:{p(1,1),p(1,2),…,p(1,r),…,p(1,100)},…,{p(l,1),p(l,2),…,p(l,r),…,p(l,100)},…,

{p(5,1),p(5,2),…,p(5,r),…,p(5,100)},1≤r≤100;

2.7.2分别计算p1”,p2”,p3”,p4”,p5”在训练数据集上的准确率(precision)、召回率(recall)、f-score(准确率和召回率的调和平均数):

2.7.3判断f-score最大值的估计累积分布函数值是否大于阈值δ,δ一般为99%-99.9%,若大于,转2.8;若小于等于阈值δ,转2.7.1;

2.8配置项期望预测模块选取f-score最大时对应的p1”,p2”,p3”,p4”,p5”构建加权投票分类器。方法为:将加权投票分类器的输入设定为任一待预测期望标签的已预处理的配置项描述《posx,dsx》(简记为x),输出为5个期望标签的得票,x的性能期望标签为得票最高的期望标签。其中,类别l的得票为频繁子序列的置信度之和,1≤rx≤100,且为x的子序列。分类器输出得票五元组,记为votes(x)=

其中,为x的子序列的含义为:“在pl”中,满足“为x的子序列”的的置信度之和(其中l=1,2,…,5)”。若votes(x)中有元素不为0,则找到votes(x)中最大值所对应的元素,该元素对应的序号l即为x的性能期望标签对应的序号,为labell,转第三步;若votes(x)=[0,0,0,0,0],则x的性能期望标签为空,转第三步;例如,若votes(x)=[1.1,1.4,5.3,0,2.0],则x的性能期望标签为label3,若votes(x)=[0,0,0,0,0],则该配置项x的性能期望标签为空;

第三步,利用训练后的配置项期望预测模块为待检测软件生成性能期望标签集合l,将l发送给测试样例生成模块和性能缺陷检测模块,方法是:

训练后的配置项期望预测模块从待检测软件的配置项用户手册读取配置项描述,的加权投票分类器对所有待测配置项c={c1,c2,…,cz,…,cn'},其中,1≤z≤n′(令n′为配置项用户手册中配置项的个数)的性能期望进行预测,得到性能期望标签集合l=[lab1,lab2,…,labz,…,labn′],其中labz∈{label1,label2,label3,label4,label5,null(空)};将l发送给测试样例生成模块和性能缺陷检测模块。

第四步,测试样例生成模块为待检测软件生成测试样例集合t,并将t发送给性能缺陷检测模块,方法是:

4.1测试样例生成模块使用spex算法,对c中的软件配置项的语法类型和取值范围进行提取。spex最终提取出的语法类型分为四类:数值类型(int)、布尔类型(bool)、枚举类型(enum)、字符串类型(string);

4.2测试样例生成模块为配置项集合c={c1,c2,…,cz,…,cn'}生成待测值集合v,v={v1,v2,…,vz,…,vn'},其中为配置项cz的一个取值,kz为测试样例生成模块为cz生成的值的个数。方法为:

4.2.1初始化变量z=1;

4.2.2若cz对应的期望标签为空,则令转4.2.7;

4.2.3若cz为布尔类型(bool),则令vz={0,1},转4.2.7;

4.2.4若cz为枚举类型(enum),则令其中为spex算法提取到的cz的全部可能取值,转4.2.7;

4.2.5若cz为字符串类型(string),则令转4.2.7;

4.2.6若cz为数值类型(int),则对cz的值进行抽样,方法为:记spex算法提取到的cz的最小取值和最大取值记为min、max,令vz={min,10·min,102·min,max,10-1·max,10-2·max},转4.2.7;

4.2.7若z=n′,转4.3;否则,令z=z+1,转4.2.2;

4.3对v1,v2,…,vz,…,vn'取笛卡尔积,得到笛卡尔积vcartesian=v1×v2×…×vn';

4.4软件的性能测试集一般以性能测试工具的形式提供。因此测试样例生成模块基于性能测试工具(如sysbench、apache-benchmark)生成测试命令。方法为:采用经典的pair-wise方法对性能测试工具的参数进行抽样,然后将参数(如并发度、负载类型、数据表大小、数据表数量、读操作比例、写操作比例)输入性能测试工具,输出测试命令,得到测试命令集合b={b1,b2,b3,…,by,…,by},1≤y≤y,y为b中测试命令的个数;

4.5测试样例生成模块生成测试样例集合t,t=b×vcartesian={t1,t2,t3,…,ta,…,tw},1≤a≤w,ta为一个二元组,(其中,的含义是:cz的取值为),w为t中测试样例的个数,为c1的第u(1≤u≤k1)个可能取值,为cz的第h(1≤h≤kz)个可能取值,为cn′(1≤j≤kn′)的第j个可能取值,k1、kz、kn′分别为spex算法提取到的配置项c1、cz、cn′的可能取值的个数,且均为正整数;将测试样例集合t发送给性能缺陷检测模块;

第五步:性能缺陷检测模块根据t和l检测待测软件可执行文件的性能缺陷:

5.1性能缺陷检测模块执行t中的测试样例,得到测试样例的性能值,方法是:

5.1.1初始化变量a=1;

5.1.2为防止因测试环境不稳定导致的性能波动,性能缺陷检测模块重复执行每个测试样例a次,a为正整数,a优选为10;因此,令变量repeat=1;

5.1.3性能缺陷检测模块将测试样例ta输入待检测软件,运行待检测软件,记录第repeat次输入ta运行得到的性能值设定检测性能值的默认性能指标为软件数据吞吐量;

5.1.4判定repeat是否等于a,若是,则得到一组关于测试样例ta的性能指标,记为:转4.1.5;否则令repeat=repeat+1,转4.1.3;

5.1.5判定a是否等于w,若是,记输出为out={[t1,r1],…,[ta,ra],…,[tw,rw]}(其中,二元组[ta,ra]的第一个元素为测试样例,第二个元素为执行该测试样例a次得到的性能值集合),转5.2;否则令a=a+1,转5.1.2;

5.2性能缺陷检测模块将out依据测试样例进行分组,方法是:

5.2.1初始化变量a=1;

5.2.2判断若[ta,ra]已被分组,则令a=a+1,转5.2.2;否则转5.2.3;

5.2.3将[ta,ra]按ta中的配置项取值和测试命令进行分组,即[ta,ra]与{[t1,r1],…,[ta,ra],…,[tw,rw]}中,若ta和ta'同时满足以下3个条件,则将[ta,ra],[ta’,ra’]组成一组:

条件1,ta和ta'仅有某一个配置项cz(其中,1≤z≤n′)的取值不同;

条件2,测试命令均为

条件3,[ta,ra],[ta’,ra’]未被分组;

令与[ta,ra]满足以上条件的共有numa个,即分为一组,记为group(z,y),group(z,y)={[ta,ra],[ta‘,ra‘],[ta’‘,ra“],…,[ta*,ra*]}(其中,1≤a',a”,…,a*≤w,numa为正整数,numa的大小与cz的类型有关:若cz为布尔类型,则numa=2;若为枚举类型,则numa=kz;若为数值类型,则numa=6;若为字符串类型,则numa=1)。例如:ta为并且ta'为时,将[ta,ra],[ta’,ra’]组成一组;

5.2.4若a=w,表示分组完成,得到分组后的测试结果集合g={group(1,1),group(1,2),…,group(1,y),…,group(z,y)…,group(n',y)},转5.3;否则令a=a+1,转5.2.2;

5.3性能缺陷检测模块根据配置项集合c的性能期望标签l以及分组后的测试结果集合g,使用假设检验(假设检验参数β为小于1的正实数.优选β=0.05)的方法判别待检测软件是否存在缺陷。假设检验原理为:若任意一配置项cz的期望标签为label1、label2或label3,调节cz的性能预期为性能提升,若实际测试结果为性能下降,则软件存在性能缺陷;若cz的期望标签为label4,调节cz的性能预期为性能合理下降,若实际测试结果为性能大幅下降,则软件存在性能缺陷;若cz的期望标签为label5,调节cz的性能预期为性能不变,若实际测试结果为性能下降,则软件存在性能缺陷。方法为:遍历r中每一个分组,使用假设检验的方法判别待检测软件是否存在缺陷:

5.3.1初始化变量z=1;

5.3.2初始化变量y=1;

5.3.3若labz=label1,(其中,labz为cz的期望标签)设定待验假设h0:ra≤ra'(其中,cz在ta中的值为0,cz在ta'中的值为1)。转5.3.8;

5.3.4若labz=label2,设定待验假设h0:ra≤ra'(其中,cz在ta中的值大于cz在ta'中的值)。转5.3.8;

5.3.5若labz=label3,设定待验假设h0:ra≤ra'(其中,cz在ta中的值小于cz在ta'中的值)。转5.3.8;

5.3.6若labz=label4,设定待验假设h0:5·ra≤ra'(其中,cz在ta中的值为1,cz在ta'中的值为0)。转5.3.8;

5.3.7若labz=label5,设定待验假设h0:ra≠ra'。转5.3.8;

5.3.8当假设检验结果表明h0被拒绝时(即使用假设检验方法计算得到的被拒绝概率≥1-β),表明软件存在一个与配置项cz有关的性能缺陷,且触发该缺陷的测试命令为

5.3.9若y=y,则转5.3.10;否则令y=y+1,转5.3.3;

5.3.10若z=n′,结束检测;否则令z=z+1,转5.3.2。

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