CN102736973A - 不变量指导的随机测试用例自动化生成方法 - Google Patents
不变量指导的随机测试用例自动化生成方法 Download PDFInfo
- Publication number
- CN102736973A CN102736973A CN201110085863XA CN201110085863A CN102736973A CN 102736973 A CN102736973 A CN 102736973A CN 201110085863X A CN201110085863X A CN 201110085863XA CN 201110085863 A CN201110085863 A CN 201110085863A CN 102736973 A CN102736973 A CN 102736973A
- Authority
- CN
- China
- Prior art keywords
- invariant
- case
- program
- test
- random
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请书中就软件测试的核心问题——测试用例自动化生成,针对目前一种广泛应用的自动化技术——随机测试方法的缺点,提出了一种结合不变量技术的随机测试改进方法——不变量指导下的随机用例生成方法。主要提出两个新方法——利用提取到的程序不变量过滤无效测试用例,保留有效用例;利用提取到的程序不变量约简无效用例空间,提高选中有效用例的概率。通过这些方法,降低冗余率,满足覆盖率要求,极大地改进了传统随机方法的缺点。且整个用例生成过程完全自动化,除了必需的被测程序外,不需要其它任何的输入和人工干预。
Description
1.所属技术领域
本专利发明属于软件测试领域,它是该领域的核心课题——测试用例自动化生成的研究。
2.背景技术
3.1随机测试技术
随机测试是通过在程序输入域上随机选择输入数据来测试程序。它是一种应用广泛且极具潜力的软件自动化测试技术。在第29届软件工程国际会议上,随机测试被认为是测试用例生成领域最具潜力的三大技术之一。在软件工程方面,随机测试已被广泛应用到各领域,如Unix工具集、Windows GUI应用软件、Java程序等等。但是在随机测试的实际应用中,存在覆盖率低,冗余测试用例重复生成等等各种缺点,严重限制了随机测试方法优点的体现。
3.2不变量技术
程序不变量是指在程序的某个特定的点或某些特定的点上保持为真的属性,是描述在程序运行时保持不变的性质的逻辑断言;它经常出现在断言声明(assert statement)、形式化描述(formal specifications)、说明文档(documentation)中。程序不变量有助于软件开发人员理解程序中的数据结构、算法及各种操作,对软件的设计、编码、验证、测试、优化和维护等各阶段都有着积极的作用(Ernst,2000)。近年来程序不变量的自动提取技术成为研究热点之一。
3.发明内容
本申请书中就软件测试的核心问题——测试用例自动化生成,针对目前一种广泛应用的自动化技术——随机测试方法的缺点,提出了一种结合不变量技术的随机测试改进方法——不变量指导下的随机用例生成方法。通过不变量的提取,了解程序属性,提高随机方法选取有效用例的概率,降低冗余率,满足覆盖率要求,极大地改进了传统随机方法的缺点。且整个用例生成过程完全自动化,除了必需的被测程序外,不需要其它任何的输入和人工干预。
4.具体实施方式
4.1不变量指导的测试用例生成方法的理论介绍
附图1是不变量指导测试用例生成方法的总体流程图,通过附图1中5个步骤地反复进行(见附图1说明),可以完成测试用例集合自动化的生成。下面就该流程图中的几个重要理论基础分别进行说明:
4.1.1新用例的生成过程
我们将完成新用例生成的功能模块称为测试用例构造器,由三个相对独立的部分组成——源码信息抽取、可选用例空间和测试用例构造。本工具以被测函数为单位,依次对被测函数中每个参数独立生成,进而构造出一个测试用例。具体的构造流程如附图2所示。
源码信息抽取模块,主要分析被测程序源码,根据源码信息,构造出被测函数信息表和复杂类型成员信息表。
可选用例空间主要由参数区间信息表构成,该表从被测函数信息表,以及复杂类型成员信息表中提取信息进行构造。该表中保存了被测函数每一个参数的取值区间,随机数的挑选被限制在这些取值区间之中,通过这种做法,限制了各个参数的取值范围,缩小用例的可选空间大小,进而提高选中有效用例的概率。
测试用例构造模块从被测函数信息表中依次选取参数进行构造,若为简单类型,则从可选用例空间中直接随机挑选随机数即可生成;若为复杂类型,则读取该类型成员表信息,对该类的各个成员依次进行构造,构造过程与参数构造过程类似,若在类成员的构造中遇到复杂类型,则往下递归,最终完成测试用例的构造。
4.1.2不变量判断测试用例有效性
如前背景技术中所述,不变量对于软件开发维护的各个阶段有着极其重要的意义,本工具CRT也利用了不变量来进行测试用例有效性的判别。
程序不变量是指在程序的某个特定的点或某些特定的点上保持为真的属性,是描述在程序运行时保持不变的性质的逻辑断言;它经常出现在断言声明(assert statement)、形式化描述(formal specifications)、说明文档(documentation)中(Ernst et al,2007),形如表1.1所示:
1 | .field>abs(y) |
2 | y=2*x+3 |
3 | array a is sorted |
4 | for all List objects lst,lst.next.prev=lst” |
5 | for all Treenode objects n,n.left.value<n.right.value” |
6 | p!=null=>p.content in myArray |
表1程序不变量示例
程序似然不变量集(Likely Program Invariant)指“可能的,不确定”的程序动态不变量集合,程序动态不变量提取工具的输出就是程序似然不变量集合,它依赖于程序输入(测试用例),它会在程序动态运行时随着输入的变化而改变。输入越完备,则动态提取的程序似然不变量集越逼近于在理论上的程序动态不变量集。
总的来说,程序运行时程序内部的某个保真的属性称为程序动态不变量,程序动态不变量的集合称为程序动态不变量集,程序动态不变量提取工具输出的是程序似然不变量集合。随着输入的不断增多,程序似然不变量集逐渐地向程序动态不变量集逼近。
举个例子说明上述情况,例1:
“return=one of{0,1}”是该程序的一个程序动态不变量,它和程序中其他的不变量(若存在)构成的集合是程序动态不变量集。程序动态不变量提取工具在程序输入大于0时会给出似然不变量”return==1”,当程序输入中出现小于等于0的值出现时,不变量提取工具剔除该似然不变量(该似然不变量非程序不变量),最终程序动态不变量提取工具输出似然不变量集“return=one of{0,1}”和其他似然不变量(若存在)。此时,从例1可以看出,该似然不变量集就是程序动态不变量集。
上述过程就是不变量指导测试用例生成的核心思想,比较添加新的测试用例前后的程序似然不变量集,判断是否有所改善,若有,则该新用例是有效的,添加到有效测试用例集中,若无,则认为该测试用例是冗余的,丢弃。算法表述见算法1。
算法1基本的程序动态不变量集指导测试用例生成算法.
RANDNEWCASE是随机测试数据生成方法。OPABSTR是程序似然不变量集,在本文中用DAIKON不变量提取工具获得。上述算法(算法1)起始于一个空的有效测试用例集合和一个空的程序动态不变量集,重复地添加测试用例,如果该测试用例改变了程序动态不变量集(如前所述,实际上是程序似然不变量集),则保留该测试用例。若连续N次,程序似然不变量集未发生改变,算法终止。N是一个权衡值,它是综合考量算法时间开销和所得测试例集质量的结果。
以一个简单的C程序绝对值函数abs(x)来说明算法1的工作流程,该函数的代码如例2。
例2:
算法1作用于例2的工作流程如表2所示:
表2.算法1生成测试用例的过程
表2中测试用例生成顺序是自上而下的。若某待选用例改变了程序似然不变量集,则被添加到最终测试例集中。终止条件N=3,表示算法在连续三个待选例都没有改变程序似然不变量集时终止。最终得到的测试例集为{5,1,-1,-6,0}。最终的程序似然不变量集合为:precondition:empty;postcondition:(x>=0)=>(x==return),(x<=0)=>(x==-return),return>=0。在当前的实验条件下,可以认为该似然不变量集就是程序动态不变量集。若N增大,程序似然不变量集合可能还会发生改变。也就是说,我们得到的最终程序似然不变量集只是逼近程序动态不变量集。理论上,在N充分大时,两者是相同的。
4.1.3不变量自动化提取工具Daikon
Daikon是MIT的PAG小组开发的开源工具,是当前现有的各种静态和动态不变量提取技术中,研究最成熟、应用最好的不变量提取工具。最早由Michael D.Ernst教授于2000年在其博士论文中进行详细描述,已有近十年的研究基础,并始终保持更新,最新版本为4.6.3,更新时间为2009年12月18(Daikon,2001)。它已经被许多学术研究小组或公司借鉴和引用,其输出的不变量被用来写成规格文档,作为断言插入到源代码中,或者用于其它工具的输入等等。本文也将使用Daikon来提取程序不变量。
不变量可以使用静态或动态方法提取。静态提取技术检查程序源代码,利用抽象解释和数据流分析技术,得到的不变量结果一般是较为准确的。但静态提取技术由于堆栈表示的难度较大,导致提取的结果往往太少,不能令人满意。Daikon作为一个程序不变量动态提取工具,其结果的完备性和稳定性上相对较差,但可以规避静态提取技术的缺点,提供更多更丰富的不变量输出。如图2.1所示,Daikon需要一个测试用例集作为输入,然后运行插装后的程序,监测运行时程序中各变量的取值,以事先定义的模板库为匹配标准,推断各数值间的关系和属性,即似然不变量。Daikon的默认输出格式是以函数为粒度,给出每个函数入口和出口处的不变量信息。
Daikon的广泛应用与它的优点是密不可分的。Daikon支持多种程序语言的不变量提取,如C,C++,Java,Perl等,且很容易扩展以支持其他语言;Daikon的输出内容非常丰富:支持70多种不变量,支持隐含不变量的推断,支持前置条件、后置条件和类不变量;Daikon可以应用于大规模软件的不变量提取;Daikon引入了过滤机制:删除置信度较低的不变量、冗余不变量(即由其它不变量暗含的不变量)、和无用不变量(比如时间与密度等无关概念间的不变量关系);Daikon共有8种输出格式,用户可以根据应用需求选择相应的输出格式;Daikon支持多种平台,包括Windows,Unix/Linux,Mac OS。
此外,Daikon自动化程度高,只要有可执行的测试用例,只需要几个命令就可以得到不变量。比如当前已有的测试文件为test.c,则要提取不变量仅需依次执行如下命令:
gcc-gdwarf-2 test.c-o test
kvasir-dtrace test
java daikon.Daikon daikon-output/test.dtrace
便可以将不变量输出到终端。而对Java语言的不变量提取则须依次执行如下命令:
javac-g Test.java
java daikon.Chicory--daikon Test
Daikon提取不变量是基于对程序运行时各相关数据的统计,其不变量结果在一定程度上依赖于输入数据。输入数据不可能遍历整个数据空间从而导致不变量结果不可能完备;而对输入数据的依赖性也导致不变量结果的不稳定。正是似然不变量的这种不稳定的特点真实的反映了程序本身在输入数据下的执行情况。在程序本身不发生变化的情况下,如果不变量结果发生变化即说明程序中有新的属性被揭示出来,也就说明相应的输入数据对该属性有揭示作用;而如果不变量结果保持不变,则说明相应的输入数据不能揭示出程序中新的属性。这也正是本文实现的测试用例约简技术的关键依据所在。
4.1.4可选用例空间的约简
在研究计算机局部性原理的基础上,总结程序结构特点,提出一条结论:程序结构具有局部连续性。即在一个较小的区间内,程序的属性是连续不变的(处处相同的)。具体到本文中即指程序动态不变量(集)是相同的。在这个前提下,我们就可以用区间中的任何一点的来代表整个区间,若该区间某一点是无效用例,则整个区间也是无效的。
本文以C程序为例,对程序结构局部连续性进行说明。首先,仍然以例1为例,该程序动态不变量集为{return==one of{0,1}}。但是,当入口参数取值都大于0时,程序似然不变量是return==1,在(0,+∞)这个局部区间内,程序似然不变量相同,表现出“局部连续性”;同理在(-∞,0]区间内也表现出“局部连续性”;考虑更一般的C程序结构以及程序运行情况,如附图4所示:
根节点表示入口参变量。所有出度为1的节点表示程序顺序结构。所有的出度大于1的节点表示程序条件分支或者循环分支。所有出度为0的节点为叶子节点。各节点中的数据表示该节点的取值空间。任何一个非叶节点的取值空间为其所有子节点取值空间的并集,根节点的取值空间等于所有叶子节点的取值空间的并集。
附图4表达了两重涵义:(1)表示可选用例空间随着入口参变量的数据流动和程序控制结构的作用,被划分成若干个叶子子空间;(2)同属于某一个叶子子空间的入口数据会在程序执行时会经历相同的数据流动,会表现出相似的逻辑属性,即在叶子子空间的局部空间内,程序结构局部连续。
注意,除根节点外,每个节点中的数据不仅仅表示入口参变量,而是通过赋值等多种方式形成的“间接入口参变量集合”,例如假设a为入口参变量,代码中有y=3*a,z=y+x。则y,z都属于“间接入口参变量集合”,本文中对于入口参变量及其间接入口参变量集合,一律用入口参变量替代。间接入口参变量集合可以通过模糊测试领域的污点跟踪方法得到。
入口参变量的取值空间在程序数据流和控制流的共同作用下,被划分成若干个叶子节点的子空间。叶子子空间中的数据经历同样的数据流动和条件分支,从某种意义上说,它们是数据流和控制流作用下的等价类。会表现出极其相似的逻辑属性。更进一步,在同一子空间的局部很小的区间中,其逻辑属性甚至是处处相同的,在本文中即指该处数据使得程序似然不变量集相同。
依据程序具有局部连续性的属性,在程序中当生成的用例有一个是无效时,则在其附近一个极小的区间之内,亦认为它们是无效的,可以从可选用例空间中约去,这就是CRT约简随机空间的主要思路。
4.2CRT的构造过程
依据上述理论,实现了一个面向C的模型工具,用于完成效率的验证。称为面向C的测试用例自动化生成工具,简称CRT。
如附图5所示,CRT的具体编写过程分四个层次进行:
1.编写源码信息抽取函数。
2.用信息抽取函数构建所需数据结构:被测函数信息表、复杂类型成员信息表和参数区间信息表。
3.依据各个信息表进行被测源码文件重写。重写为两个函数,一个用于新用例生成,一个用于构建被测程序。重写为两个函数,是为了减小重写后的函数代码规模,减 小DAIKON的运行时间开销。
4.最后编写一个脚本文件完成前述总框图的整合工作。
5.附图说明
附图1是该方法的总体流程结构图,该图描述了测试用例生成,判定的过程。有效测试用例集合的获取过程是:
(1)测试用例构造器生成新的测试用例。
(2)将新用例输入被测程序执行,并用DAIKON获取动态似然不变量集合。
(3)若动态似然不变量集合没有发生变化,则该用例为无效用例,添加到无效用例集合中。并以该无效用例为中心,进行无效区间探测,约简随机空间。
(4)若动态似然不变量集合发生变化,则该用例为有效用例,添加到有效用例集合中;并更新动态似然不变量集合。
(5)判断是否满足终止条件,若满足,输出已得的有效用例集合作为最终的测试用例集合,结束;否则,转(1);
附图2是测试用例构造器的流程示意图
附图3是Daikon的设计框架图
附图4是入口参变量取值空间划分示意图
附图5是CRT构造层次结构图
附图6是CRT使用方法截图
Claims (4)
1.一种不变量指导的随机测试用例自动化生成方法,其特征是利用程序不变量属性信息指导随机测试用例的自动化生成。
2.根据权利要求1所述的方法,其特征是高自动化,除需提供必要的被测源码外,完全自动化。
3.根据权利要求1所述的方法,其特征是利用程序不变量的提取结果来过滤无效用例。降低最终用例集合中的无效用例数目,降低冗余率。
4.根据权利要求1所述的方法,其特征是利用程序不变量的提取结果来约简可选用例空间,见效随机用例生成的取值区间大小,提高有效用例被选中的概率,进而提高用例生成效率。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110085863XA CN102736973A (zh) | 2011-04-07 | 2011-04-07 | 不变量指导的随机测试用例自动化生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110085863XA CN102736973A (zh) | 2011-04-07 | 2011-04-07 | 不变量指导的随机测试用例自动化生成方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102736973A true CN102736973A (zh) | 2012-10-17 |
Family
ID=46992514
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110085863XA Pending CN102736973A (zh) | 2011-04-07 | 2011-04-07 | 不变量指导的随机测试用例自动化生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102736973A (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105677570A (zh) * | 2016-01-11 | 2016-06-15 | 北京航空航天大学 | 一种基于事件响应函数树的gui软件测试用例生成方法 |
CN106325827A (zh) * | 2015-06-16 | 2017-01-11 | 深圳市中兴微电子技术有限公司 | 一种随机测试程序生成方法及装置 |
CN107797929A (zh) * | 2017-10-26 | 2018-03-13 | 北京广利核系统工程有限公司 | 可编程逻辑仿真测试功能覆盖率的统计方法和装置 |
CN108228469A (zh) * | 2018-02-23 | 2018-06-29 | 科大讯飞股份有限公司 | 测试用例选取方法及装置 |
CN110083529A (zh) * | 2019-03-20 | 2019-08-02 | 北京字节跳动网络技术有限公司 | 自动化测试方法、装置、介质和电子设备 |
CN110348216A (zh) * | 2019-05-24 | 2019-10-18 | 中国科学院信息工程研究所 | 一种针对云计算系统虚拟设备的模糊测试方法及系统 |
CN111124484A (zh) * | 2018-10-31 | 2020-05-08 | 上海奥陶网络科技有限公司 | 一种java程序参数优化方法 |
CN113574511A (zh) * | 2019-03-25 | 2021-10-29 | 三菱电机株式会社 | 测试用例生成装置、测试用例生成方法和测试用例生成程序 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101236494A (zh) * | 2008-02-02 | 2008-08-06 | 南京大学 | 一种基于覆盖密度的信息系统测试组合生成方法 |
CN101673236A (zh) * | 2009-10-13 | 2010-03-17 | 中国人民解放军国防科学技术大学 | 一种全覆盖的微处理器测试用例包自动生成方法 |
-
2011
- 2011-04-07 CN CN201110085863XA patent/CN102736973A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101236494A (zh) * | 2008-02-02 | 2008-08-06 | 南京大学 | 一种基于覆盖密度的信息系统测试组合生成方法 |
CN101673236A (zh) * | 2009-10-13 | 2010-03-17 | 中国人民解放军国防科学技术大学 | 一种全覆盖的微处理器测试用例包自动生成方法 |
Non-Patent Citations (1)
Title |
---|
曹青: "《随机测试用例的自动化生成和约简》", 《中国优秀硕士学位论文全文数据库》, 31 January 2011 (2011-01-31) * |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106325827A (zh) * | 2015-06-16 | 2017-01-11 | 深圳市中兴微电子技术有限公司 | 一种随机测试程序生成方法及装置 |
CN106325827B (zh) * | 2015-06-16 | 2019-07-19 | 深圳市中兴微电子技术有限公司 | 一种随机测试程序生成方法及装置 |
CN105677570B (zh) * | 2016-01-11 | 2018-05-18 | 北京航空航天大学 | 一种基于事件响应函数树的gui软件测试用例生成方法 |
CN105677570A (zh) * | 2016-01-11 | 2016-06-15 | 北京航空航天大学 | 一种基于事件响应函数树的gui软件测试用例生成方法 |
CN107797929A (zh) * | 2017-10-26 | 2018-03-13 | 北京广利核系统工程有限公司 | 可编程逻辑仿真测试功能覆盖率的统计方法和装置 |
CN108228469B (zh) * | 2018-02-23 | 2021-10-08 | 科大讯飞股份有限公司 | 测试用例选取方法及装置 |
CN108228469A (zh) * | 2018-02-23 | 2018-06-29 | 科大讯飞股份有限公司 | 测试用例选取方法及装置 |
CN111124484B (zh) * | 2018-10-31 | 2023-09-01 | 上海奥陶网络科技有限公司 | 一种java程序参数优化方法 |
CN111124484A (zh) * | 2018-10-31 | 2020-05-08 | 上海奥陶网络科技有限公司 | 一种java程序参数优化方法 |
CN110083529A (zh) * | 2019-03-20 | 2019-08-02 | 北京字节跳动网络技术有限公司 | 自动化测试方法、装置、介质和电子设备 |
CN110083529B (zh) * | 2019-03-20 | 2020-06-05 | 北京字节跳动网络技术有限公司 | 自动化测试方法、装置、介质和电子设备 |
CN113574511A (zh) * | 2019-03-25 | 2021-10-29 | 三菱电机株式会社 | 测试用例生成装置、测试用例生成方法和测试用例生成程序 |
CN110348216A (zh) * | 2019-05-24 | 2019-10-18 | 中国科学院信息工程研究所 | 一种针对云计算系统虚拟设备的模糊测试方法及系统 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102736973A (zh) | 不变量指导的随机测试用例自动化生成方法 | |
CN110489445B (zh) | 一种基于多形态复合的海量数据快速查询方法 | |
CN103473171B (zh) | 一种基于函数调用路径的覆盖率动态跟踪方法及装置 | |
CN107357942A (zh) | 一种源代码辅助生成工具及其生成方法 | |
CN104966031A (zh) | 安卓应用程序中非权限相关隐私数据的识别方法 | |
CN101464797A (zh) | 基于统一建模语言活动图自动生成测试用例的方法及系统 | |
CN105138515A (zh) | 命名实体识别方法和装置 | |
CN103605606B (zh) | 一种可自动转换的嵌入式软件测试用例批量执行方法 | |
CN104268428A (zh) | 一种用于指标计算的可视化配置方法 | |
Wang et al. | Mapreduce-based closed frequent itemset mining with efficient redundancy filtering | |
CN103150163A (zh) | 一种基于MapReduce模型的并行关联方法 | |
CN112579563B (zh) | 一种基于电网大数据的数仓可视化建模系统及方法 | |
CN108876283A (zh) | 一种自动审核系统及方法 | |
CN109408360A (zh) | 一种软件可靠性评估方法和系统 | |
CN114896248A (zh) | 实现基于关联池数据表自动拼接生成sql的方法及装置 | |
Rost et al. | Temporal graph analysis using gradoop | |
CN102207935A (zh) | 用于创建索引的方法和系统 | |
CN104462095B (zh) | 一种查询语句公共部分的提取方法及装置 | |
CN102880497A (zh) | 一种编译器及软件管理存储器的重用优化方法 | |
Wang et al. | Federated MapReduce to transparently run applications on multicluster environment | |
CN106257457A (zh) | 一种舆情收集整理方法 | |
CN112395343B (zh) | 一种基于dsg的字段变更数据采集抽取方法 | |
CN105653355A (zh) | Hadoop的配置参数的计算方法及系统 | |
CN108897763A (zh) | 一种区块链数据转化系统 | |
CN108346007A (zh) | 一种基于FP-Growth算法的手机贴标检测数据分析方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C05 | Deemed withdrawal (patent law before 1993) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20121017 |