CN103942147B - 一种线性拟合函数驱动的测试数据自动生成方法 - Google Patents
一种线性拟合函数驱动的测试数据自动生成方法 Download PDFInfo
- Publication number
- CN103942147B CN103942147B CN201410189411.XA CN201410189411A CN103942147B CN 103942147 B CN103942147 B CN 103942147B CN 201410189411 A CN201410189411 A CN 201410189411A CN 103942147 B CN103942147 B CN 103942147B
- Authority
- CN
- China
- Prior art keywords
- branch
- function
- input vector
- input
- path
- 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.)
- Active
Links
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种基于线性拟合函数驱动的测试数据自动生成方法。本发明通过路径分析得到路径集合,然后对每个路径寻找可覆盖该路径的测试数据产生待测源代码的测试数据集。其中,对每个路径寻找可覆盖该路径的测试数据通过以下方法实现:首先通过随机方法构建输入向量集,然后对输入向量集的运行分析,再通过线性拟合的手段扩展输入向量集,经重复迭代,获得可覆盖该路径的测试数据。本发明方法高度自动化,能够尽可能的提高单元测试的效率,降低测试成本,并且支持面向路径的测试覆盖准则。
Description
技术领域
本发明涉及一种测试数据自动生成方法,特别涉及自动化单元测试中路径覆盖测试的测试用例数据的生成方法。
背景技术
测试技术是保障软件系统质量最重要和最有效的方法之一,一直以来也是工业界保证软件系统正确性最主要的手段。受计算能力和时间、空间资源的限制,测试无法穷尽软件所有可能的执行,实践中,各种测试充分度准则被用于驱动和评估测试过程。因此,面向给定的测试充分度准则,如何生成对应的测试用例集合,以驱动程序的执行覆盖相应的结构,成为测试过程中最关键的技术环节。目前测试用例的设计基本依靠人工手动完成,不仅费时费力,而且用例的有效性也难以得到保证。如何自动地为各种测试充分度准则生成有效的测试用例,已成为测试技术研究的热点问题之一。
面向路径的测试覆盖准则,是应用较广泛的一种白箱测试充分度准则,它要求测试用例驱动程序沿着给定的路径执行。理论研究已经证明,不存在通用有效的算法可以为程序中任意路径生成测试输入。已有的研究工作可分为基于静态分析和基于动态执行两类方法。基于静态分析的方法无法有效的处理路径中的非线性约束条件,动态方法容易陷入局部最优点而无法发现可行的输入,它们在处理实际问题时存在很大的局限性。
科学和工程问题中,通常可以采用诸如采样、实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个逼近于实际函数或者更加密集的离散方程与已知数据相吻合,这个过程叫做拟合。线性拟合是比较简单的拟合方式,数据点使用直线进行连接,结果是一个多边形。线性拟合简单易用,它可以在比较短的时间内得到逼近函数,缩短了算法自动生成测试数据的前期工作量。
发明内容
本发明所要解决的问题是为待测试源程序自动构建测试数据(测试用例),使得在这些测试数据下执行待测试源程序能够覆盖该待测试源程序的所有路径,完成路径覆盖测试。
为解决上述问题,本发明采用的方案如下:
根据本发明的一种基于线性拟合函数驱动的测试数据自动生成方法,包括分析待测源程序获得待测源程序所有路径的路径集PS的步骤,该方法还包括对路径集PS中的每一路径P执行以下步骤:
S1:根据所述路径P上的各分支节点的各个判断语句,构建关于输入变量向量X的分支函数Fi,j(X);所述输入变量向量X为所述待测源程序输入变量构成的向量;所述分支函数Fi,j(X)表示第i个分支节点的第j个判断语句的分支函数;
S2:构建初始的输入向量集U;所述初始的输入向量集U至少包含两个输入向量;
S3:计算以输入向量集U中每个输入向量作为待测源程序的输入执行待测源程序时所述路径P上的每个分支节点上的各分支函数Fi,j(X)获得分支函数值的集合V以及最远公共分支节点m;假如输入向量集U中存在一个输入向量执行待测源程序时覆盖所述路径P,则返回该输入向量作为所述路径P的测试数据;
S4:根据各个分支节点上的各分支函数值的集合V以及最远公共分支节点m构建最远公共分支节点m前的每个分支节点中的各分支函数的线性拟合函数LFi,j;LFi,j表示第i个分支的第j个分支函数的线性拟合函数;
S5:根据每个分支节点中的各分支函数的线性拟合函数LFi,j和待测源程序计算可行区间I;
S6:在可行区间I内随机选取各输入变量的输入值得到测试数据集加入至输入向量集U中;
S7:重复执行步骤S3至S6直到步骤S3至S6执行的次数达到限定的次数;
S8:从输入向量集U中找出能够覆盖路径P最多分支的输入向量作为路径P的测试数据。
进一步,根据本发明的基于线性拟合函数驱动的测试数据自动生成方法,所述步骤S2中所述的初始的输入向量集U包含Ni+1个输入向量,所述Ni为输入变量的个数;初始的输入向量集U={u0,u1,u2,...,uNi},其中ui={ui,1,ui,2,...,ui,Ni};输入向量u0为随机生成,ui与u0满足关系:
其中i,j∈{1,2,...,Ni}。
进一步,根据本发明的基于线性拟合函数驱动的测试数据自动生成方法,所述步骤S3包括:
S31:从输入向量集U获取未执行的输入向量uk;
S32:判断未执行的输入向量uk是否存在;假如不存在未执行的输入向量,则执行步骤S34;否则执行步骤S33;
S33:根据uk执行待测源代码得到执行的路径和路径P的公共分支节点mk,并计算路径P上的分支函数Fi,j(X)的值,各个分支节点上的各分支函数Fi,j(X)的值构成集合V;
S34:从{m1,m2,...,mKU}中选取最远公共分支节点m。
进一步,根据本发明的基于线性拟合函数驱动的测试数据自动生成方法,所述步骤S4包括以下步骤:
S41:输入向量集U和各个分支节点上的各分支函数值的集合V以及最远公共分支节点m构建最远公共分支节点m构建坐标集Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))};
S42:以坐标集Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))}内两个相邻的坐标点构建Fy,z(xj)的线性拟合函数LFy,z(xj)=pj*xj+qj,得到参数集LFPQi,j={(p1,q1),(p2,q2),...,(pNi,qNi)};
其中,Vy,z,j表示第y个节点第z个分支函数对应第j个输入变量的坐标集,其中y≤m;ui,j为输入向量集U中第i个输入向量的第j个输入变量的值;Fy,z(xj)为第y个节点第z个分支函数关于第j个输入变量的函数;LFy,z(xj)为第y个节点第z个分支函数关于第j个输入变量的线性拟合函数;LFPQi,j为第i个节点第j个分支函数的线性拟合函数的参数集。
进一步,根据本发明的基于线性拟合函数驱动的测试数据自动生成方法,所述步骤S5包括:
S51:计算各个分支节点中各分支函数的可行区间Di,j;
S52:合并每个分支节点内的各分支函数的可行区间Di,j得到各分支节点的可行区间Di;
S53:合并最远公共分支节点m前的各分支节点的可行区间Di得到可行区间I。
进一步,根据本发明的基于线性拟合函数驱动的测试数据自动生成方法,所述可行区间I={I1,I2,...,Is},其中,s为输入变量的个数,Ii为第i个输入变量的可行区间,Ii={Ii,1,Ii,2,...,Ii,Mi},其中,Ii,j为第i个输入变量第j个可行分段区间,Mi为第i个输入变量可行分段区间数;所述步骤S6中,当Mi为1时,从Ii为第i个输入变量的可行区间的唯一分段区间Ii,1的扩展区间中随机取值构建测试数据。
进一步,根据本发明的一种机器可读介质,该可读介质上存储有指令集合,当该指令集合被执行时,使得该机器可执行本发明的基于线性拟合函数驱动的测试数据自动生成方法。
本发明的技术效果如下:
1、本发明方法无需分析程序路径上各语句之间的数据依赖关系,采用动态执行的方式,自动确定分支谓词的线性拟合函数,效率高。
2、能有效地处理路径中的非线性约束条件,并采用动态步长扩张的方式,很好的解决动态方法容易陷入局部最优点而无法发现可行的输入的问题。
3、能有效地处理路径中的复合条件约束,将复合条件谓词等价转换成分支函数分组,利用线性拟合函数快速的确定输入变量的可用取值区间。
4、约束求解器采用线性拟合的方法求解约束系统,充分利用线性拟合函数简单易用的优点;如果分支函数关于输入变量是线性的,则获得的线性拟合函数与函数本身完全吻合,如果分支函数关于输入变量是非线性的,则综合在各个区间上得到的线性拟合函数,可以估算分支函数的大致情况,随着程序的不断执行,用于函数赋值的数据越多,估算得到的函数信息就越精确。理论上,当计算拟合函数的区间足够小时,获得的线性拟合函数就能足够贴近函数的真实情况,对自动生成准确的测试数据就更有指导意义。
5、本发明方法高度自动化,能够尽可能的提高单元测试的效率,降低测试成本。
6、本发明方法能够很好的支持面向路径的测试覆盖准则。
附图说明
图1是本发明待测源程序代码例子。
图2是本发明步骤S3的流程图。
具体实施方式
下面结合说明书附图对本发明做进一步详细说明。
一、CLFF测试数据自动生成方法的基本原理
CLFF测试数据自动生成方法,即基于线性拟合函数驱动的测试数据自动生成算法,是线性拟合技术在测试数据自动生成中的应用。具体来说,首先对待测源程序进行词法分析、语法分析及语义分析后获得待测源程序所有路径,然后针对每个路径单独生成一套测试数据(测试用例)使得该测试数据能够覆盖该路径,每个路径对应一套测试数据,测试源程序的所有路径能够得到测试数据集。
在为某路径生成测试数据时,首先随机生成一输入数据,然后根据该输入数据执行待测源程序,分析其执行结果,根据执行结果通过线性拟合后构造新的测试数据,然后根据新的测试数据执行待测源程序,分析其执行结果,再根据执行结果通过线性拟合后构造新的测试数据,重复上述步骤直到存在一测试数据能够覆盖该路径。当然,假如随机生成的输入数据能够覆盖该路径,后面的执行结果分析以及线性拟合就不需要了,直接返回该输入数据作为该路径的覆盖测试数据。此外,这里还存在被分析的路径永远无法覆盖的情形,在这种情形下,通过对循环计数直到循环次数达到某一限值时停止,然后将能够覆盖该路径最多分支节点的输入数据作为测试数据返回。
因此,本发明的重点在于,如何根据执行结果进行线性拟合以及如何根据线性拟合构造新的测试数据。
二、构建分支函数
本发明的步骤S1为根据所述路径P上的各分支节点的各个判断语句,构建关于输入变量向量X的分支函数Fi,j(X)。这个步骤简称为构建分支函数。
判断语句有两种,一种是布尔表达式:B(X);对于布尔表达式,分支函数Fi,j(X)=B(X)。另一种是包含条件运算符的判断语句,表示为:L(X)rel R(X),rel∈{>,≥,=,≠,≤,<};这里rel表示条件运算符,L(X)表示条件运算符左侧的表达式,R(X)表示条件运算符右侧的表达式,那么,分支函数Fi,j(X)=L(X)-R(X)。也就是说,分支函数是判断语句的规范表示,任何判断语句都可以表示成如下格式:Fi,j(X)rel 0,rel∈{>,≥,=,≠,≤,<}。通常每个分支节点上包含多个判断语句,进行判断语句的规范表示后,分支节点的逻辑表达式可以表示成:ci=Fi,1(X)rel10op1Fi,2(X)rel2 0op2...ops-1Fi,s(X)rels 0,这里opi表示与(And)或或(Or)的逻辑运算符,s表示第i个分支节点上判断语句的数量。
除了上述的规范表示外,构建的分支函数还有一个参数的映射过程,也就是将分支函数Fi,j(X)的参数映射至输入变量的向量X中使得分支函数Fi,j(X)是关于输入变量向量X的函数。对于特定的路径P,分支函数Fi,j(X)与输入变量向量X之间的函数关系是确定的。如图1所示,由C语言编写的example源代码中,总共有6条路径:分别为:路径1:P1→C1→P2→C2→P4→P6;路径2:P1→C1→P2→C2→C3→P5→P6;路径3:P1→C1→P2→C2→C3→P6;路径4:P1→C1→P3→C2→P4→P6;路径5:P1→C1→P3→C2→C3→P5→P6;路径6:P1→C1→P3→C2→C3→P6。example函数有3个输入分别为a,b,c,其中C2分支节点的判断语句为d+e>100,在路径确定的情形下,d和e相对于a,b,c的输入是确定的,可以表示成d=D(a,b,c)和e=E(a,b,c),则该判断语句的分支函数定义为:Fi,j(X)=D(X)-E(X),X={a,b,c}。由此,对于任一输入x={ax,bx,cx},分支函数Fi,j(X)均能直接计算得到一具体的函数值。以路径4为例,d=(a-b)*2,e=b,由此可以得到C2分支节点的唯一一个判断语句的分支函数F2,1(a,b,c)=d+e-100=(a-b)*2+b-100=2*a-b-100。以路径2为例,d=(a-b)*2,e=d=(a-b)*2,由此可以得到C2分支节点的唯一一个判断语句的分支函数F2,1(a,b,c)=d+e-100=(a-b)*4-100。也就是说,不同路径下,判断语句的分支函数可能不同。但在确定了的路径下,分支函数关于输入变量的函数是确定了的。
本步骤的输入是待测源程序在路径P上的各分支节点的各个判断语句,输出是相应判断语句的分支函数Fi,j(X)。这里X为输入变量向量,由待测源程序输入变量构成的向量。分支函数Fi,j(X)表示第i个分支节点的第j个判断语句的分支函数,i和j的取值范围取决于路径P上的分支节点数和各个分支节点上的判断语句数。
需要说明的是,这里路径P是由对待测源程序进行词法分析、语法分析及语义分析,最终分析得到待测试源程序程序路径集中的某一条路径。本领域技术人员理解,对待测源程序进行词法分析、语法分析属于现有技术,其具体实现细节也不是本发明所要讨论的主题范畴。本领域技术人员还可以理解,在对待测源程序进行词法分析、语法分析及语义分析后,可以首先对待测源程序所有分支节点的各个判断语句构建分支函数,得到一个总的分支函数集,然后根据路径P上的分支节点从这个总的分支函数集中选取相应的分支函数即可。
三、构建初始的输入向量集
本步骤即为前述的步骤S2。
由于本发明通过线性拟合构建可行区间,然后从可行区间内选取测试数据。而线性拟合至少需要两个数据样本。因此,在构建初始的输入向量集U时,初始的输入向量集U至少包含两个输入向量。这里,输入向量对应前述的输入变量向量X。输入向量的每个元素为对应着待测源程序相应的输入变量的具体的值。初始的输入向量集U内的输入向量由随机生成,输入向量内的每个元素由随机生成。为更好的实现本发明的线性拟合。本发明中优先采用如下方法构建初始的输入向量集U:
初始的输入向量集U包含Ni+1个输入向量,Ni为输入变量的个数;初始的输入向量集U={u0,u1,u2,...,uNi},其中ui={ui,1,ui,1,ui,2,...,ui,Ni}。在这Ni+1个输入向量中,其中第一个输入向量,即输入向量u0为随机生成。ui与u0满足关系:其中i,j∈{1,2,...,Ni}。
这样设计的好处是,对于某个分支函数Fi,j(X)进行线性拟合时,每个输入变量可以分别进行,而避免多元线性拟合,同时所有的变量都能得到进行有效的线性拟合的数据。以前述例子的路径4为例,C2节点的分支函数为F2,1=2*a-b-100。假设输入向量集的四个输入向量分别为:u0={0,-3,-2},u1={4,-3,-2},u2={0,9,-2},u3={0,-3,7}。其中,输入向量u0,u1中,输入变量b和c的取值相同,分别为-3和-2,此时,可以构建关于输入变量a的线性拟合函数LF2,1(a)=2*a-97。同理,根据输入向量u0,u2可以构建关于输入变量b的线性拟合函数LF 2,1(b)=-1*b-100。
四、执行代码与统计
本步骤即为前述的步骤S3。
本步骤的输入为:输入向量集U、路径P和待测源程序。输出为:各个输入向量对应的路径P上各个分支函数Fi,j(X)的值构成的集合V,以及与路径P的最远公共路径分支节点m。
具体的过程可通过图2所示的流程实现,包括步骤S31、S32、S33、S34。
S31,从输入向量集U获取未执行的输入向量uk。步骤S3~S6是迭代循环的过程。输入向量集U随着迭代循环过程变化,迭代循环的第一次迭代的输入为初始的输入向量集U,初始的输入向量集U由前述步骤S2获得。由于第n次迭代过程与前几次迭代过程有所重复,即第n次迭代过程的输入向量集U中部分输入向量已经由前几次迭代过程执行了步骤S33。考虑处理效率,这部分重复的输入向量不需要重复再执行步骤S33。因此,只需要从输入向量集U中选取那些未执行的输入向量执行步骤S33即可。
S32,判断未执行的输入向量uk是否存在。该步骤是S31的延伸的判断步骤。假如未执行的输入向量uk不存在,表示输入向量集U中每个输入向量均执行了步骤S33,则执行步骤S34。假如未执行的输入向量uk存在,则对该输入向量uk执行步骤S33。
S33,根据uk执行待测源代码得到执行的路径和路径P的公共分支节点mk,并计算路径P上的分支函数Fi,j(X)的值。这里的执行待测源代码可以是模拟执行。一种实施方法是通过插桩的方式,在待测源代码中植入插桩代码。插桩代码可以监视待测源代码每一步执行的结果以及执行待测源代码的经过的路径。第二种实施方法是直接计算路径P上的分支函数Fi,j(X)值,然后根据分支函数Fi,j(X)对应的判断语句ci分析其执行的路径Pk。在第一种实施方法下,包括三个步骤:植入插桩代码,执行待测源程序,计算路径P上的分支函数Fi,j(X)的值。而第二种实施方法下,执行待测源程序和计算路径P上的分支函数Fi,j(X)的值可以一步完成。因此本发明优先采用第二种实施方法。需要说明的是,根据输入向量uk执行待测源代码时,不需要完整执行待测源代码,只需要执行待测源代码与路径P重合的部分即可。假如执行待测源代码时,在某个分支节点后执行的路径不同于路径P即可终止执行待测源代码。任一输入向量uk执行待测源代码后,可以得到所执行的路径Pk与路径P的公共分支节点mk。对于输入向量集U={u1,u2,...,uKU}而言,可以得到公共分支节点集M={m1,m2,...,mKU},以及分支函数Fi,j(X)的值的集合V={V1,V2,...,VKU}。这里的KU表示输入向量集U中元素的个数。这里的公共分支节点mk(其中,k∈{1,2,...,KU})为分支节点下标的表示的输入向量uk的公共分节点。输入向量uk的公共分支节点是根据输入向量uk执行待测源代码后所执行的路径Pk与路径P重叠的部分。相应地,计算路径P上的分支函数Fi,j(X)的值也是指根据输入向量uk执行待测源代码后所执行的路径Pk与路径P重叠的判断语句中的分支函数Fi,j(X)的值,也即集合V中其中Fi(uk)={Fi,1(uk),Fi,2(uk),...,Fi,iM(uk)}。以图1中的代码流程为例。路径P为P1→C1→P2→C2→P4→P6。而某一输入向量uk={0,-3,-2}下,执行图1中的代码后,得到的路径Pk为:P1→C1→P2→C2→C3→P6,则重叠的路径为:P1→C1→P2→C2,因此公共分支节点mk=C2,或者用第二个分支节点的下标表示:mk=2。相应地,各个分支函数Fi,j(X)的值为:F1,1=a-b=3;F2,1=(a-b)*4-100=-88。
S34,从{m1,m2,...,mKU}中选取最远的公共分支节点m。由于这里的公共分支节点mk(其中,k∈{1,2,...,KU})为分支节点下标,因此,最远的公共分支节点m=max{m1,m2,...,mKU}。
需要说明的是,在步骤S33中,假如存在某一输入向量uk执行代码后得到的路径与路径P相同,则说明该输入向量uk可作为覆盖路径P的测试数据直接结束整个对路径P生成测试数据的过程。
五、线性拟合
本步骤即为前述的步骤S4。
本步骤的输入为各个分支节点上的各分支函数值的集合V和最远公共分支节点m。这两个输入都是步骤S3的输出。输出为:最远公共分支节点m前的每个分支节点中的各分支函数的线性拟合函数LFi,j。这里LFi,j表示第i个分支的第j个分支函数的线性拟合函数。需要说明的是这里的最远公共分支节点m前包括最远公共分支节点m。根据前述输入向量U={u1,u2,...,uKU},分支函数值的集合V={V1,V2,...,VKU},可以得到输入向量坐标集:{(u1,V1),(u2,V2),...,(uKU,VKU)}。对于任一第y个分支节点的第z个分支函数Fy,z(X)可以得到坐标集Vy,z={(u1,Fy,z(u1)),(u2,Fy,z(u2)),...,(uKU,Fy,z(uKU))}。
线性拟合函数LFi,j实现的方式很多,下述有三种实施方式:
第一种线性拟合的实施方式是采用多元线性回归拟合。根据坐标集Vy,z以及多元线性拟合函数(其中,Ni为输入变量的个数),即可以计算得到的多元线性拟合函数LFy,z(X)的系数{a0,a1,...,aNi},从而完成线性拟合函数的构建。
第二和第三种线性拟合的实施方式都是对各个输入变量逐个进行简单的线性拟合。首先将Fy,z(X)视为关于输入变量xj(xj表示第j个输入变量,其中j∈{1,2,...,Ni},Ni为输入变量的个数)的函数Fy,z(xj),根据坐标集Vy,z可以得到关于输入变量xj的坐标集为:Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))},其中,ui,j表示第i个输入向量中第j个输入变量的值。Fy,z(xj)的线性拟合函数LFy,z(xj)=pj*xj+qj。
第二种线性拟合的实施方式是以坐标集Vy,z,j内的所有数据作为实测数据通过最小二乘法构建Fy,z(xj)的线性拟合函数LFy,z(xj)=pj*xj+qj。则有:
第三种线性拟合的实施方式是以坐标集Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))}内两个相邻的坐标点构建Fy,z(xj)的线性拟合函数LFy,z(xj)=pj*xj+qj。当ut,j≠ut+1,j时,由于Vy,z,j中存在KU个坐标,因此根据上述的规则,理论上可以得到KU-1个线性拟合函数。为此可采用后置规则,总是以最后两个相邻的坐标点构建线性拟合函数。比如,假如uKU,j≠uKU-1,j,则假如uKU,j=uKU-1,j=...=uKU-t+1,j≠uKU-t,j,则
第二和第三种线性拟合的实施方式的输出均为最远公共分支节点m前的每个分支节点中的各分支函数LFi,j可以得到线性拟合函数LFi,j的关于每个输入变量的参数集LFPQi,j={(p1,q1),(p2,q2),...,(pNi,qNi)},其中Ni为输入变量的个数。线性拟合函数LFi,j由参数集LFPQi,j表示。
第一种线性拟合的实施方式采用多元线性回归的方式有诸多实测数据限制。因此本发明优先采用第二和第三种线性拟合的实施方式。由于线性拟合是迭代过程,输入向量集U在迭代中增加,因此,采用第三种线性拟合的实施方式得到的线性拟合参数pj和qj比第二种线性拟合的实施方式更有变化性。因此,本发明以第三种线性拟合的实施方式为最优实施方案。
为方便后续说明,第一种线性拟合的实施方式的输出{a0,a1,...,aNi}可以转换成二和第三种线性拟合的实施方式的输出LFPQi,j={(p1,q1),(p2,q2),...,(pNi,qNi)},转换可采用如下的方法:pi=ai;qi=Fy,z(u1)-u1,i×ai。由此,三种线性拟合的实施方式具备相同格式或类型的输出结果。
六、可行区间的计算
本步骤为前述的步骤S5。
可行区间是指产生覆盖路径P所需要结果的可行取值区间。以第i个分支节点的逻辑表达式ci为例,ci=Fi,1(X)rel1 0op1Fi,2(X)rel2 0op2...ops-1Fi,s(X)rels0,这里opi表示与(And)或或(Or)的逻辑运算符,s表示第i个分支节点上判断语句的数量。当执行待测源代码时,覆盖路径P要求逻辑表达式ci为假。其中,某分支函数Fi,j(X)大于0时,逻辑表达式ci才有可能为假,这意味着只有当Fi,j(X)大于0时,才能覆盖路径P。当X位于区间Di,j时,满足Fi,j(X)大于0,则区间Di,j为可行区间。由于区间Di,j与分支函数Fi,j(X)相对应,区间Di,j又称为分支函数Fi,j(X)的可行区间。合并逻辑表达式ci内的各个分支函数的可行区间Di,j即可得到逻辑表达式ci的可行区间Di。逻辑表达式ci的可行区间Di又称为第i个分支节点的可行区间。合并最远公共分支节点m前的每个分支节点的可行区间Di可以得到可行区间I。因此,步骤S5分成以下三个步骤:
S51:计算各个分支节点中各分支函数的可行区间Di,j;
S52:合并每个分支节点内的各分支函数的可行区间Di,j得到各分支节点的可行区间Di;
S53:合并最远公共分支节点m前的各分支节点的可行区间Di得到可行区间I。
步骤S51中,分支函数Fi,j(X)的可行区间Di,j由分支函数Fi,j(X)对应的线性拟合函数LFi,j(X)计算获得。前述三种线性拟合的实施方式的输出为LFPQi,j={(p1,q1),(p2,q2),...,(pNi,qNi)}。用LFPQi,j表示的线性拟合函数LFi,j(X)是按各个输入变量分别定义的线性拟合函数集,在计算可行区间Di,j时,可采用同样的方式,即按各个输入变量分别计算不等式方程LFi,j(xk)reli 0=pk*xk+qk reli0的关于xk区间解Di,j,k,Di,j,k为第i个分支节点第j个分支函数的第k个输入变量的可行区间。本领域技术人员理解,这样得到的xk区间解Di,j,k很宽,一般为(a,∞)或(-∞,a)的形式。注意到线性拟合函数LFi,j(xk)=pk*xk+qk由Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))}计算获得。因此可以将可行区间Di,j,k限制在{u1,j,u2,j,...,uKU,j}相关区间RD内,即可行区间Di,j,k是相关区间RD与不等式方程的区间解的交集。相关区间RD可以为:(2×umin,j-umax,j,umax,j)或(2×umin,j-umax,j,2×umax,j-umin,j)或(umin,j,2×umax,j-umin,j)或(umin,j,umax,j)或(ura,j,urb,j)或(2×ura,j-urb,j,urb,j)或(2×ura,j-urb,j,2×urb,j-ura,j)或(ura,j,2×urb,j-ura,j)等等。其中,umin,j=min{u1,j,u2,j,...,uKU,j},umax,j=max{u1,j,u2,j,...,uKU,j};ura,j,urb,j∈{u1,j,u2,j,...,uKU,j},为前述计算中,ura,j=min{uKU-t,j,uKU,j},urb,j=max{uKU-t,j,uKU,j}。每个输入变量可以得到一个可行区间Di,j,k,由此可以得到分支函数Fi,j(X)的可行区间Di,j={Di,j,1,Di,j,2,...,Di,j,s},其中s为输入变量的个数。
步骤S52中分支节点的可行区间Di采用与逻辑表达式ci=Fi,1(X)rel1 0op1Fi,2(X)rel2 0op2...ops-1Fi,s(X)rels 0一致的交并集运算规则进行合并:
Di=Di,1op1Di,2op2...ops-1Di,s。
步骤S53中可行区间I采用交集运算规则进行合并:
其中m为最远公共分支节点。
最终得到的可行区间I={I1,I2,...,Is}。其中s为输入变量的个数,Ii为第i个输入变量的可行区间。输入变量的可行区间Ii为由可行分段区间组成的可行分段区间集,Ii={Ii,1,Ii,2,...,Ii,Mi},其中,Ii,j为第i个输入变量第j个可行分段区间,Mi为第i个输入变量可行分段区间数。
七、输入向量集的扩展
本步骤即为前述的步骤S6,在可行区间I内随机选取各输入变量的输入值得到测试数据集加入至输入向量集U中。
由于I={I1,I2,...,Is},而Ii={Ii,1,Ii,2,...,Ii,Mi}。本步骤中只需要从各个输入变量的可行分段区间集Ii的各个可行分段区间中随机选择一数据即可构建新的输入向量集T。由于每个输入变量都有Mi个可行分段区间,因此每个输入变量能从中选出Mi随机数。将所有的输入变量的各个可行分段区间所得的随机数组合后可产生M1×M2×...×Ms个输入向量。构建新的输入向量集T与原输入向量集U合并后得到新的输入向量集U。
对于部分比较特殊的输入变量,其对应可行分段区间数只有1个。这种情形下,可以在扩展区间中随机取值。扩展区间分左扩展区间,右扩展区间。假设第i个输入变量的可行区间唯一的分段区间Ii,1为(a,b),a<b,则左扩展区间为(2b-a,a),右扩展区间为:(b,2a-b)。
八、迭代与迭代的结束
本步骤即为前述的步骤S7和步骤S8。
步骤S7,重复执行步骤S3至S6直到步骤S3至S6执行的次数达到限定的次数。步骤S3至S6是迭代循环的过程,每经一轮的迭代循环,输入向量集U内的输入向量也随之变化。假如在步骤S3中,输入向量集U中存在一个输入向量执行待测源程序时覆盖所述路径P,则返回该输入向量作为所述路径P的测试数据,整个迭代过程结束。假如迭代循环的次数达到预先设定的限定次数时,表明路径P不可达。路径P不可达意味着路径P永远不可能被覆盖。假如路径P不可达同样需要返回路径P的测试数据,即步骤S8。
步骤S8,从输入向量集U中找出能够覆盖路径P最多分支的输入向量作为路径P的测试数据。步骤S3中可以得到输入向量集U={u1,u2,...,uKU}和其对应的公共分支节点集M={m1,m2,...,mKU}。取max{m1,m2,...,mKU}对应的下标w,mw=max{m1,m2,...,mKU},则mw对应的输入向量uw即为覆盖路径P最多分支的输入向量,最终返回uw为路径P的测试数据。
Claims (4)
1.一种基于线性拟合函数驱动的测试数据自动生成方法,包括分析待测源程序获得待测源程序所有路径的路径集PS的步骤,其特征在于,该方法还包括对路径集PS中的每一路径P执行以下步骤:
S1:根据所述路径P上的各分支节点的各个判断语句,构建关于输入变量向量X的分支函数Fi,j(X);所述输入变量向量X为所述待测源程序输入变量构成的向量;所述分支函数Fi,j(X)表示第i个分支节点的第j个判断语句的分支函数;
S2:构建初始的输入向量集U;所述初始的输入向量集U至少包含两个输入向量;
S3:计算以输入向量集U中每个输入向量作为待测源程序的输入执行待测源程序时所述路径P上的每个分支节点上的各分支函数Fi,j(X)获得分支函数值的集合V以及最远公共分支节点m;假如输入向量集U中存在一个输入向量执行待测源程序时覆盖所述路径P,则返回该输入向量作为所述路径P的测试数据;
S4:根据各个分支节点上的各分支函数值的集合V以及最远公共分支节点m构建最远公共分支节点m前的每个分支节点中的各分支函数的线性拟合函数LFi,j;LFi,j表示第i个分支的第j个分支函数的线性拟合函数;
S5:根据每个分支节点中的各分支函数的线性拟合函数LFi,j和待测源程序计算可行区间I;
S6:在可行区间I内随机选取各输入变量的输入值得到测试数据集加入至输入向量集U中;
S7:重复执行步骤S3至S6直到步骤S3至S6执行的次数达到限定的次数;
S8:从输入向量集U中找出能够覆盖路径P最多分支的输入向量作为路径P的测试数据;所述步骤S5包括如下步骤:
S51:计算各个分支节点中各分支函数的可行区间Di,j;
S52:合并每个分支节点内的各分支函数的可行区间Di,j得到各分支节点的可行区间Di;
S53:合并最远公共分支节点m前的各分支节点的可行区间Di得到可行区间I;
所述可行区间I={I1,I2,...,Is},其中,s为输入变量的个数,Ii为第i个输入变量的可行区间,Ii={Ii,1,Ii,2,...,Ii,Mi},其中,Ii,j为第i个输入变量第j个可行分段区间,Mi为第i个输入变量可行分段区间数,所述步骤S6中,当Mi为1时,从Ii为第i个输入变量的可行区间的唯一分段区间Ii,1的扩展区间中随机取值构建测试数据。
2.如权利要求1所述的基于线性拟合函数驱动的测试数据自动生成方法,其特征在于,所述步骤S2中所述的初始的输入向量集U包含Ni+1个输入向量,所述Ni为输入变量的个数;初始的输入向量集U={u0,u1,u2,...,uNi},其中ui={ui,1,ui,2,...,ui,Ni};输入向量u0为随机生成,ui与u0满足关系:其中i,j∈{1,2,...,Ni}。
3.如权利要求1所述的基于线性拟合函数驱动的测试数据自动生成方法,其特征在于,所述步骤S3包括:
S31:从输入向量集U获取未执行的输入向量uk;所述uk为输入向量集U中第k个输入向量;
S32:判断未执行的输入向量uk是否存在;假如不存在未执行的输入向量,则执行步骤S34;否则执行步骤S33;
S33:根据uk执行待测源代码得到执行的路径和路径P的公共分支节点mk,并计算路径P上的分支函数Fi,j(X)的值,各个分支节点上的各分支函数Fi,j(X)的值构成集合V;所述mk为输入向量集U中第k个输入向量所获得的公共分支节点;
S34:从{m1,m2,...,mKU}中选取最远公共分支节点m;其中,KU为输入向量集U中元素的个数。
4.如权利要求1所述的基于线性拟合函数驱动的测试数据自动生成方法,其特征在于,所述步骤S4包括以下步骤:
S41:根据输入向量集U和各个分支节点上的各分支函数值的集合V以及最远公共分支节点m构建坐标集Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))};
S42:以坐标集Vy,z,j={(u1,j,Fy,z(u1,j)),(u2,j,Fy,z(u2,j)),...,(uKU,j,Fy,z(uKU,j))}内两个相邻的坐标点构建Fy,z(xj)的线性拟合函数LFy,z(xj)=pj*xj+qj,得到参数集LFPQi,j={(p1,q1),(p2,q2),...,(pNi,qNi)};
其中,KU为输入向量集U中元素的个数;Ni为输入变量的个数;Vy,z,j表示第y个节点第z个分支函数对应第j个输入变量的坐标集,其中y≤m;ui,j为输入向量集U中第i个输入向量的第j个输入变量的值;Fy,z(xj)为第y个节点第z个分支函数关于第j个输入变量的函数;LFy,z(xj)为第y个节点第z个分支函数关于第j个输入变量的线性拟合函数;LFPQi,j为第i个节点第j个分支函数的线性拟合函数的参数集。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410189411.XA CN103942147B (zh) | 2014-05-06 | 2014-05-06 | 一种线性拟合函数驱动的测试数据自动生成方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410189411.XA CN103942147B (zh) | 2014-05-06 | 2014-05-06 | 一种线性拟合函数驱动的测试数据自动生成方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103942147A CN103942147A (zh) | 2014-07-23 |
CN103942147B true CN103942147B (zh) | 2017-04-05 |
Family
ID=51189820
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410189411.XA Active CN103942147B (zh) | 2014-05-06 | 2014-05-06 | 一种线性拟合函数驱动的测试数据自动生成方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103942147B (zh) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104731587A (zh) * | 2015-03-12 | 2015-06-24 | 用友网络科技股份有限公司 | 单元测试数据生成方法和单元测试数据生成系统 |
CN104881359B (zh) * | 2015-06-10 | 2017-11-24 | 南京大学 | 一种运用线性拟合实现路径覆盖的测试数据自动生成方法 |
CN105243018B (zh) * | 2015-10-24 | 2017-11-24 | 北京航空航天大学 | 一种面向对象的类测试数据生成方法 |
CN108052953B (zh) * | 2017-10-31 | 2022-01-18 | 华北电力大学(保定) | 基于特征相关的样本扩展方法 |
CN109861960B (zh) * | 2018-11-26 | 2021-12-21 | 阿里巴巴集团控股有限公司 | 提供用于验证业务逻辑的验证数据的方法及装置 |
CN110188032B (zh) * | 2019-04-30 | 2021-04-30 | 南京大学 | 一种线性拟合函数驱动的输入区间预测方法和装置 |
CN111045333B (zh) * | 2019-12-31 | 2022-01-21 | 山东交通学院 | 每对线性约束控制分量下过驱动系统控制可达集确定方法 |
CN110796247B (zh) * | 2020-01-02 | 2020-05-19 | 深圳芯英科技有限公司 | 一种数据处理方法、装置、处理器及计算机可读存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101593145A (zh) * | 2008-05-29 | 2009-12-02 | 福建升腾资讯有限公司 | 高效性高覆盖率功能测试用例设计方法 |
CN102141958A (zh) * | 2011-03-09 | 2011-08-03 | 中国矿业大学 | 面向缺陷的路径覆盖测试数据进化生成方法 |
-
2014
- 2014-05-06 CN CN201410189411.XA patent/CN103942147B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101593145A (zh) * | 2008-05-29 | 2009-12-02 | 福建升腾资讯有限公司 | 高效性高覆盖率功能测试用例设计方法 |
CN102141958A (zh) * | 2011-03-09 | 2011-08-03 | 中国矿业大学 | 面向缺陷的路径覆盖测试数据进化生成方法 |
Non-Patent Citations (2)
Title |
---|
Path-oriented Test Data Generation Driven by Component Linear Fitting Functions;Wenxu Ding etc.;《2012 IEEE Sixth International Conference on Software Security and Reliability Companion》;20120622;全文 * |
分量线性拟合函数驱动的测试数据自动生成技术研究;丁文旭;《中国优秀硕士学位论文全文数据库 信息科技辑》;20121015;第5页,第12页-第13页,第21页-第28页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103942147A (zh) | 2014-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103942147B (zh) | 一种线性拟合函数驱动的测试数据自动生成方法 | |
JP6832678B2 (ja) | 新規物質探索方法および装置 | |
CN107909107A (zh) | 纤维检测方法、装置及电子设备 | |
Bergmann | Translating OCL to graph patterns | |
CN103559129B (zh) | 基于遗传算法的统计回归测试数据生成方法 | |
CN103116540A (zh) | 基于全局超级块支配图的动态符号执行方法及其装置 | |
CN104965821A (zh) | 一种数据标注方法及装置 | |
CN104050083B (zh) | 一种面向条件判定覆盖的测试数据自动生成方法 | |
CN104050082B (zh) | 一种面向修订的条件判定覆盖的测试数据自动生成方法 | |
CN105373424A (zh) | 一种基于机器学习的推测多线程划分方法 | |
CN105976027A (zh) | 数据处理方法和装置、芯片 | |
CN103853554A (zh) | 一种软件重构位置确定方法及装置 | |
CN116227566A (zh) | 应用于ai芯片的计算图可视化方法、装置、设备及介质 | |
Antczak | Sufficient Optimality Conditions for Semi-Infinite Multiobjective Fractional Programming under (Φ, 𝜌)-𝑉-Invexity and Generalized (Φ, 𝜌)-𝑉-Invexity | |
CN110728359A (zh) | 搜索模型结构的方法、装置、设备和存储介质 | |
CN104881359B (zh) | 一种运用线性拟合实现路径覆盖的测试数据自动生成方法 | |
KR101727022B1 (ko) | 전산유체역학에서 최적 2차 변수 계산 경로 제안 방법 및 장치 | |
JP2006323624A (ja) | シーケンス図の類似度計算方法、そのプログラム及び装置 | |
Zhao et al. | Comment on “Are soils overrated in hydrology?” by Gao et al.(2023) | |
Coelho et al. | A dual method for solving the nonlinear structured prediction problem | |
Danielson et al. | Development of software for decision analysis | |
Kiriella et al. | Explainable AI techniques for Deep Convolutional Neural Network based plant disease identification | |
Abdi et al. | Change Impact Identification in Object-Oriented System: Dependence Graph Approach | |
Li et al. | Coordinated development of rural ecological construction and carbon neutrality: a deep learning approach for enhanced sustainability | |
Souza et al. | PARALLELIZATION OF SHORTEST PATH CLASS ALGORITHMS: A COMPARATIVE ANALYSIS |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |