基于反馈的SMT求解器性能测试用例约简方法

文档序号:26587526发布日期:2021-09-10 19:48阅读:174来源:国知局
基于反馈的SMT求解器性能测试用例约简方法
基于反馈的smt求解器性能测试用例约简方法
技术领域
1.本发明属于软件测试领域,涉及一种用于约简触发smt求解器性能故障的测试用例的技术,具体为一种基于反馈的smt求解器性能测试用例约简方法。


背景技术:

2.smt(the satisfiability modulo theories)求解器是一个验证一阶逻辑公式是否可以被满足的工具,它在形式化方法、程序语言、软件工程以及计算机安全等领域得到了广泛应用。然而,smt求解器作为一种软件,不可避免地会存在性能故障,如求解超时,这使得其他依赖smt求解器的工具难以输出可靠的结果。因此,对于触发smt求解器性能故障的测试用例,必须开发有效的约简方法,以帮助开发者更好地分析并定位smt求解器相关的性能故障,提高smt求解器的性能。
3.虽然现有的一些论文和发明专利可被用于测试用例的约简,但在约简smt求解器性能测试用例方面仍存在很多不足。例如,一种基于错误检测能力的测试用例集约简方法(专利申请号:cn202010146247.x),此专利首先构建原始用例集与对应的测试需求集的关系矩阵;然后根据每个测试用例子集元素的错误检测能力构建矩阵并计算测试用例子集的错误检测能力;最后使用必不可少策略和错误检测能力的贪心策略对测试用例进行约简。但是此方法并未针对smt测试用例。2020mansur等人提出了storm工具,该工具通过拆解、组合的方法生成smt求解器测试用例并对触发bug的测试用例进行了约简,但storm并不能很好地约简性能故障测试用例。
4.由于触发smt超时问题可能需要很长时间,使用现有的方法对触发性能故障的测试用例进行约简耗费时间很长。因此,提出在短时间内对触发smt求解器性能故障的测试用例进行约简的方法是十分必要的。


技术实现要素:

5.为解决上述问题,本发明提供了一种基于反馈的smt求解器性能测试用例约简方法,可以在较短时间内对触发smt求解器性能故障的测试用例进行约简,帮助开发者更快地找到smt求解器的性能故障,提高smt求解器的质量。本发明方法首先验证输入的测试用例是否可以触发smt求解器性能故障,然后使用二分搜索法通过比较代码覆盖率相似度对触发smt求解器性能缺陷的测试用例断言数目进行约简,最后通过顺序替换断言中节点的方法简化测试用例中每一个断言的公式嵌套深度,从而生成最小化的测试用例。代码覆盖是软件测试中的一种度量,描述程序中源代码被测试的比例和程度,所得比例称为代码覆盖率。
6.本发明可用于smt求解器,如z3,cvc4等;亦可根据特定求解器的特性,对本发明的相关步骤进行适配,从而约简该求解器的测试用例。
7.本发明的技术方案:
8.一种基于反馈的smt求解器性能测试用例约简方法,具体步骤如下:
9.步骤1:验证输入的测试用例是否可以触发性能故障。
10.对于待约简的测试用例,首先对测试用例进行手动验证;将测试用例输入到smt求解器,检测其是否可以触发性能故障;如果该测试用例可以触发性能缺陷,对该测试用例进行约简;否则输出该测试用例不符合约简条件的信息。
11.步骤2:将测试用例解析为instance类实例。
12.将触发性能缺陷的测试用例解析为可操作的instance类实例。instance类包括四个部分:set logic,declare,assert和check sat。set logic部分指定了测试用例使用的语法为字符串理论;declare部分声明了可能使用到的变量及其类型;assert部分使用一个列表存储抽象语法树,每一个语法树都是一条断言语句。check sat部分是测试用例的固定语法,让求解器检查测试用例的满足性。
13.抽象语法树(abstract syntax tree,ast)是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
14.步骤3:设置代码覆盖率相似度阈值,设置测试用例在smt求解器中的执行时间。测试时间限制可由测试人员根据需求进行设置。
15.步骤4:使用二分搜索法约简测试用例断言数目,具体步骤如下:
16.步骤4.1:首先存储测试用例副本,将dmin设置为0,dmax设置为需要约简的测试用例断言总数。
17.步骤4.2:比较dmax和dmin,如果dmax小于或等于dmin的值,则此时测试用例断言数目达到了最小,结束循环并保存该测试用例;否则转到步骤4.3。
18.步骤4.3:从测试用例中随机取出新测试用例的断言数d=1/2(dmax+dmin);将新的测试用例输入求解器运行并获取代码覆盖率信息,比较新测试用例与原测试用例的覆盖率相似度,如果覆盖率相似度能达到相似度阈值,转到步骤4.4;如果覆盖率相似度小于相似度阈值,转到步骤4.5。
19.步骤4.4:将dmax设置为d的值,转到步骤4.2。
20.步骤4.5:将dmin值设置为d的值,转到步骤4.2。
21.步骤5:使用替换节点的方法约简断言数目最小化的测试用例公式嵌套深度;一个测试用例中具有多个断言,每个断言被编码为抽象语法树ast;对每个断言编码成的ast进行顺序遍历并进行节点的替换;具体步骤如下:
22.步骤5.1:顺序遍历测试用例中的断言,判断该断言是否为测试用例中最后一个断言;若该断言是测试用例中最后一个断言,转入步骤5.2;否则转到步骤5.3。
23.步骤5.2:该测试用例的公式嵌套深度达到了最小,即此时该测试用例拥有最少断言数和最小嵌套深度的断言,为最简测试用例;保存该最简测试用例并结束循环。
24.步骤5.3:顺序替换断言中的节点:使用节点的同类型常量替换该节点生成新的测试用例,并将该测试用例在smt求解器中运行,收集覆盖信息。
25.步骤5.4:比较新测试用例覆盖率与原测试用例覆盖率相似度,若相似度达到阈值,或者该节点是ast的最后一个节点,转到步骤5.1;若没有达到相似度阈值,将该节点替换回原来的节点,并继续替换ast中的下一个节点,转到步骤5.3。
26.本发明的有益效果:本发明能够对触发smt求解器性能故障的测试用例进行有效约简,使用尽可能简单的测试用例充分满足给定的测试目标,从而提高测试效率、降低测试
成本,可以帮助开发者更好地找到smt求解器相关的性能故障,提高求解器的质量。
附图说明
27.图1是本发明的一种基于反馈的smt求解器性能测试用例约简方法的工作流程示意图。
具体实施方式
28.以下结合附图和技术方案,进一步说明本发明的具体实施方式。
29.本发明的工作流程如图1所示,本发明方法部署在一台linux服务器上,服务器具体配置如表1所示。根据实验需求选择使用z3str3求解器,根据测试步骤安装对应的软件。
30.表1linux服务器配置信息表
31.处理器型号内存操作系统intelcorei9

