CN115437906A - 测试方法和装置 - Google Patents
测试方法和装置 Download PDFInfo
- Publication number
- CN115437906A CN115437906A CN202110616349.8A CN202110616349A CN115437906A CN 115437906 A CN115437906 A CN 115437906A CN 202110616349 A CN202110616349 A CN 202110616349A CN 115437906 A CN115437906 A CN 115437906A
- Authority
- CN
- China
- Prior art keywords
- test
- expression
- value
- dynamic
- calculation
- 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
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/3688—Test management for test execution, e.g. scheduling of test suites
-
- 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/3692—Test management for test results analysis
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
技术领域
本申请涉及计算机及通信技术领域,特别涉及一种测试方法和装置。
背景技术
随着互联网技术的日益进步,人们对应用程序的要求越来越高。在应用程序在上线之前,通常需要对应用程序中的接口进行测试,以提高应用程序运行时的流畅性和安全性。
在现有技术中,通常采用对接口的请求流量进行录制与重放的方法测试接口,但是录制的请求流量中的内容随着时间变化可能会失效,如时间戳等,从而可能导致测试失败。
发明内容
本申请旨在提供一种测试方法和装置,能够对测试接口进行动态测试,从而能够在一定程度上提高对测试接口成功测试的可能性。
根据本申请实施例的一个方面,提供了一种测试方法,包括:获取契约文件;解析所述契约文件,以确定所述契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;执行所述动态计算表达式,以确定所述测试参数及所述测试接口;基于所述测试参数测试所述测试接口,得到测试结果。
根据本申请实施例的一个方面,提供了一种测试装置,包括:获取模块,配置为获取契约文件;解析模块,配置为解析所述契约文件,以确定所述契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;执行模块,配置为执行所述动态计算表达式,以确定所述测试参数及所述测试接口;测试模块,配置为基于所述测试参数测试所述测试接口,得到测试结果。
在本申请的一个实施例中,基于前述方案,所述动态计算表达式中包含计算函数及表达式语句,所述执行模块配置为:在已知类型函数对应的动态计算类型的类型函数库中,查找与所述计算函数相匹配的动态计算类型;调用所述计算函数,对所述表达式语句执行所述动态计算类型对应的计算,以确定所述测试参数及所述测试接口。
在本申请的一个实施例中,基于前述方案,若与所述计算函数相匹配的动态计算类型为计算单条表达式的结果值,所述执行模块配置为:获取所述计算函数,并获取在所述动态计算表达式中与所述计算函数相邻的单条表达式语句;调用所述计算函数计算所述单条表达式语句的结果值,得到单条结果值;将所述计算函数以及与所述计算函数相邻的单条表达式语句作为单条待替换组合,使用所述单条结果值替换所述单条待替换组合,以确定所述测试参数及所述测试接口。
在本申请的一个实施例中,基于前述方案,若与所述计算函数相匹配的动态计算类型为计算多条表达式的结果值,所述执行模块配置为:获取所述计算函数,并获取在所述动态计算表达式中在所述计算函数之后出现的多条表达式语句;调用所述计算函数,按照所述多条表达式语句出现的顺序,计算所述多条表达式语句的结果值,得到多条结果值;将所述计算函数以及在所述计算函数之后出现的多条表达式语句作为多条待替换组合,使用所述多条结果值替换所述多条待替换组合,以确定所述测试参数及所述测试接口。
在本申请的一个实施例中,基于前述方案,所述执行模块配置为:获取所述动态计算表达式中的全局变量,并获取用于表示所述全局变量的值的字典对象;查找所述用于表示所述全局变量的值的字典对象所在的键值对,以确定所述全局变量的值;将所述全局变量及所述用于表示所述全局变量的值的字典对象,替换为所述全局变量的值,得到替换后的动态计算表达式;执行所述替换后的动态计算表达式,以确定所述测试参数及所述测试接口。
在本申请的一个实施例中,基于前述方案,所述执行模块配置为:获取所述动态计算表达式中引用的除了所述测试接口之外的外部对象地址;查找所述外部对象地址中的值,作为外部值;将所述外部对象地址替换为所述外部值,得到包含外部值的动态计算表达式;基于所述包含外部值的动态计算表达式,确定所述测试参数及所述测试接口。
在本申请的一个实施例中,基于前述方案,在将所述外部对象地址替换为所述外部值之后,所述执行模块还配置为:在所述契约文件中建立全局变量,作为存储全局变量;将所述外部值与所述外部对象地址以键值对的方式,存储到所述用于表示所述存储全局变量的值的字典对象中。
在本申请的一个实施例中,所述测试参数中包含输入参数及预期输出,基于前述方案,所述测试模块配置为:向所述测试接口中输入所述输入参数,得到所述测试接口返回的实际输出;比较所述实际输出与所述预期输出,得到比较结果;基于所述比较结果,确定所述测试结果。
在本申请的一个实施例中,所述获取模块配置为:获取测试数据;基于所述测试数据,确定所述用于表示测试接口的字段值以及所述用于表示测试参数的字段值;获取契约模板,所述契约模板中包括测试接口区及测试参数区;将所述用于表示测试接口的字段值填入所述测试接口区,并将所述用于表示测试参数的字段值填入所述测试参数区,以形成所述契约文件。
根据本申请实施例的一个方面,提供了一种计算机可读程序介质,其存储有计算机程序指令,当所述计算机程序指令被计算机执行时,使计算机执行上任一项所述的方法。
根据本申请实施例的一个方面,提供了一种电子设备,包括:处理器;存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,实现如上任一项所述的方法。
根据本申请实施例的一个方面,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各种可选实施例中提供的方法。
本申请的实施例提供的技术方案可以包括以下有益效果:
在本申请的一些实施例所提供的技术方案中,通过获取契约文件,解析契约文件,以确定契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;执行动态计算表达式,能够得到测试参数及测试接口中的动态表达式对应于执行时间点的结果,以确定对应于执行时间点的测试参数及测试接口;基于测试参数测试测试接口,得到测试结果,以对测试接口进行动态测试,能够避免使用测试接口的请求流量录制与重放时因为请求流量内容随时间变化失效而导致的测试失败,从而能够在一定程度上提高对测试接口成功测试的可能性。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本申请。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本申请的实施例,并于说明书一起用于解释本申请的原理。
图1示出了可以应用本申请实施例的技术方案的示例性***架构的示意图;
图2A示出了可以应用本申请一个实施例的技术方案的数据共享***的示意图;
图2B示出了可以应用本申请一个实施例的区块链示意图;
图2C示出了可以应用本申请一个实施例的区块链中新区块生成的示意图;
图3示意性示出了根据本申请的一个实施例的测试方法的流程图;
图4示意性示出了根据本申请的一个实施例的测试方法的流程图;
图5示意性示出了根据本申请的一个实施例的测试装置的框图;
图6是根据一示例性实施例示出的一种电子设备的硬件图。
具体实施方式
现在将参考附图更全面地描述示例实施方式。然而,示例实施方式能够以多种形式实施,且不应被理解为限于在此阐述的范例;相反,提供这些实施方式使得本申请将更加全面和完整,并将示例实施方式的构思全面地传达给本领域的技术人员。
此外,所描述的特征、结构或特性可以以任何合适的方式结合在一个或更多实施例中。在下面的描述中,提供许多具体细节从而给出对本申请的实施例的充分理解。然而,本领域技术人员将意识到,可以实践本申请的技术方案而没有特定细节中的一个或更多,或者可以采用其它的方法、组元、装置、步骤等。在其它情况下,不详细示出或描述公知方法、装置、实现或者操作以避免模糊本申请的各方面。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
图1示出了可以应用本申请实施例的技术方案的示例性***架构100的示意图。
如图1所示,***架构100可以包括客户端101、网络102和服务器103。网络102用以在客户端101和服务器103之间提供通信链路的介质。网络102可以包括各种连接类型,例如有线通信链路、无线通信链路等等,本申请在此不做限制。
应该理解,图1中的客户端101、网络102和服务器103的数目仅仅是示意性的。根据实现需要,可以具有任意数目的客户端101、网络102和服务器103。比如服务器103可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式***,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN、以及大数据和人工智能平台等基础云计算服务的云服务器。客户端101可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表等,但并不局限于此。
在本申请的一个实施例中,服务器103通过获取契约文件,解析契约文件,以确定契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;执行动态计算表达式,能够得到测试参数及测试接口中的动态表达式对应于执行时间点的结果,以确定对应于执行时间点的测试参数及测试接口;基于测试参数测试测试接口,得到测试结果,以对测试接口进行动态测试,能够避免使用测试接口的请求流量录制与重放时因为请求流量内容随时间变化失效而导致的测试失败,从而能够在一定程度上提高对测试接口成功测试的可能性。
需要说明的是,本申请实施例所提供的测试方法一般由服务器103执行,相应地,测试装置一般设置于服务器103中。但是,在本申请的其它实施例中,客户端101也可以与服务器103具有相似的功能,从而执行本申请实施例所提供的测试方法。
图2A示出了可以应用本发明实施例的技术方案的示例性数据共享***200的示意图。
参见图2A所示的数据共享***200,数据共享***200是指用于进行节点与节点之间数据共享的***。每个节点201在进行正常工作可以接收到输入信息,并基于接收到的输入信息维护该数据共享***200内的共享数据。为了保证数据共享***200内的信息互通,数据共享***200中的每个节点201之间可以存在信息连接,节点201之间可以通过上述信息连接进行信息传输。例如,当数据共享***200中的任意节点201接收到输入信息时,数据共享***200中的其他节点201便根据共识算法获取该输入信息,将该输入信息作为共享数据中的数据进行存储,使得数据共享***200中全部节点201上存储的数据均一致。
对于数据共享***200中的每个节点201,均具有与其对应的节点标识,而且数据共享***200中的每个节点201均可以存储有数据共享***200中其他节点201的节点标识,以便后续根据其他节点201的节点标识,将生成的区块广播至数据共享***200中的其他节点201。每个节点201中可维护一个如下表所示的节点标识列表,将节点名称和节点标识对应存储至该节点标识列表中。其中,节点标识可为IP(Internet Protocol,网络之间互联的协议)地址以及其他任一种能够用于标识该节点的信息,表1中仅以IP地址为例进行说明。
节点名称 | 节点标识 |
节点1 | 117.114.151.174 |
节点2 | 117.116.189.145 |
… | … |
节点N | 119.123.789.258 |
表1
图2B示出了可以应用本申请一个实施例的区块链的示意图。
数据共享***200中的每个节点均存储一条相同的区块链。区块链由多个区块组成,参见图2B,区块链由多个区块组成,创始块中包括区块头和区块主体,区块头中存储有输入信息特征值、版本号、时间戳和难度值,区块主体中存储有输入信息;创始块的下一区块以创始块为父区块,下一区块中同样包括区块头和区块主体,区块头中存储有当前区块的输入信息特征值、父区块的区块头特征值、版本号、时间戳和难度值,并以此类推,使得区块链中每个区块中存储的区块数据均与父区块中存储的区块数据存在关联,保证了区块中输入信息的安全性。
图2C示出了可以应用本申请一个实施例的区块链中新区块生成的示意图。
在生成区块链中的各个区块时,参见图2C,区块链所在的节点在接收到输入信息时,对输入信息进行校验,完成校验后,将输入信息存储至内存池中,并更新其用于记录输入信息的哈希树;之后,将更新时间戳更新为接收到输入信息的时间,并尝试不同的随机数,多次进行特征值计算,使得计算得到的特征值可以满足下述公式:
SHA256(SHA256(version+prev_hash+merkle_root+ntime+nbits+x))<TARGET
其中,SHA256为计算特征值所用的特征值算法;version(版本号)为区块链中相关区块协议的版本信息;prev_hash为当前区块的父区块的区块头特征值;merkle_root为输入信息的特征值;ntime为更新时间戳的更新时间;nbits为当前难度,在一段时间内为定值,并在超出固定时间段后再次进行确定;x为随机数;TARGET为特征值阈值,该特征值阈值可以根据nbits确定得到。
这样,当计算得到满足上述公式的随机数时,便可将信息对应存储,生成区块头和区块主体,得到当前区块。随后,区块链所在节点根据数据共享***200中其他节点201的节点标识,将新生成的区块分别发送给其所在的数据共享***200中的其他节点201,由其他节点201对新生成的区块进行校验,并在完成校验后将新生成的区块添加至其存储的区块链中。
在本申请的一个实施例中,数据共享***200中存储的输入信息可以是契约文件、测试数据、测试参数,或除了测试接口之外的外部对象等。使用区块链基础处理本申请的测试方法,能够提高测试测试接口的效率及准确性。
以下对本申请实施例的技术方案的实现细节进行详细阐述:
图3示意性示出了根据本申请的一个实施例的测试方法的流程图,该测试方法的执行主体可以是服务器,比如可以是图1中所示的服务器103。
参照图3所示,该测试方法至少包括步骤S310至步骤S340,详细介绍如下:
在步骤S310中,获取契约文件。
在本申请的一个实施例中,契约文件可以是使用领域特定语言(Domain-SpecificLanguage,DSL)编写的文件,契约文件中可以记载测试接口以及对测试接口进行测试需要的测试参数,测试参数中可以包括输入参数及预期输出等参数,在此不作限制。
在本申请的一个实施例中,契约文件可以是使用解释型语言编写的文件,如Python、Shell语言。在本申请的其他实施例中,契约文件可以是解释型语言结合数据交换型语言编写的文件,数据交换型语言可以是JSON、XML等。
在本申请的一个实施例中,可以获取测试数据;基于测试数据,确定用于表示测试接口的字段值以及用于表示测试参数的字段值;获取契约模板,契约模板中包括测试接口区及测试参数区;将用于表示测试接口的字段值填入测试接口区,并将用于表示测试参数的字段值填入测试参数区,以形成契约文件,从而自动形成契约文件,相对于人工编写测试代码测试测试接口,能够避免人工编写出现的错误,能够提高测试结果的准确性。
在本申请的一个实施例中,可以通过语义分析确定测试数据中用于表示测试接口的字段值以及用于表示测试参数的字段值,也可以通过语义分析确定契约模板中的测试接口区及测试参数区的位置。
在本申请的一个实施例中,可以将测试数据中用于表示动态测试的内容以动态表达式的形式存储在契约文件中,比如,可以识别测试数据中用于表示动态测试的表达式语句,选取动态测试内容对应的计算函数,将计算函数与用于表示动态测试的表达式语句组成动态计算表达式存储在契约文件中。
在步骤S320中,解析契约文件,以确定契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式。
在本申请的一个实施例中,解析契约文件的过程可以包括获取契约文件中用于表示测试接口的字段值以及获取契约文件中用于表示测试参数的字段值,再从用于表示测试接口的字段值中获取动态计算表达式,并从用于表示测试参数的字段值中获取动态计算表达式。动态计算表达式可以存在于用于表示测试接口的字段值中和用于表示测试参数的字段值中,动态计算表达式也可以只存在于用于表示测试接口的字段值中或只存在于用于表示测试参数的字段值中。
在本申请的一个实施例中,若动态计算表达式还存在于契约文件中用于表示其他内容的其他字段值中,则在解析契约文件时,也获取其他字段值中的动态计算表达式,以在后续执行动态计算表达式,以获取契约文件中记载的其他内容,能够更好的对测试接口进行测试。
在本申请的一个实施例中,动态计算表达式可以表示需要返回内容的动态测试,返回内容可以随着时间变化,则执行动态计算表达式得到的执行结果,能够表示对应于执行动态计算表达式的时间的返回内容,比如,动态计算表达式可以是获取当前时间戳,则执行动态计算表达值,即可实现获取当前时间戳。但是通过请求流量录制和回放,录制的请求流量中记载的时间戳是录制时的时间戳,不能实现获取当前时间戳。
在本申请的一个实施例中,可以使用契约解析器解析契约文件。
在步骤S330中,执行动态计算表达式,以确定测试参数及测试接口。
在本申请的一个实施例中,动态计算表达式中可以包含计算函数及表达式语句,可以在已知类型函数对应的动态计算类型的类型函数库中,查找与计算函数相匹配的动态计算类型;调用计算函数,对表达式语句执行动态计算类型对应的计算,以确定测试参数及测试接口。
在本申请的一个实施例中,类型函数及计算函数可以是解析型语言中内置的函数,比如,可以是比如Python里内置的eval和exec函数等Python里内置的丰富的标准库函数,可大大简化计算表达式的编写。可以将类型函数与类型函数能够执行的动态计算类型对应存储,以形成类型函数库,可以将类型函数库中与计算函数相同的类型函数对应的动态计算类型,作为与计算函数相匹配的动态计算类型。
在本申请的一个实施例中,对表达式语句执行动态计算类型对应的计算得到的计算结果,可以替换动态表达式,以得到测试参数及测试接口。
在本申请的一个实施例中,可以使用契约解析器执行动态计算表达式。
在本申请的一个实施例中,若与计算函数相匹配的动态计算类型为计算单条表达式的结果值,则可以获取计算函数,并获取在动态计算表达式中与计算函数相邻的单条表达式语句;调用计算函数计算单条表达式语句的结果值,得到单条结果值;将计算函数以及与计算函数相邻的单条表达式语句作为单条待替换组合,使用单条结果值替换单条待替换组合,以确定测试参数及测试接口。
在本申请的一个实施例中,可以将使用单条结果值替换用于表示测试参数的字段值中的单条待替换组合得到的替换结果,作为测试参数;可以将使用单条结果值替换用于表示测试接口字段值中的单条待替换组合得到的替换结果,作为测试接口。
在本申请的一个实施例中,若与计算函数相匹配的动态计算类型为计算多条表达式的结果值,则可以获取计算函数,并获取动态计算表达式中在计算函数之后出现的多条表达式语句;调用计算函数,按照多条表达式语句出现的顺序,计算多条表达式语句的结果值,得到多条结果值;将计算函数以及在计算函数之后出现的多条表达式语句作为多条待替换组合,使用多条结果值替换多条待替换组合,以确定测试参数及测试接口。
在该实施例中,多条结果值可以为多个值,多个值分别对应多条表达式语句,多条结果值可以按照其对应的多条表达式语句的顺序替换多条表达式语句。
在本申请的一个实施例中,可以将使用多条结果值替换用于表示测试参数字段值中的多条待替换组合得到的替换结果,作为测试参数;可以将使用多条结果值替换用于表示测试接口字段值中多条待替换组合得到的替换结果,作为测试接口。
在本申请的一个实施例中,可以是多条表达式语句组成一个计算过程,比如可以是返回结果与预期结果的比对过程较为复杂,最终得到一个boolean(布尔)类型的值。
在本申请的一个实施例中,提供了一种契约文件,内容如下:
在该实施例中,在契约解析器执行该契约文件时,可以识别字段值的前缀,以识别动态计算表达式的动态计算类型。比如,如果计算函数eval对应的动态计算类型是计算单条表达式的结果值,那么上述契约文件中的“#eval#int(datetime.datetime.now(),timestamp()”表示调用eval函数执行int(datetime.datetime.now(),timestamp()。
在该实施例中,如果计算函数exec对应的动态计算类型是计算多条表达式的结果值,那么上述契约文件中的“#exec#import string;all_chars=string.ascii_uppercase+string.digits;exec_result=‘’”表示调用exec函数执行import string;all_chars=string.ascii_uppercase+string.digits,计算得到的多条结果值统一规定赋值到特定环境变量里,即上文中的exec_result变量中,契约解析器执行完exec调用之后,读取该环境变量即可得到计算结果。
在该实施例中,如果契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值包括非字符串类型或者计算函数不匹配类型函数库,则表示是普通的静态字段值,无需动态计算。
在该实施例中,经过上述的解析计算,能够得到动态计算后的契约文件,内容可以如下所示:
在本申请的一个实施例中,可以获取动态计算表达式中的全局变量,并获取用于表示全局变量的值的字典对象;查找用于表示全局变量的值的字典对象所在的键值对,以确定全局变量的值;将全局变量及用于表示全局变量的值的字典对象(dict对象),替换为全局变量的值,得到替换后的动态计算表达式;执行替换后的动态计算表达式,以确定测试参数及测试接口,以实现引用键值对中存储的值,其中,键值对中存储的值可以是在执行动态计算表达式之前计算得到的。
在该实施例中,可以将契约文件中在执行动态计算表达式之前得到的执行其他表达式得到的执行结果存储在键值对(key-value)中,以实现引用已计算过的值。
在本申请的一个实施例中,若动态计算表达式中包含全局变量,则可以确定动态计算表达式对应的动态计算类型为引用已计算过的值,针对该类型,可以获取动态计算表达式中的全局变量,查找全局变量的值,将全局变量及用于表示全局变量的值的字典对象,替换为全局变量的值,得到替换后的动态计算表达式,执行替换后的动态计算表达式,以确定测试参数及测试接口。
在本申请的一个实施例中,执行替换后的动态计算表达式,可以是获取替换后的动态计算表达式中的计算函数及表达式语句,基于计算函数确定替换后的动态计算表达式对应的动态计算类型,调用计算函数对表达式语句执行替换后的动态计算表达式对应的动态计算类型的计算,以确定测试参数及测试接口,具体执行步骤可以参照上述实施例。
在本申请的一个实施例中,可以在契约解析器内模拟一个解析上下文环境parsed_context,将上述实施例中执行过动态计算的契约文件以key-value的方式存储到上下文中,即可进行引用。比如可以使用Python里的字典类型(dict类型)来表示此类上下文,parsed_context初始化是一个全局变量,其值为空的dict对象。承接上述的例子,经过解析计算之后,parsed_context的内容会变成:
在本申请的一个实施例中,可以获取动态计算表达式中引用的除了测试接口之外的外部对象地址;查找外部对象地址中的值,作为外部值;将外部对象地址替换为外部值,得到包含外部值的动态计算表达式;基于包含外部值的动态计算表达式,确定测试参数及测试接口。
在本申请的一个实施例中,可以获取包含外部值的动态计算表达式中的计算函数及表达式语句,基于计算函数确定包含外部值的动态计算表达式对应的动态计算类型,调用计算函数对表达式语句执行对应包含外部值的动态计算表达式对应的动态计算类型,以确定测试参数及测试接口,具体执行步骤可以参照上述实施例。
在本申请的一个实施例中,继续承接上述的例子,假设此时预期输出里,要求返回一个与请求数据一致的字段值,可以如下文直接引用表示:
在本申请的一个实施例中,若动态计算表达式中包含外部对象地址,则可以确定动态计算表达式对应的动态计算类型为引用外部服务的结果,针对动态计算类型为引用外部服务的结果的类型,可以获取动态计算表达式中的外部对象地址,查找外部对象地址中的值,作为外部值;将外部对象地址替换为外部值,得到包含外部值的动态计算表达式;基于包含外部值的动态计算表达式,确定测试参数及测试接口。比如,预期被测接口会产生某个副作用,需要通过查询数据库才能验证是否符合预期时,可以将数据库地址作为外部对象地址,通过动态计算表达式查询数据库。数据库可以通过数据交换语言定义其引入方式,可以在动态计算表达式中加入数据库代码的绝对路径,以查询数据库。
在本申请的一个实施例中,外部对象可以是外部接口,可以用数据交换语言来表示一个对象,比如可以是JSON里的对象类型(Object类型),此对象可以包含调用外部接口的请求地址、请求参数,契约解析器能够此类对象的解析、执行,可以得到外部接口的调用结果,契约文件的内容可以如下:
在该实施例中,可以根据具体的调用外部对象的方式来适配,如远程调用的场景下需要外部目标服务和接口ID,HTTPAPI调用的场景则需要完整的URL。解析器据此发起调用之后,将其响应结果以key-value的方式保存到上述的parsed_context中,以供其他逻辑计算所需。
在本申请的一个实施例中,在将外部对象地址替换为外部值之后,可以在契约文件中建立全局变量,作为存储全局变量,初始化时用于表示存储全局变量的值的字典对象可以设置为空;将外部值与外部对象地址以键值对的方式,存储到用于表示存储全局变量的值的字典对象中,以供契约文件中的其他数据依据外部对象地址查找键值对引用外部值。
继续参照图3,在步骤S340中,基于测试参数测试测试接口,得到测试结果。
在本申请的一个实施例中,测试参数中包含输入参数及预期输出,可以向测试接口中输入输入参数,得到测试接口返回的实际输出;比较实际输出与预期输出,得到比较结果;基于比较结果,确定测试结果。
在本申请的一个实施例中,可以是实际输出与预期输出相同或误差不超过设定误差值,则确定测试接口通过测试,否则,则确定测试接口没有通过测试。
在图3的实施例中,通过获取契约文件,解析契约文件,以确定契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;执行动态计算表达式,能够得到测试参数及测试接口中的动态表达式对应于执行时间点的结果,以确定对应于执行时间点的测试参数及测试接口;基于测试参数测试测试接口,得到测试结果,以对测试接口进行动态测试,能够避免使用测试接口的请求流量录制与重放时因为请求流量内容随时间变化失效而导致的测试失败,从而能够在一定程度上提高对测试接口成功测试的可能性。
在该实施例中,通过使用契约文件对测试接口进行契约测试,即基于接口预设的调用约束、预期行为的定义,来进行接口测试,通过执行动态表达式进行动态测试,使得契约测试具备了动态请求的能力,本申请的测试方法可应用于通用的面向网络服务接口的契约测试场景,如远程接口调用(Remote ProcedureCall)的契约测试、HTTP API的契约测试。该实施例能够适应请求内容动态变化的场景,避免不必要地反复维护静态契约内容,并且用统一的契约解析器来代替人工编写测试代码,仅需专注描述契约协议,大幅度降低了实现契约测试的成本。
在本申请的一个实施例中,可以在本技术的上层加一个管理页面封装,操作者无需直接编辑契约描述,而是在管理端可视化操作,用数据库存储替代契约文件。
图4示意性示出了根据本申请的一个实施例的测试方法的流程图,该测试方法的执行主体可以是服务器,比如可以是图1中所示的服务器103。
参照图4所示,该测试方法至少包括步骤S410至步骤S480,详细介绍如下:
在步骤S410中,测试者编写契约文件;
在步骤S420中,测试者向契约解析器发起测试;
在步骤S430中,契约解析器读取契约文件;
在步骤S440中,契约解析器解析契约文件;
在步骤S450中,契约解析器按照契约文件生成请求参数;
在步骤S460中,契约解析器向被测接口发起调用;
在步骤S470中,被测接口返回结果;
在步骤S480中,契约解析器对比预期结果,输出测试结论。
在图4的实施例中,被测接口即为上文的测试接口,通过使用契约解析器自动解析契约文件已实现对被测接口进行自动测试,能够准确方便的得到测试结论。
以下介绍本申请的装置实施例,可以用于执行本申请上述实施例中的测试方法。对于本申请装置实施例中未披露的细节,请参照本申请上述的测试方法的实施例。
图5示意性示出了根据本申请的一个实施例的测试装置的框图。
参照图5所示,根据本申请的一个实施例的测试装置500,包括获取模块501、解析模块502、执行模块503和测试模块504。
根据本申请实施例的一个方面,基于前述方案,获取模块501配置为获取契约文件;解析模块502配置为解析契约文件,以确定契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;执行模块503配置为执行动态计算表达式,以确定测试参数及测试接口;测试模块504配置为基于测试参数测试测试接口,得到测试结果。
在本申请的一个实施例中,基于前述方案,动态计算表达式中包含计算函数及表达式语句,执行模块503配置为:在已知类型函数对应的动态计算类型的类型函数库中,查找与计算函数相匹配的动态计算类型;调用计算函数,对表达式语句执行动态计算类型对应的计算,以确定测试参数及测试接口。
在本申请的一个实施例中,基于前述方案,若与计算函数相匹配的动态计算类型为计算单条表达式的结果值,执行模块503配置为:获取计算函数,并获取在动态计算表达式中与计算函数相邻的单条表达式语句;调用计算函数计算单条表达式语句的结果值,得到单条结果值;将计算函数以及与计算函数相邻的单条表达式语句作为单条待替换组合,使用单条结果值替换单条待替换组合,以确定测试参数及测试接口。
在本申请的一个实施例中,基于前述方案,若与计算函数相匹配的动态计算类型为计算多条表达式的结果值,执行模块503配置为:获取计算函数,并获取在动态计算表达式中在计算函数之后出现的多条表达式语句;调用计算函数,按照多条表达式语句出现的顺序,计算多条表达式语句的结果值,得到多条结果值;将计算函数以及在计算函数之后出现的多条表达式语句作为多条待替换组合,使用多条结果值替换多条待替换组合,以确定测试参数及测试接口。
在本申请的一个实施例中,基于前述方案,执行模块503配置为:获取动态计算表达式中的全局变量,并获取用于表示全局变量的值的字典对象;查找用于表示全局变量的值的字典对象所在的键值对,以确定全局变量的值;将全局变量及用于表示全局变量的值的字典对象,替换为全局变量的值,得到替换后的动态计算表达式;执行替换后的动态计算表达式,以确定测试参数及测试接口。
在本申请的一个实施例中,基于前述方案,执行模块503配置为:获取动态计算表达式中引用的除了测试接口之外的外部对象地址;查找外部对象地址中的值,作为外部值;将外部对象地址替换为外部值,得到包含外部值的动态计算表达式;基于包含外部值的动态计算表达式,确定测试参数及测试接口。
在本申请的一个实施例中,基于前述方案,在将外部对象地址替换为外部值之后,执行模块503还配置为:在契约文件中建立全局变量,作为存储全局变量;将外部值与外部对象地址以键值对的方式,存储到用于表示存储全局变量的值的字典对象中。
在本申请的一个实施例中,测试参数中包含输入参数及预期输出,基于前述方案,测试模块504配置为:向测试接口中输入输入参数,得到测试接口返回的实际输出;比较实际输出与预期输出,得到比较结果;基于比较结果,确定测试结果。
在本申请的一个实施例中,获取模块501配置为:获取测试数据;基于测试数据,确定用于表示测试接口的字段值以及用于表示测试参数的字段值;获取契约模板,契约模板中包括测试接口区及测试参数区;将用于表示测试接口的字段值填入测试接口区,并将用于表示测试参数的字段值填入测试参数区,以形成契约文件。
所属技术领域的技术人员能够理解,本申请的各个方面可以实现为***、方法或程序产品。因此,本申请的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“***”。
下面参照图6来描述根据本申请的这种实施方式的电子设备60。图6显示的电子设备60仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图6所示,电子设备60以通用计算设备的形式表现。电子设备60的组件可以包括但不限于:上述至少一个处理单元61、上述至少一个存储单元62、连接不同***组件(包括存储单元62和处理单元61)的总线63、显示单元64。
其中,所述存储单元存储有程序代码,所述程序代码可以被所述处理单元61执行,使得所述处理单元61执行本说明书上述“实施例方法”部分中描述的根据本申请各种示例性实施方式的步骤。
存储单元62可以包括易失性存储单元形式的可读介质,例如随机存取存储单元(RAM)621和/或高速缓存存储单元622,还可以进一步包括只读存储单元(ROM)623。
存储单元62还可以包括具有一组(至少一个)程序模块625的程序/实用工具624,这样的程序模块625包括但不限于:操作***、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
总线63可以为表示几类总线结构中的一种或多种,包括存储单元总线或者存储单元控制器、***总线、图形加速端口、处理单元或者使用多种总线结构中的任意总线结构的局域总线。
电子设备60也可以与一个或多个外部设备(例如键盘、指向设备、蓝牙设备等)通信,还可与一个或者多个使得用户能与该电子设备60交互的设备通信,和/或与使得该电子设备60能与一个或多个其它计算设备进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口65进行。并且,电子设备60还可以通过网络适配器66与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器66通过总线63与电子设备60的其它模块通信。应当明白,尽管图中未示出,可以结合电子设备60使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID***、磁带驱动器以及数据备份存储***等。
通过以上的实施方式的描述,本领域的技术人员易于理解,这里描述的示例实施方式可以通过软件实现,也可以通过软件结合必要的硬件的方式来实现。因此,根据本申请实施方式的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是CD-ROM,U盘,移动硬盘等)中或网络上,包括若干指令以使得一台计算设备(可以是个人计算机、服务器、终端装置、或者网络设备等)执行根据本申请实施方式的方法。
根据本申请一个实施例,还提供了一种计算机可读存储介质,其上存储有能够实现本说明书上述方法的程序产品。在一些可能的实施方式中,本申请的各个方面还可以实现为一种程序产品的形式,其包括程序代码,当所述程序产品在终端设备上运行时,所述程序代码用于使所述终端设备执行本说明书上述“示例性方法”部分中描述的根据本申请各种示例性实施方式的步骤。
根据本申请一个实施例,用于实现上述方法的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在终端设备,例如个人电脑上运行。然而,本申请的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行***、装置或者器件使用或者与其结合使用。
所述程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行***、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请操作的程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、C++等,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
此外,上述附图仅是根据本申请示例性实施例的方法所包括的处理的示意性说明,而不是限制目的。易于理解,上述附图所示的处理并不表明或限制这些处理的时间顺序。另外,也易于理解,这些处理可以是例如在多个模块中同步或异步执行的。
应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围执行各种修改和改变。本申请的范围仅由所附的权利要求来限制。
Claims (10)
1.一种测试方法,其特征在于,包括:
获取契约文件;
解析所述契约文件,以确定所述契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;
执行所述动态计算表达式,以确定所述测试参数及所述测试接口;
基于所述测试参数测试所述测试接口,得到测试结果。
2.根据权利要求1所述的测试方法,其特征在于,所述动态计算表达式中包含计算函数及表达式语句,所述执行所述动态计算表达式,以确定所述测试参数及所述测试接口,包括:
在已知类型函数对应的动态计算类型的类型函数库中,查找与所述计算函数相匹配的动态计算类型;
调用所述计算函数,对所述表达式语句执行所述动态计算类型对应的计算,以确定所述测试参数及所述测试接口。
3.根据权利要求2所述的测试方法,其特征在于,若与所述计算函数相匹配的动态计算类型为计算单条表达式的结果值,所述调用所述计算函数,对所述表达式语句执行所述动态计算表达式的类型对应的计算,以确定所述测试参数及所述测试接口,包括:
获取所述计算函数,并获取在所述动态计算表达式中与所述计算函数相邻的单条表达式语句;
调用所述计算函数计算所述单条表达式语句的结果值,得到单条结果值;
将所述计算函数以及与所述计算函数相邻的单条表达式语句作为单条待替换组合,使用所述单条结果值替换所述单条待替换组合,以确定所述测试参数及所述测试接口。
4.根据权利要求2所述的测试方法,其特征在于,若与所述计算函数相匹配的动态计算类型为计算多条表达式的结果值,所述调用所述计算函数,对所述表达式语句执行所述动态计算表达式的类型对应的计算,以确定所述测试参数及所述测试接口,包括:
获取所述计算函数,并获取在所述动态计算表达式中在所述计算函数之后出现的多条表达式语句;
调用所述计算函数,按照所述多条表达式语句出现的顺序,计算所述多条表达式语句的结果值,得到多条结果值;
将所述计算函数以及在所述计算函数之后出现的多条表达式语句作为多条待替换组合,
使用所述多条结果值替换所述多条待替换组合,以确定所述测试参数及所述测试接口。
5.根据权利要求1所述的测试方法,其特征在于,所述执行所述动态计算表达式,以确定所述测试参数及所述测试接口,包括:
获取所述动态计算表达式中的全局变量,并获取用于表示所述全局变量的值的字典对象;
查找所述用于表示所述全局变量的值的字典对象所在的键值对,以确定所述全局变量的值;
将所述全局变量及所述用于表示所述全局变量的值的字典对象,替换为所述全局变量的值,得到替换后的动态计算表达式;
执行所述替换后的动态计算表达式,以确定所述测试参数及所述测试接口。
6.根据权利要求1所述的测试方法,其特征在于,所述执行所述字段值中包含的动态计算表达式,以确定所述测试参数及所述测试接口,包括:
获取所述动态计算表达式中引用的除了所述测试接口之外的外部对象地址;
查找所述外部对象地址中的值,作为外部值;
将所述外部对象地址替换为所述外部值,得到包含外部值的动态计算表达式;
基于所述包含外部值的动态计算表达式,确定所述测试参数及所述测试接口。
7.根据权利要求6所述的测试方法,其特征在于,在将所述外部对象地址替换为所述外部值之后,所述方法还包括:
在所述契约文件中建立全局变量,作为存储全局变量;
将所述外部值与所述外部对象地址以键值对的方式,存储到所述用于表示所述存储全局变量的值的字典对象中。
8.根据权利要求1所述的测试方法,其特征在于,所述测试参数中包含输入参数及预期输出,所述基于所述测试参数测试所述测试接口,得到测试结果,包括:
向所述测试接口中输入所述输入参数,得到所述测试接口返回的实际输出;
比较所述实际输出与所述预期输出,得到比较结果;
基于所述比较结果,确定所述测试结果。
9.根据权利要求1所述的测试方法,其特征在于,所述获取契约文件,包括:
获取测试数据;
基于所述测试数据,确定所述用于表示测试接口的字段值以及所述用于表示测试参数的字段值;
获取契约模板,所述契约模板中包括测试接口区及测试参数区;
将所述用于表示测试接口的字段值填入所述测试接口区,并将所述用于表示测试参数的字段值填入所述测试参数区,以形成所述契约文件。
10.一种测试装置,其特征在于,包括:
获取模块,配置为获取契约文件;
解析模块,配置为解析所述契约文件,以确定所述契约文件中用于表示测试接口的字段值和用于表示测试参数的字段值中包含的动态计算表达式;
执行模块,配置为执行所述动态计算表达式,以确定所述测试参数及所述测试接口;
测试模块,配置为基于所述测试参数测试所述测试接口,得到测试结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110616349.8A CN115437906A (zh) | 2021-06-02 | 2021-06-02 | 测试方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110616349.8A CN115437906A (zh) | 2021-06-02 | 2021-06-02 | 测试方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115437906A true CN115437906A (zh) | 2022-12-06 |
Family
ID=84240079
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110616349.8A Pending CN115437906A (zh) | 2021-06-02 | 2021-06-02 | 测试方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115437906A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117370217A (zh) * | 2023-12-08 | 2024-01-09 | 天津华来科技股份有限公司 | 一种基于python的接口测试结果自动生成方法 |
-
2021
- 2021-06-02 CN CN202110616349.8A patent/CN115437906A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117370217A (zh) * | 2023-12-08 | 2024-01-09 | 天津华来科技股份有限公司 | 一种基于python的接口测试结果自动生成方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9582399B2 (en) | Entropy weighted message matching for opaque service virtualization | |
US10031836B2 (en) | Systems and methods for automatically generating message prototypes for accurate and efficient opaque service emulation | |
US10467316B2 (en) | Systems and methods for web analytics testing and web development | |
US9483387B1 (en) | Tree comparison functionality for services | |
CN112287009A (zh) | 接口调用和接口数据入库方法、装置、设备及存储介质 | |
CN113076104A (zh) | 页面生成方法、装置、设备及存储介质 | |
CN113076729B (zh) | 用于报表导入的方法及***、可读存储介质及电子设备 | |
CN112306881A (zh) | 模拟数据生成方法、装置、设备及存储介质 | |
CN111460241B (zh) | 一种数据查询方法、装置、电子设备及存储介质 | |
CN112154420A (zh) | 自动智能云服务测试工具 | |
US9166619B2 (en) | Method and system for pattern-based compression | |
CN115599359A (zh) | 一种代码生成方法、装置、设备及介质 | |
CN107391528B (zh) | 前端组件依赖信息搜索方法及设备 | |
CN115346686A (zh) | 关系图谱生成方法及装置、存储介质及电子设备 | |
CN110719200A (zh) | 信息识别方法和装置 | |
CN115437906A (zh) | 测试方法和装置 | |
CN116737535A (zh) | 接口测试方法、装置、计算机设备和存储介质 | |
CN111124883A (zh) | 一种基于树形表格的测试用例库引入方法、***及设备 | |
US20190317877A1 (en) | Application state monitoring | |
CN115454702A (zh) | 日志故障分析方法、装置、存储介质及电子设备 | |
CN114519071A (zh) | 规则匹配模型的生成方法、匹配方法、***、设备和介质 | |
CN113268483A (zh) | 请求处理方法和装置、电子设备和存储介质 | |
CN111563389B (zh) | 一种用户原创内容的翻译方法和装置 | |
CN113190236B (zh) | Hql脚本校验方法及装置 | |
US11675838B2 (en) | Automatically completing a pipeline graph in an internet of things network |
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 |