CN112380120B - 单元测试代码结构自动解析与路径分析方法 - Google Patents
单元测试代码结构自动解析与路径分析方法 Download PDFInfo
- Publication number
- CN112380120B CN112380120B CN202011267313.5A CN202011267313A CN112380120B CN 112380120 B CN112380120 B CN 112380120B CN 202011267313 A CN202011267313 A CN 202011267313A CN 112380120 B CN112380120 B CN 112380120B
- Authority
- CN
- China
- Prior art keywords
- path
- node
- nodes
- function
- analyzing
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/433—Dependency analysis; Data or control flow analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了单元测试代码结构自动解析与路径分析方法。所述方法包括:根据测试程序的语言,获取编译后的字节码;遍历编译后的字节码,在重要语句前分别做插桩代码,同时获取结点信息与小段路径集合;分析小段路径集合,对其中包括嵌套的部分进行替换,得到不包括嵌套的小段路径集合并作为基础,初始化结点之间的路径表格,并利用深度优先DFS算法更新路径表格,依据路径表格得到路径集合;若并非所有路径集合都被覆盖即所有路径集合都已更新,则返回继续更新路径表格;输出获取的路经集合与分析得到的程序流程图CFG。本发明使用自动嵌入插桩代码、编译并分析的方式,能够高效获取路径集合,提高了处理实际软件单元测试路径分析的能力。
Description
技术领域
本发明涉及计算机软件工程的软件测试领域,具体涉及单元测试代码结构自动解析与路径分析方法。
背景技术
随着社会的发展与人工智能等IT领域不断应用,软件产品在生活中越来越普及,方便着生活的方方面面。软件产品的质量成为人们日益关注的焦点,生产一款质量有保证的软件产品,是生产者们的重要目标之一,也是IT企业应对市场竞争的重要砝码。软件测试作为软件开发生命中的重要过程,其目的是确保软件产品的质量。然而,软件测试花费了软件开发中至少50%的成本。软件测试有人工参与和自动化两种方式,全自动化测试在软件开发过程中还未真正普及,测试大多数情况仍然是以人工参与为主。然而技术的发展程度决定了软件的复杂程度,测试的难度和工作量随之增大而人的精力却是有限的,这种局面亟待改变;另外在软件测试中存在着大量技术含量低且经常重复的工作,若使用机器来完成将可以大大地减少人力的消耗;因此,以自动化的方式对软件进行测试是解决当前问题的最佳方案。一个优秀的自动化测试方案,可以节约大量的人力、物力和财力,减少资源消耗,同时提高企业效益。
为了尽可能减少软件的缺陷,需要生成无穷多个测试用例来对它进行测量。无论一个程序的规模有多大,对其输入进行穷举在现实世界中都是不可行的,所以在测试过程中需要找到一种优化方法,在不对质量妥协的情况下,减少资源(如时间、成本、人力资源、系统部件等等)的消耗。优化的目标是用尽可能少的时间和成本生成一些能够覆盖被测试系统中有效的测试用例。
现有的方法中使用的动态的方法大都是具体基于语句覆盖或者是分支覆盖,例如面向并行程序的路径分析工具BPEL4WS(Yan J,Li Z,Yuan Y,et al.BPEL4WS unittesting:Test case generation using a concurrent path analysis approach[C]//2006 17th International Symposium on Software Reliability Engineering.IEEE,2006:75-84.)与软件单元测试工具EvoSuite(Fraser G,Arcuri A.Evosuite:automatictest suite generation for object-oriented software[C]//Proceedings of the19th ACM SIGSOFT symposium and the13th European conference on Foundations ofsoftware engineering.2011:416-419.),这些工具虽然有路径分析与生成测试用例的功能,但其覆盖准则都没有实现较完备的路径覆盖,BPEL4WS基于简单路径覆盖,而EvoSuite也只能分析分支覆盖、语句覆盖。而在软件测试所有的覆盖类型中,路径覆盖是最强的覆盖,有更强的纠错能力,能更有效地检查出软件的瑕疵和错误。而实现单元测试路径覆盖的第一步是对程序进行分析,从而获取需要覆盖的路径、程序流程图以及其他相关信息,但是现有的技术大部分是需要人工参与,这极大提高了测试代价。
发明内容
本发明针对现有的软件测试测试用例生成软件系统的不足,提供了单元测试代码结构自动解析与路径分析方法。本发明的目的在于设计一种合理的单元测试代码自动解析与路径分析方法,帮助软件测试人员能够快速的获得路径覆盖准则下需要覆盖程序的结构、路径信息以及测试用例的路径覆盖情况分析,从而利用这些信息生成测试用例,进而更好地检测出测试程序可能存在的BUG,用于修复程序漏洞。
本发明的目的至少通过如下技术方案之一实现。
单元测试代码结构自动解析与路径分析方法,包括以下步骤:
S1、根据测试程序的语言,使用对应语言的编译器获取编译后的字节码;
S2、遍历编译后的字节码,在重要语句前分别做插桩代码,同时获取结点信息与小段路径集合;
S3、分析步骤S2中获取的小段路径集合,对其中包括嵌套的部分进行替换,得到不包括嵌套的小段路径集合;
S4、以步骤S3中得到的不包括嵌套的小段路径集合为基础,初始化结点之间的路径表格,并利用深度优先DFS算法更新路径表格,并依据路径表格得到路径集合;
S5、若所有路径集合都被覆盖即所有路径集合都已更新,跳至步骤S6,否则跳至步骤S4;
S6、输出获取的路经集合与分析得到的程序流程图CFG。
进一步地,步骤S2中,对编译后的字节码进行遍历,在遍历过程中,需要插桩的结点包括函数开头、函数结尾、一般执行语句段、分支语句、循环语句以及函数或类的嵌套语句。
进一步地,当搜索到对应结点时,使用预设的类插入函数Data.add(temp)实现该结点的插桩,其中temp代表结点信息与结点编码的字符串,Data为路径信息存储的类;在对路径每个结点编码过程中,设置一个全局变量N,其初始值设为0,每次遍历到特定结点时就将其编码赋值为N,之后通过N=N+1更新值;
在遍历到函数开头、函数结尾以及分支循环语句时使用插桩语句对字节码进行插桩,将相对应的节点信息插入到相应位置;
分支循环语句包括if、switch、for和while。
进一步地,步骤S2中,在遍历编译后的字节码的同时进行预处理,获取插桩的结点编码以及分支语句、循环语句、函数嵌套中出现的约束表达式信息,同时对其中的变量信息进行回溯,找出原始的输入变量表达式,方便后续分析路径可行性。
进一步地,步骤S2中,每当遍历到插桩的结点将进行存储,并按照遍历顺序组成两两结点之间的小段路径,例如以下程序示例:
do A;
if(true)do B;
else do C;
do D;
将分别形成(A,B)(A,C)(B,D)(C,D)等多段小段路径,其中包括函数嵌套、类的嵌套的结点使用函数调用标签invoke标记代替该小段路径,如下列示例代码:
do A;
method C();//此处调用函数C
do B;
将形成(A,invoke.C)(invoke.C,B)等多段小段路径,方便后续进行替换。
进一步地,步骤S3中,在步骤S2中获取的两两结点组成的小段路径集合的基础上,遍历小段路径集,找到路径集中带有函数调用标签标记的路径,通过该标签获取对应的函数的路径集合,使用该函数路径集中的路径替换原路径集中的带有函数调用标签标记的路径,形成没有函数嵌套或类的嵌套的小段路径集合。步骤S3的伪代码如下所示:
进一步地,步骤S4中,利用步骤S3中获取的不包括嵌套的小段路径集合的集合信息初始化结点之间的路径表格M,路径表格M的行数与列数均为结点个数;之后利用深度优先算法DFS,以函数的起始节点为路径起点,对路径表格M根据节点之间的邻接关系进行深度优先遍历,遍历过程中记录所遍历到的节点,当遍历到该函数的终止节点时,当前遍历结束,取出记录到的当前遍历所经过的节点并记为一条完整路径,之后重新进行遍历,按照相同方法生成其他所有完整路径。步骤S4的伪代码如下所示:
遍历路径表格,获取路径表格上栈顶节点所在的一行中从左往右第一个数据为1且未被访问的节点:
若该节点存在,则将此节点压栈,同时设定为已访问:
}
}
进一步地,所述路径表格M表示的是路径节点之间的邻接关系,每列每行代表节点之间是否存在路径,其中最左列代表路径起点的节点,最上行代表路径终点的节点,对于一个单元格来说,若该单元格所在行所对应的节点存在一条路径能到达该单元格所在列所对应的节点,则该单元格的值置为1,否则为0。
进一步地,步骤S5中,由于存在循环语句,可能导致单元程序的路径数量暴增,无法确定最终需要覆盖的路径数量,采用K-loop的循环路径判断方法,即默认所有循环的最大循环次数为K次,判定需要覆盖的路径集合,例如:
While(a<10)
{print(“a”);}
假设K=2,1表示进入循环,0表示未进入循序,那么该路径片段就存在00,01,10,11四种可能;同时利用符号执行技术,分析路径的约束表达式,从而判定路径的可行性,去除不可行路径,例如类似(a==0&&a==1)这种会导致约束表达式无解的路径,优化得到最终需要覆盖的单元程序路径集合。
进一步地,步骤S6中,在通过步骤S4和步骤S5获取所有路径编码信息后,将通过对路径结点信息的统计分析,构建结点的树形结构图,从而得到测试单元程序的完整流程图,具体如下:
首先,将找出每个结点前出现次数最多的前置结点,在流程图(树)中将此结点的前置结点作为此结点的父节点;按照此规律,由起始节点开始,遍历所有未放置过的结点,构建树形结构,从而获取流程图信息。
本发明提供的单元测试代码结构自动解析与分析方法,首先将被测试单元代码进行编译处理,获取字节码;接着遍历字节码,确定被测试程序的判断、循环分支、函数嵌套等内容,在程序中插桩标记,同时获取分支节点处符号编码以及其他数据引用与计算表达式等信息,遍历字节码的同时获取标记节点之间两两相连节点信息,得到被测试程序小段路径集合;然后通过替换潜在的嵌套节点等路径信息,获取完整的小段路径集合,接着使用小段路径集合初始化路径表格,并利用深度优先搜索算法得到完整的路径表格,最后方法将在获取的约束表达式基础上,结合路径分支信息,分析路径可行下约束表达式,剔除不可行路径,并输出最终获得的路径集合并通过路径结点合成算法获取最终的程序流程图CFG。
与现有的技术相比,本发明具有以下优点和技术效果:
对于软件单元测试与路径分析相关的软件,市面上大多数是使用简单的随机规则,或者使用静态的符号执行的方式,前者过于简单,后者对于复杂的测试问题解决能力不强,而本发明采取的是使用自动嵌入插桩代码、编译并分析的方式,能够高效获取路径集合,极大地提高了方法处理实际软件单元测试路径分析的能力。其次,而路径覆盖作为一种更强的覆盖准则,相应的基于路径覆盖准则找到的测试用例则拥有更强的纠错能力,而现有的程序路径分析工具,一方面没有考虑路径的可行性,另一方面缺乏对程序分支信息的获取,无法为后续路径覆盖测试用例生成提供充足的信息。本发明采用自动插桩标记代码并分析编译后字节码的方式,能够获取被测试函数中存在的嵌套函数内部信息,形成完整的路径,并利用获取的路径约束表达式,剔除那些冗余的不可被覆盖的路径,减少了后续生成路径覆盖测试用例的压力,同时方法还能够实时确定测试用例覆盖的路径并为测试人员提供了可视化的流程图信息。申请本发明的相关方法相对便捷,不需要测试人员对被测试程序的逻辑等规律有很深的了解,拥有很强的易用性,只要测试人员按照本发明的方法进行简单的操作,有广阔的应用空间。
本发明中采用的技术手段能够实现无人工参与的实际工程代码单元程序自动解析与路径分析工作,一方面能够自动对程序进行插桩,分析程序结构,获取需要覆盖的路径信息,另一方面还能够自动分析测试用例覆盖的路径并为路径覆盖算法提供评估函数等重要信息,显著提升路径覆盖测试用例生成的效率。
附图说明
图1为本发明实施例中单元测试代码结构自动解析与路径分析方法流程图。
图2为本发明实施例中路径集合与流程图可视化结果示意图。
具体实施方式
以下结合附图和实施例对本发明的实施方式作进一步说明,但本发明的实施不限于此。
实施例:
本实施例中,以一段Java示例代码为例(其中样例代码Single类的test为待测试函数):
依赖的类为Computer,代码如下:
单元测试代码结构自动解析与路径分析方法,如图1所示,包括以下步骤:
S1、根据测试程序的语言,使用对应语言的编译器获取编译后的字节码;
S2、遍历编译后的字节码,在重要语句前分别做插桩代码,同时获取结点信息与小段路径集合;
对编译后的字节码进行遍历,在遍历过程中,需要插桩的结点包括函数开头、函数结尾、一般执行语句段、分支语句、循环语句以及函数或类的嵌套语句;
当搜索到对应结点时,使用预设的类插入函数Data.add(temp)实现该结点的插桩,其中temp代表结点信息与结点编码的字符串,Data为路径信息存储的类;在对路径每个结点编码过程中,设置一个全局变量N,其初始值设为0,每次遍历到特定结点时就将其编码赋值为N,之后通过N=N+1更新值;
在遍历到函数开头、函数结尾以及分支循环语句时使用插桩语句对字节码进行插桩,将相对应的节点信息插入到相应位置;
分支循环语句包括if、switch、for和while。
在遍历编译后的字节码的同时进行预处理,获取插桩的结点编码以及分支语句、循环语句、函数嵌套中出现的约束表达式信息,同时对其中的变量信息进行回溯,找出原始的输入变量表达式,方便后续分析路径可行性。
每当遍历到插桩的结点将进行存储,并按照遍历顺序组成两两结点之间的小段路径,其中包括函数嵌套、类的嵌套的结点使用函数调用标签invoke标记代替该小段路径,方便后续进行替换。
本实施例中,利用asm库对编译后的待测试代码进行遍历,实现对代码的插桩与小段路径集的获取,插桩后代码如下:
其中com/moi/test/sample/Single.init:START为节点信息表达式,com/moi/test/sample为类的包名,Single对应类名,init对应该节点所在函数名,“:”后为节点的标签,START代表函数的起始位置,END代表函数的结束位置,!L1502635287表示字节码中对应的LABEL的值,具体值由字节码决定。
S3、分析步骤S2中获取的小段路径集合,对其中包括嵌套的部分进行替换,得到不包括嵌套的小段路径集合;
在步骤S2中获取的两两结点组成的小段路径集合的基础上,遍历小段路径集,找到路径集中带有函数调用标签标记的路径,通过该标签获取对应的函数的路径集合,使用该函数路径集中的路径替换原路径集中的带有函数调用标签标记的路径,形成没有函数嵌套或类的嵌套的小段路径集合。
本实施例中,可以获取(var2==1)为该分支进入第一个if分支的条件,而进入else分支的条件则是(var2!=1)。
本实施例中,在使用asm库对待测试代码进行遍历插桩时,会依据源码逻辑获取待测试函数中由两两节点组成的小段路径集如下:(以Single类中的test函数作为待测试函数)
Single.test:START:L747->Computer.init:#INVOKE#:I748
Computer.init:#INVOKE#:I748->Single.test:L292917034:L749
Computer.init:#INVOKE#:I748->Single.test:!L292917034:L750
Single.test:!L292917034:L750->Single.test:L292917034:L749
Single.test:L292917034:L749->Single.test:L242355057:L751
Single.test:L242355057:L751->Single.test:L455538610:L752
Single.test:L242355057:L751->Single.test:!L455538610:L753
Single.test:!L455538610:L753->Computer.div:#INVOKE#:I754
Computer.div:#INVOKE#:I754->Single.test:L242355057:L751
Single.test:L455538610:L752->Computer.sub:#INVOKE#:I755
Computer.sub:#INVOKE#:I755->Single.test:END:L758从上文中的路径集中可见部分路径带有#INVOKE#标签,如:
Single.test:L455538610:L752->Computer.sub:#INVOKE#:I755
Computer.sub:#INVOKE#:I755->Single.test:END:L758
其中路径1的左半部分代表待测试函数Single.test的节点,而右半部分带有#INVOKE#标签的Computer.sub则是Single.test中所调用的外部函数,因此首先获取被调用函数的小段路径集:
Computer.sub:START:L849->Computer.sub:END:L850
获取到被调用函数的小段路径集后,将原函数路径集中位于右端的INVOKE标签替换为被调用函数的起始标签START,将原函数路径集中位于左端的INVOKE标签替换为被调用函数的结束标签END:
Single.test:L455538610:L752->Computer.sub:START:L849
Computer.sub:END:L850->Single.test:END:L758并将被调用函数的路径集整合入待测试函数的路径集中,从而获得无函数嵌套的路径集。
S4、以步骤S3中得到的不包括嵌套的小段路径集合为基础,初始化结点之间的路径表格,并利用深度优先DFS算法更新路径表格,并依据路径表格得到路径集合;
利用步骤S3中获取的不包括嵌套的小段路径集合的集合信息初始化结点之间的路径表格M,路径表格M的行数与列数均为结点个数;
所述路径表格M表示的是路径节点之间的邻接关系,每列每行代表节点之间是否存在路径,其中最左列代表路径起点的节点,最上行代表路径终点的节点,对于一个单元格来说,若该单元格所在行所对应的节点存在一条路径能到达该单元格所在列所对应的节点,则该单元格的值置为1,否则为0。
之后利用深度优先算法DFS,以函数的起始节点为路径起点,对路径表格M根据节点之间的邻接关系进行深度优先遍历,遍历过程中记录所遍历到的节点,当遍历到该函数的终止节点时,当前遍历结束,取出记录到的当前遍历所经过的节点并记为一条完整路径,之后重新进行遍历,按照相同方法生成其他所有完整路径。
本实施例中,通过去除嵌套的路径集可以得到一个路径表格,对此先做结点信息映射表,如表1所示。
表1结点信息映射表
Single.test:START:L747 | L0 |
Computer.init:START:L701 | L1 |
Computer.init:END:L702 | L2 |
Single.test:!L292917034:L750 | L3 |
Single.test:L292917034:L749 | L4 |
Single.test:L242355057:L751 | L5 |
Single.test:!L455538610:L753 | L6 |
Single.test:L455538610:L752 | L7 |
Computer.div:START:L707 | L8 |
Computer.div:END:L710 | L9 |
Computer.sub:START:L705 | L10 |
Computer.sub:END:L706 | L11 |
Single.test:END:L758 | L12 |
通过结点信息映射表,可做出对应的路径表格,如表2所示,若存在路径Lx->Ly,则令【Lx,Ly】的值为1。
表2路径表格
经过算法计算后,可得路径如下:
Single.test:START:L819->Computer.init:START:L773->Computer.init:END:L774->Single.test:L394721749:L821->Single.test:L1884122755:L823->Single.test:L1134612201:L825->Single.test:L246550802:L826->Computer.sub:START:L777->Computer.sub:END:L778->Single.test:END:L830->
Single.test:START:L819->Computer.init:START:L773->Computer.init:END:L774->Single.test:L394721749:L821->Single.test:!L1884122755:L824->Single.test:L1884122755:L823->Single.test:L1134612201:L825->Single.test:L246550802:L826->Computer.sub:START:L777->Computer.sub:END:L778->Single.test:END:L830->…(共可得28条路径,内容省略)
S5、若所有路径集合都被覆盖即所有路径集合都已更新,跳至步骤S6,否则跳至步骤S4;
由于存在循环语句,可能导致单元程序的路径数量暴增,无法确定最终需要覆盖的路径数量,采用K-loop的循环路径判断方法,即默认所有循环的最大循环次数为K次,判定需要覆盖的路径集合,例如:
While(a<10)
{print(“a”);}
假设K=2,1表示进入循环,0表示未进入循序,那么该路径片段就存在00,01,10,11四种可能;同时利用符号执行技术,分析路径的约束表达式,从而判定路径的可行性,去除不可行路径,例如类似(a==0&&a==1)这种会导致约束表达式无解的路径,优化得到最终需要覆盖的单元程序路径集合。
本实施例中,分析上述各个路径的约束表达式,对于约束表达式不可求解的路径予以剔除,同时使用K-loop的循环路径判断方法,缓解循环语句产生大量路径的情况。如下所示:
其中Single.test:!L394721749与Single.test:!L1884122755不可能出现在同一路径中,但在上述路径列表中却有路径同时涵盖了这两个点,如路径28中的如下片段:
Single.test:!L394721749:L822->Single.test:L394721749:L821->Single.test:!L1884122755:L824->Single.test:L1884122755:L823
因此路径28不符合代码逻辑,应剔除。
S6、输出获取的路经集合与分析得到的程序流程图CFG;
在通过步骤S4和步骤S5获取所有路径编码信息后,将通过对路径结点信息的统计分析,构建结点的树形结构图,从而得到测试单元程序的完整流程图,具体如下:
首先,将找出每个结点前出现次数最多的前置结点,在流程图(树)中将此结点的前置结点作为此结点的父节点;按照此规律,由起始节点开始,遍历所有未放置过的结点,构建树形结构,从而获取流程图信息,如图2所示。
从实施例的结果上看,本发明可以找出被测试程序的路径集合,并生成对应的流程图,将结果可视化处理。
Claims (10)
1.单元测试代码结构自动解析与路径分析方法,其特征在于,包括以下步骤:
S1、根据测试程序的语言,使用对应语言的编译器获取编译后的字节码;
S2、遍历编译后的字节码,在重要语句前分别做插桩代码,同时获取结点信息与小段路径集合;
S3、分析步骤S2中获取的小段路径集合,对其中包括嵌套的部分进行替换,得到不包括嵌套的小段路径集合;
S4、以步骤S3中得到的不包括嵌套的小段路径集合为基础,初始化结点之间的路径表格,并利用深度优先DFS算法更新路径表格,并依据路径表格得到路径集合;
S5、若所有路径集合都被覆盖即所有路径集合都已更新,跳至步骤S6,否则跳至步骤S4;
S6、在通过步骤S4和步骤S5获取所有路径编码信息后,将通过对路径结点信息的统计分析,构建结点的树形结构图,即测试单元程序的流程图。
2.根据权利要求1所述的单元测试代码结构自动解析与路径分析方法,其特征在于,步骤S2中,对编译后的字节码进行遍历,在遍历过程中,需要插桩的结点包括函数开头、函数结尾、一般执行语句段、分支语句、循环语句以及函数或类的嵌套语句。
3.根据权利要求2所述的单元测试代码结构自动解析与路径分析方法,其特征在于,当搜索到对应结点时,使用预设的类插入函数Data.add(temp)实现该结点的插桩,其中temp代表结点信息与结点编码的字符串,Data为路径信息存储的类;在对路径每个结点编码过程中,设置一个全局变量N,其初始值设为0,每次遍历到特定结点时就将其编码赋值为N,之后通过N=N+1更新值;
在遍历到函数开头、函数结尾以及分支循环语句时使用插桩语句对字节码进行插桩,将相对应的节点信息插入到相应位置;
分支循环语句包括if、switch、for和while。
4.根据权利要求3所述的单元测试代码结构自动解析与路径分析方法,其特征在于:步骤S2中,在遍历编译后的字节码的同时进行预处理,获取插桩的结点编码以及分支语句、循环语句、函数嵌套中出现的约束表达式信息,同时对其中的变量信息进行回溯,找出原始的输入变量表达式,方便后续分析路径可行性。
5.根据权利要求4所述的单元测试代码结构自动解析与路径分析方法,其特征在于:步骤S2中,每当遍历到插桩的结点将进行存储,并按照遍历顺序组成两两结点之间的小段路径,其中包括函数嵌套、类的嵌套的结点使用函数调用标签标记代替该小段路径,方便后续进行替换。
6.根据权利要求5所述的单元测试代码结构自动解析与路径分析方法,其特征在于:步骤S3中,在步骤S2中获取的两两结点组成的小段路径集合的基础上,遍历小段路径集,找到路径集中带有函数调用标签标记的路径,通过该标签获取对应的函数的路径集合,使用对应的函数的路径集合中的路径替换原路径集中的带有函数调用标签标记的路径,形成没有函数嵌套或类的嵌套的小段路径集合。
7.根据权利要求6所述的单元测试代码结构自动解析与路径分析方法,其特征在于:步骤S4中,利用步骤S3中获取的不包括嵌套的小段路径集合的集合信息初始化结点之间的路径表格M,路径表格M的行数与列数均为结点个数;之后利用深度优先算法DFS,以函数的起始节点为路径起点,对路径表格M根据节点之间的邻接关系进行深度优先遍历,遍历过程中记录所遍历到的节点,当遍历到该函数的终止节点时,当前遍历结束,取出记录到的当前遍历所经过的节点并记为一条完整路径,之后重新进行遍历,按照相同方法生成其他所有完整路径。
8.根据权利要求7所述的单元测试代码结构自动解析与路径分析方法,其特征在于:所述路径表格M表示的是路径节点之间的邻接关系,每列每行代表节点之间是否存在路径,其中最左列代表路径起点的节点,最上行代表路径终点的节点,对于一个单元格来说,若该单元格所在行所对应的节点存在一条路径能到达该单元格所在列所对应的节点,则该单元格的值置为1,否则为0。
9.根据权利要求7所述的单元测试代码结构自动解析与路径分析方法,其特征在于:步骤S5中,采用K-loop的循环路径判断方法,即默认所有循环的最大循环次数为K次,判定需要覆盖的路径集合;同时利用符号执行技术,分析路径的约束表达式,从而判定路径的可行性,去除不可行路径,优化得到最终需要覆盖的单元程序路径集合。
10.根据权利要求1~9任一项所述的单元测试代码结构自动解析与路径分析方法,其特征在于:步骤S6中,在通过步骤S4和步骤S5获取所有路径编码信息后,将通过对路径结点信息的统计分析,构建结点的树形结构图,即测试单元程序的流程图,具体如下:
首先,将找出每个结点前出现次数最多的前置结点,在流程图中将此结点的前置结点作为此结点的父节点;按照此规律,由起始节点开始,遍历所有未放置过的结点,构建树形结构,从而获取流程图信息。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011267313.5A CN112380120B (zh) | 2020-11-13 | 2020-11-13 | 单元测试代码结构自动解析与路径分析方法 |
US18/013,557 US20230185703A1 (en) | 2020-11-13 | 2021-10-28 | Automatic parsing and path analysis method for unit test code structure |
PCT/CN2021/127039 WO2022100447A1 (zh) | 2020-11-13 | 2021-10-28 | 单元测试代码结构自动解析与路径分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011267313.5A CN112380120B (zh) | 2020-11-13 | 2020-11-13 | 单元测试代码结构自动解析与路径分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112380120A CN112380120A (zh) | 2021-02-19 |
CN112380120B true CN112380120B (zh) | 2022-06-10 |
Family
ID=74583804
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011267313.5A Active CN112380120B (zh) | 2020-11-13 | 2020-11-13 | 单元测试代码结构自动解析与路径分析方法 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20230185703A1 (zh) |
CN (1) | CN112380120B (zh) |
WO (1) | WO2022100447A1 (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112380120B (zh) * | 2020-11-13 | 2022-06-10 | 华南理工大学 | 单元测试代码结构自动解析与路径分析方法 |
CN115033612B (zh) * | 2022-07-06 | 2024-06-14 | 中煤(西安)地下空间科技发展有限公司 | 一种基于postgresql实现的地下管网纵断面分析方法 |
CN115080448B (zh) * | 2022-07-27 | 2023-03-17 | 北京航空航天大学 | 一种软件代码不可达路径自动检测的方法和装置 |
CN117520191B (zh) * | 2023-11-27 | 2024-06-21 | 浙江大学 | 一种基于程序路径的测试完备性检查方法、设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107196858A (zh) * | 2017-07-04 | 2017-09-22 | 西安理工大学 | 一种考虑多类型约束的k最短路径求解方法 |
CN110046089A (zh) * | 2019-03-01 | 2019-07-23 | 华南师范大学 | 一种基于路径覆盖充分性准则的智能合约测试方法 |
CN110837892A (zh) * | 2019-11-12 | 2020-02-25 | 广东外语外贸大学 | 基于带类型关系路径嵌入的事实溯因推理方法 |
Family Cites Families (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103714000A (zh) * | 2013-12-18 | 2014-04-09 | 杭州电子科技大学 | 一种面向敏感区域的嵌入式软件测试用例生成方法 |
US20170220455A1 (en) * | 2016-01-29 | 2017-08-03 | Mentor Graphics Corporation | Test case generation using a constraint graph solver |
US10360004B2 (en) * | 2017-02-27 | 2019-07-23 | International Business Machines Corporation | Using dynamic information to refine control flow graphs |
CN110377493B (zh) * | 2018-04-12 | 2022-05-17 | 南京慕测信息科技有限公司 | 一种面向代码可读性的单元测试用例优化方法 |
CN110399286B (zh) * | 2018-04-24 | 2023-05-12 | 西安邮电大学 | 一种基于独立路径的测试数据自动生成方法 |
CN108710575B (zh) * | 2018-05-23 | 2020-11-24 | 华南理工大学 | 基于路径覆盖测试用例自动生成的单元测试方法 |
CN112380120B (zh) * | 2020-11-13 | 2022-06-10 | 华南理工大学 | 单元测试代码结构自动解析与路径分析方法 |
-
2020
- 2020-11-13 CN CN202011267313.5A patent/CN112380120B/zh active Active
-
2021
- 2021-10-28 WO PCT/CN2021/127039 patent/WO2022100447A1/zh active Application Filing
- 2021-10-28 US US18/013,557 patent/US20230185703A1/en active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107196858A (zh) * | 2017-07-04 | 2017-09-22 | 西安理工大学 | 一种考虑多类型约束的k最短路径求解方法 |
CN110046089A (zh) * | 2019-03-01 | 2019-07-23 | 华南师范大学 | 一种基于路径覆盖充分性准则的智能合约测试方法 |
CN110837892A (zh) * | 2019-11-12 | 2020-02-25 | 广东外语外贸大学 | 基于带类型关系路径嵌入的事实溯因推理方法 |
Non-Patent Citations (2)
Title |
---|
基于静态代码分析的日志加强工具的设计与实现;马炜;《中国优秀硕士学位论文全文数据库 (信息科技辑)》;20151231;全文 * |
宫大鹏 ; 王黎明 ; 夏静.基于AUML的BDI Agent软件测试用例生成算法.《计算机工程与设计》.2014, * |
Also Published As
Publication number | Publication date |
---|---|
CN112380120A (zh) | 2021-02-19 |
WO2022100447A1 (zh) | 2022-05-19 |
US20230185703A1 (en) | 2023-06-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112380120B (zh) | 单元测试代码结构自动解析与路径分析方法 | |
JP7172435B2 (ja) | 抽象コードグラフを用いたソフトウェアの表現 | |
CN110543421B (zh) | 基于测试用例自动生成算法的单元测试自动执行方法 | |
CN109426615A (zh) | 过程间的空指针解引用检测方法、系统、设备以及介质 | |
US5761408A (en) | Method and system for generating a computer program test suite using dynamic symbolic execution | |
CN107704382B (zh) | 面向Python的函数调用路径生成方法和系统 | |
US7315973B1 (en) | Method and apparatus for choosing tests for simulation and associated algorithms and hierarchical bipartite graph data structure | |
CN108763064B (zh) | 一种基于黑盒函数与机器学习的代码测试生成方法和装置 | |
CN110515826B (zh) | 一种基于次数频谱与神经网络算法的软件缺陷定位方法 | |
CN116627818A (zh) | 一种基于程序路径相似度的测试用例复用方法 | |
CN116383070B (zh) | 一种面向高mc/dc的符号执行方法 | |
CN112579440B (zh) | 一种虚拟测试依赖对象的确定方法及装置 | |
CN115422865B (zh) | 仿真方法及装置、计算设备、计算机可读存储介质 | |
Liang et al. | Improving the precision of static analysis: Symbolic execution based on GCC abstract syntax tree | |
CN112559322B (zh) | 一种基于动态插桩的软件分析方法及系统 | |
CN113157551B (zh) | 一种面向ros的差分模糊测试方法 | |
US20050055612A1 (en) | Design supporting apparatus | |
CN105204997B (zh) | 软件缺陷检测方法及装置 | |
CN110362463A (zh) | 一种自动挑选测试用例进行回归测试的方法和装置 | |
Midolo et al. | Automatic Generation of Accurate Test Templates based on JUnit Asserts | |
CN113282495A (zh) | 一种基于轨迹监控的Java软件故障定位方法 | |
CN113495826A (zh) | 一种单元测试代码的生成方法、单元测试方法和装置 | |
JPH11224211A (ja) | ソフトウェア検査支援装置 | |
CN114706759B (zh) | 一种基于部分解Caching与重用的符号执行优化方法 | |
JP2002014847A (ja) | プログラム検査装置、プログラム検査方法及び検査を行うためのプログラムを格納した記録媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |