CN108959056B - 测试用例生成方法和测试用例生成装置 - Google Patents
测试用例生成方法和测试用例生成装置 Download PDFInfo
- Publication number
- CN108959056B CN108959056B CN201710347575.4A CN201710347575A CN108959056B CN 108959056 B CN108959056 B CN 108959056B CN 201710347575 A CN201710347575 A CN 201710347575A CN 108959056 B CN108959056 B CN 108959056B
- Authority
- CN
- China
- Prior art keywords
- function
- generate
- graph
- path constraint
- combined 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
Images
Classifications
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种测试用例生成方法和测试用例生成装置。根据本发明的一个具体实例的测试用例生成方法包括:针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;检测所述用不同编程语言编写的源代码之间的连接信息;根据所述连接信息将所述关系图连接以生成连接图;遍历所述连接图以生成组合路径约束表达式;符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及对具体组合路径约束进行求解,以生成测试用例。
Description
技术领域
本发明涉及一种测试用例生成方法和测试用例生成装置。具体地,涉及一种通过构建组合路径约束来生成测试用例的方法和装置。
背景技术
符号执行是一种能够通过分析源代码来生成测试用例的方法,它通常用于单元测试以及生成单元测试用例。
然而,随着软件开发技术的进步,传统的面向单元测试的符号执行不再适用。这是因为越来越多的软件中包含了多个组件,并且这些组件可以用不同的编程语言来实现,例如Java和JavaScript被同时用于开发Cordova Android的不同组件。
另外,不同于传统软件,在这些软件的源代码中的单个函数(function)或方法(method)中并不包含太多的逻辑。相反,这些逻辑遍布于各个源文件的各个函数之中。因此,传统的测试用例生成方法不能很好地满足需要。
发明内容
在下文中给出了关于本发明的简要概述,以便提供关于本发明的某些方面的基本理解。应当理解,该概述并不是关于本发明的穷举性概述,它并非意图确定本发明的关键或重要部分,也不是意图限定本发明的范围。其目的仅仅是以简化的形式给出某些概念,以此作为后文的具体实施方式部分的铺垫。
鉴于以上提出的问题,本发明提出了一种新的生成集成测试用例的方法和装置。根据本发明的测试用例生成方法及其测试用例生成装置,相较于传统的单元测试用例,能够确保集成测试用例的正确性更为容易。
根据本发明的一个方面,提供了一种测试用例生成方法,包括:针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;检测所述用不同编程语言编写的源代码之间的连接信息;根据所述连接信息将所述关系图连接以生成连接图;遍历所述连接图以生成组合路径约束表达式;符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及对具体组合路径约束进行求解,以生成测试用例。
根据本发明的另一个方面,提供了一种测试用例生成装置,包括:关系图构建单元,被配置为针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;连接信息检测单元,被配置为检测所述用不同编程语言编写的源代码之间的连接信息;连接单元,被配置为根据所述连接信息将所述关系图连接以生成连接图;遍历单元,被配置为遍历所述连接图以生成组合路径约束表达式;符号执行单元,被配置为符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及求解单元,被配置为对具体组合路径约束进行求解,以生成测试用例。
根据本发明的再一方面,还提供了一种存储介质。所述存储介质包括机器可读的程序代码,当在信息处理系统上执行所述程序代码时,所述程序代码使得所述信息处理系统执行根据本发明的上述方法。
根据本发明的再一方面,还提供了一种程序。所述程序包括机器可执行的指令,当在信息处理系统上执行所述指令时,所述指令使得所述信息处理系统执行根据本发明的上述方法。
通过以下结合附图对本发明的最佳实施例的详细说明,本发明的这些以及其他优点将更加明显。
附图说明
参照附图来阅读本发明的各实施方式,将更容易理解本发明的其它特征和优点,在此描述的附图只是为了对本发明的实施方式进行示意性说明的目的,而非全部可能的实施,并且不旨在限制本发明的范围。在附图中:
图1示出根据本发明的一个具体实例的测试用例生成方法的流程图;
图2示出根据本发明的一个具体实例的Java源代码片段SystemExposedJsApi.java;
图3示出根据本发明的一个具体实例的Java源代码片段CordovaBridge.java;
图4示出根据本发明的一个具体实例的Java源代码片段PluginManager.java;
图5示出根据本发明的一个具体实例的对图2至图4所示的Java源代码片段进行分析所构建的函数之间的调用关系图;
图6示出根据本发明的一个具体实例的JavaScript源代码片段platform.js;
图7示出根据本发明的一个具体实例的JavaScript源代码片段exec.js;
图8示出根据本发明的一个具体实例的对图6和图7所示的JavaScript源代码片段进行分析所构建的函数之间的调用关系图;
图9示出根据本发明的一个具体实例的检测源代码之间的连接信息的方法的示意流程图;
图10示出根据本发明的一个具体实例的Cordova Android(SystemWebViewEngine.java)中的Java侧的连接代码;
图11示出根据本发明的一个具体实例的Cordova Android(nativeapiprovider.js)中的JavaScript侧的连接代码;
图12示出根据本发明的一个具体实例的将图5和图8所示的调用关系图连接之后所生成的连接图;
图13示出根据本发明的另一个具体实例的对用编程语言A编写的源代码片段进行分析所构建的函数之间的调用关系图;
图14示出根据本发明的另一个具体实例的对用编程语言B编写的源代码片段进行分析所构建的函数之间的调用关系图;
图15示出根据本发明的另一个具体实例的将图13和图14所示的调用关系图连接之后所生成的连接图;
图16示出根据本发明的一个具体实例的测试用例生成装置的方框图;以及
图17示出用于实施根据本发明实施方式的方法和系统的计算机的示意性框图。
具体实施方式
在下文中将结合附图对本发明的示范性实施例进行详细描述。为了清楚和简明起见,在说明书中并未描述实际实施方式的所有特征。然而,应该了解,在开发任何这种实际实施方式的过程中必须做出很多特定于实施方式的决定,以便实现开发人员的具体目标,例如,符合与系统及业务相关的那些限制条件,并且这些限制条件可能会随着实施方式的不同而有所改变。此外,还应该了解,虽然开发工作有可能是非常复杂和费时的,但对得益于本公开内容的本领域技术人员来说,这种开发工作仅仅是例行的任务。
在此,还需要说明的一点是,为了避免因不必要的细节而模糊了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的装置结构和/或处理步骤,而省略了与本发明关系不大的其他细节。另外,还需要指出的是,在本发明的一个附图或一种实施方式中描述的元素和特征可以与一个或更多个其它附图或实施方式中示出的元素和特征相结合。
下面将参照附图对本发明的实施方式进行详细描述。应注意,以下描述仅仅是示例性的,而并不旨在限制本发明。此外,在以下描述中,将采用相同的附图标记表示不同附图中的相同或相似的部件。在以下描述的不同实施方式中的不同特征,可彼此结合,以形成本发明范围内的其他实施方式。
如上文中所述,随着软件开发技术的进步,越来越多的软件中包含了可以用不同的编程语言来实现的多个组件,并且逻辑遍布于各个源文件的各个函数之中,因此传统的面向单元测试的符号执行不再适用。
有鉴于此,本发明提出了一种通过构建组合路径约束来生成测试用例的方法和装置。
为了生成集成测试用例,本发明构建了跨语言如Java、JavaScript等的多个函数的组合路径约束。为了构建组合路径约束,首先,对于用同一种语言编写的组件的源代码,分析函数之间的关系并构建函数调用关系图,图中节点代表函数,边代表函数之间的调用关系。为了连接两个不同语言的图,自动地从源代码中抽取出所需的连接信息。然后,通过遍历连接后的图,来生成所有可能的调用序列以及组合路径约束表达式。通过符号执行每个函数,并对组合路径约束表达式进行求解,便得到了所有可行的组合路径以及相应的组合路径约束。通过利用SMT(Satisfiability Modulo Theories)对组合路径约束进行求解,最终生成集成测试用例。
下面将结合附图对根据本发明的具体实施方式的测试用例生成方法和测试用例生成装置进行详细描述。图1示出根据本发明的一个具体实例的测试用例生成方法的流程图。
如图1所示,根据本发明的一个具体实例的测试用例生成方法在步骤S110中针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图,接着在步骤S120中检测所述用不同编程语言编写的源代码之间的连接信息,然后在步骤S130中根据所述连接信息将所述关系图连接以生成连接图。之后,在步骤S140中遍历所述连接图以生成组合路径约束表达式,并在步骤S150中符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束。最后,在步骤S160中对具体组合路径约束进行求解,以生成测试用例。
具体地,在步骤S110中,分析用不同编程语言编写的源代码中的函数之间的调用关系并为所有用同一种语言编写的组件构建一个函数调用关系图。
例如,在Cordova Android中,有一个名为JavaScript API的以JavaScript实现的组件和一个以Java实现的框架组件。因此,将会构建两个关系图,一个关系图针对用Java语言编写的源代码,另一个关系图针对用JavaScript编写的源代码。在这些图中,节点表示函数,边表示函数之间的调用关系。这些节点记录着与函数有关的信息,包括函数名称(全名:包名+类名)、函数体、函数参数、以及返回值等。边记录着与函数之间的调用关系有关的信息,包括调用的函数名称、被调用的函数名称、指向在调用函数时调用被调用函数的语句的程序计数值、以及存储在调用函数时被调用函数的返回值的变量。
作为更具体的示例,如图2至图4,分别示出了一些简单的Cordova Android(https://github.com/apache/cordova-android version:6.2.0-dev)中的Java源代码片段。
图2示出根据本发明的一个具体实例的Java源代码片段SystemExposedJsApi.java。其中,最左边的竖列中的数字例如用方框框起来的41表示行号,用方框框起来的SystemExposedJsApi表示类名,用方框框起来的exec表示函数名,而用方框框起来的jsExec则表示被调用的函数名。
图3示出根据本发明的一个具体实例的Java源代码片段CordovaBridge.java。其中,最左边的竖列中的数字例如用方框框起来的57表示行号,用方框框起来的CordovaBridge表示类名,用方框框起来的jsExec表示函数名,而用方框框起来的exec则表示被调用的函数名。
图4示出根据本发明的一个具体实例的Java源代码片段PluginManager.java。其中,最左边的竖列中的数字例如用方框框起来的122和132表示行号,用方框框起来的PluginManager表示类名,用方框框起来的exec表示函数名,而用方框框起来的execute则表示被调用的函数名。
根据图2至图4所示出的这些源代码片段,可以构建出例如如图5所示的函数调用关系图。例如,如图2所示,在SystemExposedJsApi.java中,它在exec()函数的41行(程序计数器)调用了CordovaBridge.jsExec()函数。因此,在图5中,程序计数器为41的边连接着两个节点,一个是SystemExposedJsApi.exec(),另一个则是CordovaBridge.jsExec()。类似地,程序计数器为57的边也连接着两个节点,一个是CordovaBridge.jsExec(),另一个则是PluginManager.exec()。再例如,在图4的PluginManager中在122行调用了getPlugin()函数,并且将返回值存储在变量plugin中,因此在图5中plugin被标记在边122上。类似的,wasValidAction被标注在程序计数器为132的边上。最后,得到图5所具体示出的根据本发明的一个具体实例的对图2至图4所示的Java源代码片段进行分析所构建的函数之间的调用关系图。
类似的,图6和图7分别示出了一些简单的Cordova Android中的JavaScript代码片段(https://github.com/apache/cordova-android version:6.2.0-dev)。
图6示出根据本发明的一个具体实例的JavaScript源代码片段platform.js。其中,最左边的竖列中的数字例如用方框框起来的46表示行号,用方框框起来的platform.js表示类名,用方框框起来的bootstrap表示函数名,而用方框框起来的exec则表示被调用的函数名。
图7示出根据本发明的一个具体实例的JavaScript源代码片段exec.js。其中,最左边的竖列中的数字例如用方框框起来的97表示行号,用方框框起来的exec.js表示类名,用方框框起来的androidExec表示函数名,而用方框框起来的nativeApiProvider.get().exec则表示被调用的函数名。另外,在第297行中示出的module.exports=androidExec表示将androidExec导出为exec.js。
由于在图7所示的exec.js中,函数androidExec()被导出为exec.js的模块,因此任何对于该exec.js模块的调用实际上都会转为对androidExec()的调用。所以,在图6所示的源代码的第46行,exec()将调用androidExec()。NodeJS(JavaScript)中这种模块导出机制,是该领域所公知的。基于此,可以根据图6和图7所示出的这些源代码片段,可以构建出例如如图8所具体示出的根据本发明的一个具体实例的对图6和图7所示的JavaScript源代码片段进行分析后构建的函数之间的调用关系图。
在步骤S110中针对用不同的编程语言所编写的源代码进行分析并构建相应源代码中的函数之间的调用关系图之后,在步骤S120中检测源代码之间的连接信息。
这里,根据本发明的一个具体示例,可以根据不同编程语言之间的接口注释中的预定义规则来检测所述用不同编程语言编写的源代码之间的连接信息。
连接信息被用于将不同语言所编写的组件的函数调用关系图连接起来。对于每对编程语言,有多种方式可以实现不同语言编写的组件之间的通信。例如,对于Android4.2之后的版本,可以使用@JavascriptInterface标注来实现Java程序和JavaScript程序的通信。
又比如,Java程序可以通过JNI技术利用动态链接库来实现和C++程序的通信。在实现Java和C++之间的通信时,首先,创建一个Java类,在该类中声明一个native的方法。然后,编译该类,生成一个扩展名为.h的C++头文件。接着,创建C++程序,实现该头文件中指定的函数。最后,将该C++程序编译成动态链接库,并在Java中进行调用。因此,本领域中的技术人员可以知道,通过对该Java类的native方法以及该头文件中包含的函数进行分析,便可以得到该Java程序和C++程序之间的连接信息。
以下以Java和JavaScript为例进行说明如何检测源代码之间的连接信息。对于给定的源代码,根据预设的规则,从源代码中检测连接信息。例如,对于Android中的Java和JavaScript代码,预设的规则可以是“检测语句WebView.addJavascriptInterface(arg1,arg2)”。一旦语句被检测出来,连接信息也就得到了。参数arg1是一个实现了可以被JavaScript调用的函数的Java对象,而参数arg2是JavaScript对象的名称。任何对这个JavaScript对象的函数调用,都会转为对这个Java对象的调用。所以,这两个对象扮演者连接Java代码和JavaScript代码的角色。
图9示出根据本发明的一个具体实例的检测源代码之间的连接信息的方法的示意流程图。
如图9的流程图所示,首先在步骤S910中,在Java代码中检测语句WebView.addJavascriptInterface(arg1,arg2)。图10示出根据本发明的一个具体实例的Cordova Android(SystemWebViewEngine.java)中的Java侧的连接代码。从图10中可以看出,arg1是exposedJsApi,另外,arg2是_cordovaNative。
然后在步骤S920中,在JavaScript代码中检测arg2的名称。也就是说,在JavaScript源代码中查找_cordovaNative,并且在nativeapiprovider.js中发现这个连接信息,如图11所示,示出根据本发明的一个具体实例的Cordova Android(nativeapiprovider.js)中的JavaScript侧的连接代码。
最后在步骤S930中,将从图10和11中检测到的相关内容作为连接信息,以用以下面的处理。
通过上面在步骤S120中的处理检测到源代码之间的连接信息之后,在步骤S130中根据这些检测到的连接信息,将在步骤S110中构建的函数质检的调用关系图连接,以生成连接图。
以上面图5所具体示出的对图2至图4所示的Java源代码片段进行分析所构建的函数之间的调用关系图、以及图8所具体示出的对图6和图7所示的JavaScript源代码片段进行分析后构建的函数之间的调用关系图为例,首先找出图5(Java)和图8(JavaScript)中涉及连接信息调用的部分,然后,将这两个图中执行这个调用的两个节点合并。
例如,对于Cordova Android,它找出在图5(Java)中调用exposedJsApi的节点和在图8(JavaScript)中调用_cordovaNative的节点。可以发现,节点“SystemExposedJsApi.exec()”表示调用exposedJsApi的exec(),这是因为exposeJsApi是SystemExposedJsApi的一个实例。而节点“nativeapiprovider.js.get().exec()”表示调用_cordovaNative的exec()。并且由于exposedJsApi和_cordovaNative代表着同一个对象,因此这两个节点可以合并,从而也就将这两个图连接起来了。图12示出了将图5和图8所示的调用关系图连接之后所生成的连接图。
在步骤S130中生成连接图之后,在步骤S140中遍历连接图以生成组合路径约束表达式。在此,首先遍历所述连接图以生成所有可能的调用序列,然后对于每一个可能的调用序列中的每一个函数,生成待求解的路径约束,最后将所述待求解的路径约束组合以生成组合路径约束表达式。
对于调用调用序列中随后的函数的函数,可以生成从开始执行到调用随后的函数的程序计数值的待求解的路径约束。另外,对于返回值给调用序列中调用其的前面的函数且不调用随后的函数的函数,可以生成符号执行条件约束作为待求解的路径约束。
另外,在遍历所述连接图时,可以在到达包含事先指定作为终止条件的语句的节点时,输出到此为止的路径中所包含的所有函数作为可能的调用序列。
具体地,例如可以利用深度优先遍历算法,来对连接图来进行遍历,然后返回所有可能的调用序列,以及组合路径约束表达式。在遍历之前,用户可以指定一个语句。每次遍历到包含该语句的节点时,算法就会输出当前路径作为一个调用序列。如果不指定这样的语句,那么所有遍历的路径都会输出为可能的调用序列。当访问一个节点时,如果有多条边从这个节点连接到其他节点,那么这些边中的程序计数器较小的会优先被访问。
更具体地说,例如,对于下面用编程语言A编写的函数的源代码,可以对其进行分析,从而构建如图13所示的用编程语言A编写的函数之间的调用关系图。类似地,对于下面用编程语言B编写的函数的源代码,也可以对其进行分析,从而构建如图14所示的用编程语言B编写的函数之间的调用关系图。并且,可以通过webView.addJavascriptInterface(cc,‘_nativeObject’)的连接语句分别从编程语言A和编程语言B中检测到连接信息return_nativeObject.f3(a,b)和@JavascriptInterface,从而通过这两个连接信息将图13和图14的关系图连接起来得到如图15所示的连接图。
【编程语言_A】
【编程语言_B】
在生成图15所示的连接图之后,可以通过遍历该连接图得到如下面所示的所有可能的调用序列以及组合路径约束表达式。
调用序列1:
f1→f3→f4
组合路径约束表达式1:
P(f1,7)&P(f3,5)&P(f4)
调用序列2:
f1→f3→f5
组合路径约束表达式2:
P(f1,7)&P(f3,8)&P(f5)
调用序列3:
(f1→f2)→f3→f4
组合路径约束表达式3:
P(f1,5)&S(f2,a,{a→b})&P(f3,5)&P(f4)
调用序列4:
(f1→f2)→f3→f5
组合路径约束表达式4:
P(f1,5)&S(f2,a,{a→b})&P(f3,8)&P(f5)
可以看出,一共有四个可行的执行序列,f1→f3→f4、f1→f3→f5、(f1→f2)→f3→f4、以及(f1→f2)→f3→f5。这里,由于调用f4()和f5()的条件是互斥的,因此调用序列f1→f3→f4→f5、f1→f3→f5→f4、(f1→f2)→f3→f4→f5、以及(f1→f2)→f3→f5→f4是不可行的。此外,由于f2()将返回值传给f1(),所以将(f1→f2)作为(f1→f2)→f3→f4和(f1→f2)→f3→f5的一个子序列,这意味着f3()是由f1()调用的,而非f2()。因而,调用序列f1→f2→f3→f4以及f1→f2→f3→f5也是不可行的。
下面以调用序列4为例具体描述如何从一个给定的调用序列生成组合路径约束表达式。
对调用序列中的每个函数,都会生成一个单元路径条件表达式。单元路径条件表达式是相对于组合路径约束表达式而言的。例如,对于调用序列4中的f1(),会生成P(f1,5),因为f1()在第5行调用了f2()。对于f3(),会生成P(f3,8),因为f3()在第8行调用了f5()。对于f5(),因为它没有调用任何函数,所以会生成P(f5)。在这个例子中,P(f1,5)表示从f1()的第1行执行到第5行的路径条件,P(f3,8)表示f3()从第1行执行到第8行的路径条件,P(f5)表示从f5()的第1行执行到最后一行的路径条件。特别地,对于调用序列4中的f2(),由于它将返回值传回给了f1()的一个变量,并且在它的执行过程中不会调用任何函数,所以会生成符号执行条件:S(f2,a,{a→b})。这个符号执行条件表示通过将变量a的值设置f2()的参数b的值,然后执行f2(),并将返回值传回给变量a。从而,最终得到了组合路径约束表达式4:P(f1,5)&S(f2,a,{a→b})&P(f3,8)&P(f5)。
类似地,对上面的调用序列1、2和3分别进行分析,可以得到组合路径约束表达式1:P(f1,7)&P(f3,5)&P(f4)、组合路径约束表达式2:P(f1,7)&P(f3,8)&P(f5)、以及组合路径约束表达式3:P(f1,5)&S(f2,a,{a→b})&P(f3,5)&P(f4)。
通过上述处理在步骤S140中遍历连接图并生成组合路径约束表达式之后,在步骤S150中,符号执行所述源代码中的每一个函数,从而根据所述组合路径约束表达式生成具体组合路径约束。在此,首先符号执行所述源代码中的每一个函数,以生成所述组合路径约束表达式中的每一个约束路径的具体值。然后,通过将所述组合路径约束表达式中的每一个约束路径用所生成的相应具体值替换,生成具体组合路径约束。
具体地,在步骤S150中将执行每个函数,根据结果将每个单元路径条件表达式替换为具体的路径约束的具体值,然后得到组合路径约束。
例如,对于上面所述的组合路径约束表达式,存在以下单元路径条件表达式:P(f1,7)、P(f1,5)、P(f3,5)、P(f3,8)、P(f4)、P(f5)、以及S(f2,a,{a→b})。
在符号执行完每个函数之后,可以分别得到以下具体的路径约束的具体值:P(f1,7)=true、P(f1,5)=(a>10)、P(f3,5)=(a+b<10)、P(f3,8)=(a+b>=10)、P(f4)=true、P(f5)=true、以及S(f2,a,{a→b})=(a=a-10)。
然后,将具体的路径约束的具体值代入到上面的组合路径约束表达式中相应的单元路径条件表达式中,则可以得到以下4个组合路径约束。
组合路径约束1:
true&(a+b<10)&true
=(a+b<10)
组合路径约束2:
true&(a+b>=10)&true
=(a+b>=10)
组合路径约束3:
(a>10)&(a=a-10)&(a+b<10)&true
=(a>10)&(a-10+b<10)
=(a>10)&(a+b<20)
组合路径约束4:
(a>10)&(a=a-10)&(a+b>=10)&true
=(a>10)&(a-10+b>=10)
在步骤S150中通过符号执行所述源代码中的每一个函数,从而根据所述组合路径约束表达式生成具体组合路径约束之后,在步骤S160中,对所生成的具体组合路径约束进行求解,从而最终生成测试用例。
具体地,可以利用SMT求解器对组合路径约束进行求解。对于上面的4个组合路径约束进行求解后,例如可以得到以下测试用例。
测试用例1:
a=1,b=2
测试用例2:
a=5,b=6
测试用例3:
a=100,b=-95
测试用例4:
a=100,b=1
以上参照附图描述了根据本发明的具体实例的测试用例生成方法,下面将结合附图描述根据本发明的具体实例的测试用例生成装置。图16示出了根据本发明的一个具体实例的测试用例生成装置的方框图。
如图16所示,根据本发明的该具体实例的测试用例生成装置1600包括关系图构建单元1610、连接信息检测单元1620、连接单元1630、遍历单元1640、符号执行单元1650、以及求解单元1660。
首先,关系图构建单元1610针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图。接着,连接信息检测单元1620检测所述用不同编程语言编写的源代码之间的连接信息。之后,连接单元1630根据连接信息检测单元1620所检测的连接信息将关系图构建单元1610所构建的关系图连接,从而生成连接图。接下来,遍历单元1640遍历连接单元1630所生成的连接图,以生成组合路径约束表达式。
之后,符号执行单元1650符号执行所述源代码中的每一个函数,以根据遍历单元1640所生成的组合路径约束表达式生成具体组合路径约束。最后,求解单元1660对符号执行单元1650所生成的具体组合路径约束进行求解,以生成测试用例。
在根据本发明的一个具体实例中,关系图构建单元1610通过分析源代码中的函数之间的调用关系来构建所述关系图。在所生成的关系图中,节点表示与函数有关的信息,边表示与函数之间的调用关系有关的信息。具体地,在所述节点中记录函数名称、函数体、函数参数、以及函数返回值,在所述边中记录调用函数名称、被调用函数名称、指向在调用函数时调用被调用函数的语句的程序计数值、以及存储在调用函数时被调用函数的返回值的变量。
另外,在根据本发明的一个具体实例中,连接信息检测单元1620可以根据所述不同编程语言之间的接口注释中的预定义规则来检测所述用不同编程语言编写的源代码之间的连接信息。
这里,所述编程语言可以为Java和JavaScript,所述接口注释可以为@JavascriptInterface注释。
此外,在根据本发明的一个具体实例中,连接单元1630在所述关系图中分别查找所述连接信息中所包含的函数调用,并且将所述关系图中执行所查找到的函数调用的节点合并以生成连接图。
另外,在根据本发明的一个具体实例中,遍历单元1640首先遍历所述连接图以生成所有可能的调用序列,之后对于每一个可能的调用序列中的每一个函数,生成待求解的路径约束,最后将所述待求解的路径约束组合以生成组合路径约束表达式。具体地,遍历单元1640对于调用调用序列中随后的函数的函数,生成从开始执行到调用随后的函数的程序计数值的待求解的路径约束。另外,遍历单元1640对于返回值给调用序列中调用其的前面的函数且不调用随后的函数的函数,生成符号执行条件约束作为待求解的路径约束。
在此,可以采用深度优先算法对所述连接图进行遍历。
另外,在根据本发明的一个具体实例中,遍历单元1640遍历所述连接图时,在到达包含事先指定作为终止条件的语句的节点时,输出到此为止的路径中所包含的所有函数作为可能的调用序列。
此外,在根据本发明的一个具体实例中,符号执行单元1650符号执行所述源代码中的每一个函数,以生成所述组合路径约束表达式中的每一个约束路径的具体值,并且将所述组合路径约束表达式中的每一个约束路径用所生成的相应具体值替换,以生成具体组合路径约束。
另外,在根据本发明的一个具体实例中,求解单元1660通过SMT求解器对符号执行单元1650所生成的具体组合路径约束进行求解,以生成测试用例。
这里需要指出的是,由于在根据该具体实例的测试用例生成装置1600所包括的关系图构建单元1610、连接信息检测单元1620、连接单元1630、遍历单元1640、符号执行单元1650、以及求解单元1660中的处理分别与参照附图1至15所描述的上述测试用例生成方法所包括的关系图构建步骤S110、连接信息检测步骤S120、连接步骤S130、遍历步骤S140、符号执行步骤S150、以及求解步骤S160中的处理相类似,因此为了简洁起见,在此省略对这些步骤的详细描述。
另外,这里尚需指出的是,上述系统中各个组成部件可以通过软件、固件、硬件或其组合的方式进行配置。配置可使用的具体手段或方式为本领域技术人员所熟知,在此不再赘述。在通过软件或固件实现的情况下,从存储介质或网络向具有专用硬件结构的计算机(例如图17所示的通用计算机)安装构成该软件的程序,该计算机在安装有各种程序时,能够执行各种功能等。
图17示出了可用于实施根据本发明实施例的方法和系统的计算机的示意性框图。
在图17中,中央处理单元(CPU)1701根据只读存储器(ROM)1702中存储的程序或从存储部分1708加载到随机存取存储器(RAM)1703的程序执行各种处理。在RAM 1703中,还根据需要存储当CPU 1701执行各种处理等等时所需的数据。CPU 1701、ROM 1702和RAM 1703经由总线1704彼此连接。输入/输出接口1705也连接到总线1704。
下述部件连接到输入/输出接口1705:输入部分1706(包括键盘、鼠标等等)、输出部分1707(包括显示器,比如阴极射线管(CRT)、液晶显示器(LCD)等,和扬声器等)、存储部分1708(包括硬盘等)、通信部分1709(包括网络接口卡比如LAN卡、调制解调器等)。通信部分1709经由网络比如因特网执行通信处理。根据需要,驱动器1710也可连接到输入/输出接口1705。可拆卸介质1711比如磁盘、光盘、磁光盘、半导体存储器等等可以根据需要被安装在驱动器1710上,使得从中读出的计算机程序根据需要被安装到存储部分1708中。
在通过软件实现上述系列处理的情况下,从网络比如因特网或存储介质比如可拆卸介质1711安装构成软件的程序。
本领域的技术人员应当理解,这种存储介质不局限于图17所示的其中存储有程序、与设备相分离地分发以向用户提供程序的可拆卸介质1711。可拆卸介质1711的例子包含磁盘(包含软盘(注册商标))、光盘(包含光盘只读存储器(CD-ROM)和数字通用盘(DVD))、磁光盘(包含迷你盘(MD)(注册商标))和半导体存储器。或者,存储介质可以是ROM 1702、存储部分1708中包含的硬盘等等,其中存有程序,并且与包含它们的设备一起被分发给用户。
本发明还提出一种存储有机器可读取的指令代码的程序产品。所述指令代码由机器读取并执行时,可执行上述根据本发明实施方式的方法。
相应地,用于承载上述存储有机器可读取的指令代码的程序产品的存储介质也包括在本发明的范围内。所述存储介质包括但不限于软盘、光盘、磁光盘、存储卡、存储棒等等。
在上面对本发明具体实施例的描述中,针对一种实施方式描述和/或示出的特征可以以相同或类似的方式在一个或更多个其它实施方式中使用,与其它实施方式中的特征相组合,或替代其它实施方式中的特征。
应该强调,术语“包括/包含”在本文使用时指特征、要素、步骤或组件的存在,但并不排除一个或更多个其它特征、要素、步骤或组件的存在或附加。
此外,应当注意,本发明的方法不限于按照说明书中描述的时间顺序来执行,也可以按照其他的次序顺序地、并行地或独立地执行。因此,本说明书中描述的方法的执行顺序不对本发明的技术范围构成限制。
以上对本发明各实施方式的描述是为了更好地理解本发明,其仅仅是示例性的,而非旨在对本发明进行限制。应注意,在以上描述中,针对一种实施方式描述和/或示出的特征可以以相同或类似的方式在一个或更多个其它实施方式中使用,与其它实施方式中的特征相组合,或替代其它实施方式中的特征。本领域技术人员可以理解,在不脱离本发明的发明构思的情况下,针对以上所描述的实施方式进行的各种变化和修改,均属于本发明的范围内。
综上,在根据本发明的实施例中,本发明提供了如下技术方案。
方案1.一种测试用例生成方法,包括:
针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;
检测所述用不同编程语言编写的源代码之间的连接信息;
根据所述连接信息将所述关系图连接以生成连接图;
遍历所述连接图以生成组合路径约束表达式;
符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及
对具体组合路径约束进行求解,以生成测试用例。
方案2.根据方案1所述的方法,其中
所述关系图通过分析源代码中的函数之间的调用关系来构建;以及
在所述关系图中,节点表示与函数有关的信息,边表示与函数之间的调用关系有关的信息。
方案3.根据方案2所述的方法,其中,在所述节点中记录函数名称、函数体、函数参数、以及函数返回值,在所述边中记录调用函数名称、被调用函数名称、指向在调用函数时调用被调用函数的语句的程序计数值、以及存储在调用函数时被调用函数的返回值的变量。
方案4.根据方案2或3所述的方法,其中,根据所述不同编程语言之间的接口注释中的预定义规则来检测所述用不同编程语言编写的源代码之间的连接信息。
方案5.根据方案4所述的方法,其中,所述编程语言为Java和JavaScript,所述接口注释为@JavascriptInterface注释。
方案6.根据方案1所述的方法,其中,根据所述连接信息将所述关系图连接以生成连接图包括:
在所述关系图中分别查找所述连接信息中所包含的函数调用;以及
将所述关系图中执行所查找到的函数调用的节点合并以生成连接图。
方案7.根据方案1所述的方法,其中,遍历所述连接图以生成组合路径约束表达式包括:
遍历所述连接图以生成所有可能的调用序列;
对于每一个可能的调用序列中的每一个函数,生成待求解的路径约束;以及
将所述待求解的路径约束组合以生成组合路径约束表达式。
方案8.根据方案7所述的方法,其中
对于调用调用序列中随后的函数的函数,生成从开始执行到调用随后的函数的程序计数值的待求解的路径约束;以及
对于返回值给调用序列中调用其的前面的函数且不调用随后的函数的函数,生成符号执行条件约束作为待求解的路径约束。
方案9.根据方案7所述的方法,其中遍历所述连接图时,在到达包含事先指定作为终止条件的语句的节点时,输出到此为止的路径中所包含的所有函数作为可能的调用序列。
方案10.根据方案1所述的方法,其中符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束包括:
符号执行所述源代码中的每一个函数,以生成所述组合路径约束表达式中的每一个约束路径的具体值;以及
将所述组合路径约束表达式中的每一个约束路径用所生成的相应具体值替换,以生成具体组合路径约束。
方案11.一种测试用例生成装置,包括:
关系图构建单元,被配置为针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;
连接信息检测单元,被配置为检测所述用不同编程语言编写的源代码之间的连接信息;
连接单元,被配置为根据所述连接信息将所述关系图连接以生成连接图;
遍历单元,被配置为遍历所述连接图以生成组合路径约束表达式;
符号执行单元,被配置为符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及
求解单元,被配置为对具体组合路径约束进行求解,以生成测试用例。
方案12.根据方案11所述的装置,其中
所述关系图构建单元通过分析源代码中的函数之间的调用关系来构建所述关系图;以及
在所述关系图中,节点表示与函数有关的信息,边表示与函数之间的调用关系有关的信息。
方案13.根据方案12所述的装置,其中,在所述节点中记录函数名称、函数体、函数参数、以及函数返回值,在所述边中记录调用函数名称、被调用函数名称、指向在调用函数时调用被调用函数的语句的程序计数值、以及存储在调用函数时被调用函数的返回值的变量。
方案14.根据方案12或13所述的装置,其中,所述连接信息检测单元根据所述不同编程语言之间的接口注释中的预定义规则来检测所述用不同编程语言编写的源代码之间的连接信息。
方案15.根据方案14所述的装置,其中,所述编程语言为Java和JavaScript,所述接口注释为@JavascriptInterface注释。
方案16.根据方案11所述的装置,其中,所述连接单元
在所述关系图中分别查找所述连接信息中所包含的函数调用;以及
将所述关系图中执行所查找到的函数调用的节点合并以生成连接图。
方案17.根据方案11所述的装置,其中,所述遍历单元
遍历所述连接图以生成所有可能的调用序列;
对于每一个可能的调用序列中的每一个函数,生成待求解的路径约束;以及
将所述待求解的路径约束组合以生成组合路径约束表达式。
方案18.根据方案17所述的装置,其中所述遍历单元
对于调用调用序列中随后的函数的函数,生成从开始执行到调用随后的函数的程序计数值的待求解的路径约束;以及
对于返回值给调用序列中调用其的前面的函数且不调用随后的函数的函数,生成符号执行条件约束作为待求解的路径约束。
方案19.根据方案17所述的装置,其中所述遍历单元遍历所述连接图时,在到达包含事先指定作为终止条件的语句的节点时,输出到此为止的路径中所包含的所有函数作为可能的调用序列。
方案20.根据方案11所述的装置,其中所述符号执行单元
符号执行所述源代码中的每一个函数,以生成所述组合路径约束表达式中的每一个约束路径的具体值;以及
将所述组合路径约束表达式中的每一个约束路径用所生成的相应具体值替换,以生成具体组合路径约束。
Claims (10)
1.一种测试用例生成方法,包括:
针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;
检测所述用不同编程语言编写的源代码之间的连接信息,所述连接信息包括在所述用不同编程语言编写的源代码之间进行通信的信息;
根据所述连接信息将所述关系图连接以生成连接图;
遍历所述连接图以生成组合路径约束表达式;
符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及
对具体组合路径约束进行求解,以生成测试用例。
2.根据权利要求1所述的方法,其中
所述关系图通过分析源代码中的函数之间的调用关系来构建;以及
在所述关系图中,节点表示与函数有关的信息,边表示与函数之间的调用关系有关的信息。
3.根据权利要求2所述的方法,其中,在所述节点中记录函数名称、函数体、函数参数、以及函数返回值,在所述边中记录调用函数名称、被调用函数名称、指向在调用函数时调用被调用函数的语句的程序计数值、以及存储在调用函数时被调用函数的返回值的变量。
4.根据权利要求2或3所述的方法,其中,根据所述不同编程语言之间的接口注释中的预定义规则来检测所述用不同编程语言编写的源代码之间的连接信息。
5.根据权利要求1所述的方法,其中,根据所述连接信息将所述关系图连接以生成连接图包括:
在所述关系图中分别查找所述连接信息中所包含的函数调用;以及
将所述关系图中执行所查找到的函数调用的节点合并以生成连接图。
6.根据权利要求1所述的方法,其中,遍历所述连接图以生成组合路径约束表达式包括:
遍历所述连接图以生成所有可能的调用序列;
对于每一个可能的调用序列中的每一个函数,生成待求解的路径约束;以及
将所述待求解的路径约束组合以生成组合路径约束表达式。
7.根据权利要求6所述的方法,其中
对于调用调用序列中随后的函数的函数,生成从开始执行到调用随后的函数的程序计数值的待求解的路径约束;以及
对于返回值给调用序列中调用其的前面的函数且不调用随后的函数的函数,生成符号执行条件约束作为待求解的路径约束。
8.根据权利要求6所述的方法,其中遍历所述连接图时,在到达包含事先指定作为终止条件的语句的节点时,输出到此为止的路径中所包含的所有函数作为可能的调用序列。
9.根据权利要求1所述的方法,其中符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束包括:
符号执行所述源代码中的每一个函数,以生成所述组合路径约束表达式中的每一个约束路径的具体值;以及
将所述组合路径约束表达式中的每一个约束路径用所生成的相应具体值替换,以生成具体组合路径约束。
10.一种测试用例生成装置,包括:
关系图构建单元,被配置为针对用不同编程语言编写的源代码,分别构建相应源代码中的函数之间的关系图;
连接信息检测单元,被配置为检测所述用不同编程语言编写的源代码之间的连接信息,所述连接信息包括在所述用不同编程语言编写的源代码之间进行通信的信息;
连接单元,被配置为根据所述连接信息将所述关系图连接以生成连接图;
遍历单元,被配置为遍历所述连接图以生成组合路径约束表达式;
符号执行单元,被配置为符号执行所述源代码中的每一个函数,以根据所述组合路径约束表达式生成具体组合路径约束;以及
求解单元,被配置为对具体组合路径约束进行求解,以生成测试用例。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710347575.4A CN108959056B (zh) | 2017-05-17 | 2017-05-17 | 测试用例生成方法和测试用例生成装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710347575.4A CN108959056B (zh) | 2017-05-17 | 2017-05-17 | 测试用例生成方法和测试用例生成装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108959056A CN108959056A (zh) | 2018-12-07 |
CN108959056B true CN108959056B (zh) | 2021-11-16 |
Family
ID=64462627
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710347575.4A Active CN108959056B (zh) | 2017-05-17 | 2017-05-17 | 测试用例生成方法和测试用例生成装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108959056B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111831532A (zh) * | 2019-04-15 | 2020-10-27 | 富士通株式会社 | 构建测试场景的方法以及信息处理设备 |
CN111209210A (zh) * | 2020-01-15 | 2020-05-29 | 北京明略软件系统有限公司 | 一种生成测试用例方法、装置、电子设备及存储介质 |
CN113760754A (zh) * | 2021-08-23 | 2021-12-07 | 苏宁易购集团股份有限公司 | 基于图搜索的测试案例生成的方法、系统及存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1908892A (zh) * | 2005-08-01 | 2007-02-07 | 王彤 | 测试用例设计方法和系统 |
CN102508770A (zh) * | 2011-10-10 | 2012-06-20 | 南京大学 | 一种基于谓词自适应随机测试的测试用例集扩增方法 |
CN102708045A (zh) * | 2012-04-13 | 2012-10-03 | 电子科技大学 | 一种缓解路径爆炸的动态符号执行方法 |
CN102736979A (zh) * | 2012-06-29 | 2012-10-17 | 南京大学 | 一种基于符号执行的带反馈测试用例生成方法 |
CN103049377A (zh) * | 2012-12-14 | 2013-04-17 | 中国信息安全测评中心 | 基于路径簇规约的并行符号执行方法 |
CN110059010A (zh) * | 2019-04-12 | 2019-07-26 | 西北工业大学 | 基于动态符号执行与模糊测试的缓冲区溢出检测方法 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7797687B2 (en) * | 2005-08-04 | 2010-09-14 | Microsoft Corporation | Parameterized unit tests with behavioral purity axioms |
US8869113B2 (en) * | 2011-01-20 | 2014-10-21 | Fujitsu Limited | Software architecture for validating C++ programs using symbolic execution |
CN104063325B (zh) * | 2014-07-11 | 2016-10-26 | 电子科技大学 | 一种针对嵌入式软件的测试用例自动化生成装置及其方法 |
-
2017
- 2017-05-17 CN CN201710347575.4A patent/CN108959056B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1908892A (zh) * | 2005-08-01 | 2007-02-07 | 王彤 | 测试用例设计方法和系统 |
CN102508770A (zh) * | 2011-10-10 | 2012-06-20 | 南京大学 | 一种基于谓词自适应随机测试的测试用例集扩增方法 |
CN102708045A (zh) * | 2012-04-13 | 2012-10-03 | 电子科技大学 | 一种缓解路径爆炸的动态符号执行方法 |
CN102736979A (zh) * | 2012-06-29 | 2012-10-17 | 南京大学 | 一种基于符号执行的带反馈测试用例生成方法 |
CN103049377A (zh) * | 2012-12-14 | 2013-04-17 | 中国信息安全测评中心 | 基于路径簇规约的并行符号执行方法 |
CN110059010A (zh) * | 2019-04-12 | 2019-07-26 | 西北工业大学 | 基于动态符号执行与模糊测试的缓冲区溢出检测方法 |
Non-Patent Citations (3)
Title |
---|
基于动态符号执行的测试用例生成技术研究;董齐兴;《中国优秀硕士论文全文数据库》;20140420;全文 * |
基于接口自动机与符号执行的嵌入式软件;王博等;《计算机学报》;20151130(第11期);全文 * |
面向多语言混合编程的嵌入式测试软件设计与实现;吴康;《中国优秀硕士论文全文数据库》;20070530;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN108959056A (zh) | 2018-12-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8627290B2 (en) | Test case pattern matching | |
US8387016B2 (en) | Whitebox trace fuzzing | |
US9152731B2 (en) | Detecting a broken point in a web application automatic test case | |
US8434062B2 (en) | Enhancing source code debugging and readability using visual symbols | |
US8806452B2 (en) | Transformation of computer programs and eliminating errors | |
CN108959056B (zh) | 测试用例生成方法和测试用例生成装置 | |
US9043757B2 (en) | Identifying differences between source codes of different versions of a software when each source code is organized using incorporated files | |
JP2015043198A (ja) | 解析システム、解析方法および解析プログラム | |
JP6440895B2 (ja) | ソフトウェア分析装置及びソフトウェア分析方法 | |
CN111508562A (zh) | 流程描述性语言的可视化显示方法、装置、设备和介质 | |
CN115951890A (zh) | 一种不同前端框架间的代码转换方法及系统及装置 | |
EP2105837A2 (en) | Test script transformation analyzer with change guide engine | |
Cottrell et al. | Determining detailed structural correspondence for generalization tasks | |
Martin et al. | Make it simple-an empirical analysis of gnu make feature use in open source projects | |
CN117076338B (zh) | 基于kprobe的linux内核动态调试方法及系统 | |
RU2656580C9 (ru) | Определение порядка инициализации статических объектов | |
CN111240987B (zh) | 移植程序检测方法、装置、电子设备及计算机可读存储介质 | |
Barabanova et al. | Modeling and Investigating a Race Condition Detection Algorithm for Multithread Computational Systems | |
JP6748357B2 (ja) | 解析装置、解析プログラムおよび解析方法 | |
Ribeiro et al. | A mechanized textbook proof of a type unification algorithm | |
Silva et al. | The effect of automatic concern mapping strategies on conceptual cohesion measurement | |
Kuramoto et al. | RefactorHub: A Commit Annotator for Refactoring | |
Bhowmik | Refactoring an existing code base to improve modularity and quality | |
Martignano | Bounded model checking and abstract interpretation of large C codebases | |
Troost | A testing tool visualizing and ensuring data-flow coverage |
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 |