1090032gbubuntu20.04.2lts
32.步骤1:验证输入的测试用例是否可以触发性能故障。
33.具体为:对于待约简的测试用例,首先在z3str3求解器中运行该测试用例,检测其是否可以触发性能故障。如果该测试用例可以触发性能故障,对该测试用例进行约简;否则输出该测试用例不符合约简条件的信息。
34.步骤2:将测试用例解析为instance类实例。
35.z3str3求解器将触发性能缺陷的测试用例解析为可操作的instance类实例。
36.步骤3:设置代码覆盖率相似度阈值sim为0.9,设置测试用例在z3str3求解器运行时间为5s。
37.步骤4:使用二分搜索法约简测试用例断言数目,具体方法步骤如下:
38.a:使用z3str3求解器,首先将测试用例存储在求解器缓存中,然后使用二分搜索法约简断言数目。设置dmin为0,dmax为每个测试用例的断言总数。
39.b:比较dmax和dmin,如果dmax小于或等于dmin的值,则此时该测试用例断言数目达到了最小,结束循环,保存该测试用例;否则转到步骤c。
40.c:从测试用例中随机取出新的测试用例断言数量为d=1/2(dmax+dmin),然后将新测试用例放入z3str3运行5s并得到代码覆盖率信息,比较新测试用例与原测试用例的覆盖率相似度s1。如果s1≥sim1,转到步骤d,否则转到步骤e。
41.d:将dmax设置为d,转到步骤b;
42.e:将dmin设置为d,转到步骤b。
43.步骤5:使用替换节点的方法约简断言数目最小化的测试用例公式嵌套深度。一个测试用例中具有多个断言,每个断言被编码为ast。对每个断言编码成的ast进行顺序遍历并进行节点的替换。具体步骤如下:
44.步骤a:顺序遍历测试用例中的断言。判断该断言是否为测试用例中最后一个断言。若该断言是测试用例中最后一个断言,转到步骤b;否则转到步骤c。
45.步骤b:该测试用例的公式嵌套深度达到了最小,即此时该测试用例拥有最少断言数和最小嵌套深度,为最简测试用例。保存该最简测试用例并结束循环。
46.步骤c:顺序遍历断言中被编码成的ast中的节点。使用节点的同类型常量替换该
节点生成新的测试用例,并将该测试用例z3str3求解器中运行5s,收集覆盖信息。
47.步骤d:比较新测试用例覆盖率与原测试用例覆盖率相似度,若相似度s1≥sim1,或者该节点是ast的最后一个节点,转到步骤a;若s1<sim1,则回溯到该节点并将该节点替换回原来的节点,并继续替换ast中的下一个节点,转到步骤c。
48.步骤6:经过步骤4和5的约简,可以得到较简单的测试用例,能更有效地帮助开发者定位smt求解器性能出现故障的原因,从而快速修复故障。
49.步骤7:将约简后的测试用例写入测试报告,并提交给开发者。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1