CN117891748A - 数据库的测试方法、装置、计算机设备和存储介质 - Google Patents
数据库的测试方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN117891748A CN117891748A CN202410298773.6A CN202410298773A CN117891748A CN 117891748 A CN117891748 A CN 117891748A CN 202410298773 A CN202410298773 A CN 202410298773A CN 117891748 A CN117891748 A CN 117891748A
- Authority
- CN
- China
- Prior art keywords
- statement
- sentence
- identification
- flow control
- basic operation
- 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
- 238000012360 testing method Methods 0.000 title claims abstract description 320
- 238000003860 storage Methods 0.000 title claims abstract description 23
- 238000000034 method Methods 0.000 claims abstract description 96
- 238000004590 computer program Methods 0.000 claims abstract description 26
- 230000014509 gene expression Effects 0.000 claims description 138
- 230000006870 function Effects 0.000 claims description 59
- 230000002159 abnormal effect Effects 0.000 claims description 37
- 238000010998 test method Methods 0.000 claims description 16
- 238000010276 construction Methods 0.000 claims description 11
- 230000008569 process Effects 0.000 description 29
- 230000001186 cumulative effect Effects 0.000 description 14
- 238000010586 diagram Methods 0.000 description 14
- 238000004886 process control Methods 0.000 description 10
- 238000012545 processing Methods 0.000 description 8
- 238000009825 accumulation Methods 0.000 description 5
- 238000004891 communication Methods 0.000 description 5
- 238000007726 management method Methods 0.000 description 5
- 238000004458 analytical method Methods 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 230000008859 change Effects 0.000 description 2
- 238000013500 data storage Methods 0.000 description 2
- 238000011112 process operation Methods 0.000 description 2
- 230000003068 static effect Effects 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- OKTJSMMVPCPJKN-UHFFFAOYSA-N Carbon Chemical compound [C] OKTJSMMVPCPJKN-UHFFFAOYSA-N 0.000 description 1
- 230000005856 abnormality Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 238000005266 casting Methods 0.000 description 1
- 238000012512 characterization method Methods 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 238000004140 cleaning Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000009977 dual effect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000000605 extraction Methods 0.000 description 1
- 229910021389 graphene Inorganic materials 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000007620 mathematical function Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000010076 replication Effects 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请涉及一种数据库的测试方法、装置、计算机设备、存储介质和计算机程序产品。所述方法可以应用于数据库领域,如应用于对数据库进行自动化测试的场景。所述方法包括:依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,以构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,以生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。采用本方法能够提升数据库测试的覆盖率。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种数据库的测试方法、装置、计算机设备、存储介质和计算机程序产品。
背景技术
过程化结构查询语言(Procedural Language/Structured Query Language,PL/SQL)是SQL的扩展,PL/SQL在SQL上添加了编程语言的特点,可以实现程序逻辑控制、面向对象设计、过程化编程结构、错误处理等功能,PL/SQL可以对复杂业务场景的数据库进行测试。
相关技术中,通过人工编写PL/SQL测试用例,编写的PL/SQL测试用例较为单一,导致测试覆盖面较窄,影响数据库的测试效果。
发明内容
基于此,有必要针对上述技术问题,提供一种数据库的测试方法、装置、计算机设备、计算机可读存储介质和计算机程序产品,能够提升数据库测试的覆盖率。
第一方面,本申请提供了一种数据库的测试方法。所述方法包括:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
第二方面,本申请还提供了一种数据库的测试装置。所述装置包括:
声明语句块生成模块,用于依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;
可执行语句块生成模块,用于依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;
测试用例构建模块,用于基于声明语句块和可执行语句块构建测试用例;
测试模块,用于采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
第三方面,本申请还提供了一种计算机设备。所述计算机设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
第四方面,本申请还提供了一种计算机可读存储介质。所述计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
第五方面,本申请还提供了一种计算机程序产品。所述计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
上述数据库的测试方法、装置、计算机设备、存储介质和计算机程序产品,根据概率表中各语句标识对应的概率值,选取声明语句标识、基础操作语句标识和流程控制语句标识,根据声明语句标识生成声明语句块,根据基础操作语句标识和流程控制语句标识构建可执行语句块,再根据声明语句块和可执行语句块构建测试用例,采用测试用例对目标数据库进行测试,得到执行结果;实现了自动构建PL/SQL类型的测试用例,提升了构建PL/SQL类型的测试用例的效率,进而提升了目标数据库的测试效率;在不同的测试轮次中,根据概率表中的概率值选取的各语句标识可能不同,进而可以根据各语句标识对应的语句构建不同的测试用例,提升了测试用例的丰富程度,可以提升数据库测试的覆盖率;此外,由于概率表中的概率值基于执行结果进行动态调整,使得语句标识被选取的概率发生变化,进而构建的测试用例更加丰富,进一步提升了数据库测试的覆盖率。
附图说明
图1为一个实施例中数据库的测试方法的应用环境图;
图2为一个实施例中数据库的测试方法的流程示意图;
图3为一个实施例中PL/SQL语句块的示意图;
图4为一个实施例中对概率表中的概率值进行更新的示意图;
图5为一个实施例中声明类语法结构的示意图;
图6为一个实施例中基础操作层级结构的示意图;
图7为一个实施例中流程控制层级结构的示意图;
图8为一个实施例中基础表达式语句的语法结构示意图;
图9为一个实施例中布尔表达式语句的语法结构示意图;
图10为一个实施例中子查询语句的语法结构示意图;
图11为一个实施例中通过测试工具实现数据库的测试方法的示意图;
图12为一个场景实施例中数据库的测试方法的示意图;
图13为另一个实施例中数据库的测试方法的示意图;
图14为一个实施例中数据库的测试装置的结构框图;
图15为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
数据库(Database),简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
数据库管理系统(Database Management System,简称DBMS)是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML(Extensible Markup Language,即可扩展标记语言);或依据所支持的计算机类型来作分类,例如服务器群集、移动电话;或依据所用查询语言来作分类,例如SQL(结构化查询语言(Structured Query Language)、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。
本申请实施例提供的数据库的测试方法,可以应用于如图1所示的应用环境中。其中,终端102通过网络与服务器104进行通信。数据存储系统可以存储服务器104需要处理的数据。数据存储系统可以集成在服务器104上,也可以放在云上或其他网络服务器上;数据库的测试方法可以通过终端102或服务器104执行,也可以通过终端102和服务器104协同执行。
以数据库的测试方法通过终端102执行为例,终端102依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;终端102依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;终端102基于声明语句块和可执行语句块构建测试用例;终端102采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
其中,终端102可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表、物联网设备和便携式可穿戴设备,物联网设备可为智能音箱、智能电视、智能空调和智能车载设备等。便携式可穿戴设备可为智能手表、智能手环、头戴设备等。
服务器104可以是独立的物理服务器,也可以是区块链系统中的服务节点,该区块链系统中的各服务节点之间形成组成点对点网络。
此外,服务器104还可以是多个物理服务器构成的服务器集群,可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。
终端102与服务器104之间可以通过蓝牙、USB(Universal Serial Bus,通用串行总线)或者网络等通讯连接方式进行连接,本申请在此不做限制。
在一些实施例中,如图2所示,提供了一种数据库的测试方法,该方法由图1中的服务器或终端执行,也可以由图1中的服务器和终端协同执行,以该方法由计算机设备执行为例进行说明,计算机设备可以是图1中的服务器或终端,数据库的测试方法包括以下步骤:
步骤202,依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整。
其中,概率表包括声明类语法结构下的语句标识和语句标识对应的概率值;声明类语法结构用于表示PL/SQL语句块中声明部分的语法结构,包括类型定义的语法结构、变量声明的语法结构、函数定义的语法结构和存储过程定义的语法结构;在概率表中,声明类语法结构下的语句标识,可以按照与声明类语法结构相同的形式进行排列。
语句标识对应的概率值用于反映语句标识被选取的概率,语句标识的概率值越大,则语句标识被选取的概率越大;示例性地,第一语句标识的概率值为0.3,第二语句标识的概率值为0.7,在选取10次的情况下,可能有3次选取到第一语句标识,可能有7次选取到第二语句标识。
需要说明的是,由于概率表中的概率值依据执行结果进行动态调整,使得语句标识在不同测试轮次被选取的概率不同,进而依据被选取的语句标识生成的语句块不同,使得后续得到的测试用例也不同,通过调整概率表中的概率值,可以在不同测试轮次得到不同的测试用例,进而可以提升数据库测试的覆盖率。
声明语句标识的数量可以是至少一个,声明语句标识可以是类型定义的语法结构、变量声明的语法结构、函数定义的语法结构和存储过程定义的语法结构中的至少一个语法结构下的语句标识。
声明语句块包括至少一个声明语句标识对应的声明语句;需要说明的是,声明语句标识和声明语句的生成方式之间存在对应关系,在选取得到声明语句标识之后,可以查找到对应的生成方式,进而生成声明语句标识对应的声明语句。
具体地,计算机设备获取概率表,在概率表中获取声明类语法结构下各语句标识和对应的概率值,依据概率值在声明类语法结构下的各语句标识中进行随机选取,得到至少一个声明语句标识,依据至少一个声明语句标识查找到对应的生成方式,依据生成方式生成至少一个声明语句,根据至少一个声明语句构建声明语句块。
步骤204,依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块。
其中,概率表还包括可执行类语法结构下语句标识和语句标识对应的概率值;可执行类语法结构用于表示PL/SQL语句块中可执行部分的语法结构,包括基础操作语法结构和流程控制语法结构;在概率表中,可执行类语法结构下的语句标识,可以按照与可执行类语法结构的相同的形式进行排列。
基础操作语法结构包括变量赋值操作语法结构、DML操作语法结构、动态SQL操作语法结构、CURSOR操作语法结构、函数/存储过程的调用语法结构和raise exception操作语法结构。其中,DML(Data Manipulation Language)操作是数据操纵语言操作,可以用于进行插入元组、删除元组、修改元组的操作;CURSOR操作是游标操作,可以用于遍历结果集中的数据、定位数据、修改数据等;动态SQL操作可以根据条件动态地生成SQL语句,提升SQL语句的灵活性;raise exception操作是抛出异常操作,用于抛出异常,以帮助解决数据库的错误。
流程控制语法结构包括条件控制语法结构、循环语法结构和goto语法结构;其中,goto语法结构是goto语句的语法结构,goto语句用于跳转到指定行继续执行。
基础操作语句标识是基础操作语法结构下的语句标识,基础操作语句标识的数量可以是至少一个,流程控制语句标识是流程控制语法结构下的语句标识流程控制语句标识的数量可以是至少一个。
可执行语句块包括至少一个基础操作语句标识对应的基础操作语句和至少一个流程控制语句标识对应的流程控制语句;需要说明的是,基础操作语句标识和基础操作语句的生成方式之间存在对应关系,同样地,流程控制语句标识和流程控制语句的生成方式之间存在对应关系。
具体地,可执行类语法结构包括基础操作语法结构和流程控制语法结构,计算机设备在概率表中获取基础操作语法结构下各语句标识和对应的概率值,依据概率值在基础操作语法结构下的各语句标识中进行随机选取,得到至少一个基础操作语句标识。
计算机设备在概率表中获取流程控制语法结构下各语句标识和对应的概率值,依据概率值在流程控制语法结构下的各语句标识中进行随机选取,得到至少一个流程控制语句标识。
计算机设备依据至少一个基础操作语句标识查找到对应的生成方式,以生成至少一个基础操作语句,并依据至少一个流程控制语句标识查找到对应的生成方式,以生成至少一个流程控制语句;根据至少一个基础操作语句和至少一个流程控制语句构建可执行语句块。
在一些实施例中,计算机设备依据概率表中的可执行类语法结构下各语句标识对应的概率值,可以选取基础操作语句标识和流程控制语句标识中的至少一个,并基于基础操作语句标识和流程控制语句标识中的至少一个生成可执行语句块;也就是说,可执行语句块包括至少一个基础操作语句和至少一个流程控制语句中的至少一个语句;示例性地,可执行语句块1包括:基础操作语句1;可执行语句块2包括:流程控制语句1。
步骤206,基于声明语句块和可执行语句块构建测试用例。
其中,测试用例是PL/SQL类型的测试用例,包括PL/SQL语句块和调用方式。
具体地,计算机设备获取预设用例类型,基于声明语句块和可执行语句块构建PL/SQL语句块,根据预设用例类型确定PL/SQL语句块的调用方式,根据PL/SQL语句块和调用方式构建测试用例。
示例性,PL/SQL语句块可以包括声明部分和可执行部分,如下所示:
DECLARE
声明语句1;
声明语句2;
BEGIN
可执行语句1;
可执行语句2;
END;
其中,DECLARE是声明部分的开头,由声明语句1和声明语句2组成声明语句块;BEGIN是可执行部分的开头,由可执行语句1和可执行语句2组成可执行语句块。
在一些实施例中,步骤206包括:基于声明语句块和可执行语句块,构建预设用例类型对应的过程化查询语句块;随机选取预设用例类型对应的参数类型,并基于预设用例类型和参数类型确定调用方式;依据过程化查询语句块和调用方式构建测试用例。
其中,过程化查询语句块即PL/SQL语句块;预设用例类型可以是匿名块、自定义函数、存储过程、包、触发器或自定义类型中的任一种;预设用例类型可以根据测试需求选择,在对目标数据库进行测试的过程中,不同测试轮次的预设用例类型可以不同。
匿名块是没有名称的PL/SQL语句块,因此不能存储,通常应用于使用一次的场景下;自定义函数是命名的PL/SQL语句块,用于执行计算并返回值;存储过程是命名的PL/SQL语句块,用于执行一系列操作而不返回值;包是将函数、过程、变量和常量等组合在一起得到的PL/SQL语句块;触发器是一种特殊的存储过程,可以在指定的数据库事件发生时执行;自定义类型可以定义复杂的数据结构,比如可以包括表类型、对象类型、可变数组等。
需要说明的是,不同的预设用例类型对应不同的用例形式,比如自定义函数包括该函数的定义和参数类型,触发器包括触发条件。
参数类型可以是IN、OUT或INOUT中的任一种;其中,PL/SQL语句块的参数类型是IN时,调用者调用PL/SQL语句块时,需为IN参数提供输入数据;PL/SQL语句块的参数类型是OUT时,调用者通过OUT参数从PL/SQL语句块中返回数据;PL/SQL语句块的参数类型是INOUT时,INOUT参数即可以用于调用者提供输入数据,也可以用于调用者获取返回数据。
调用方式是调用PL/SQL语句块的方式,不同的预设用例类型和参数类型的组合形式,可能对应不同的调用方式;测试用例包括PL/SQL语句块和PL/SQL语句块的调用方式。
具体地,计算机设备获取预设用例类型对应的语句模板,在语句模板中嵌入声明语句块和可执行语句块,得到PL/SQL语句块,可以在预设的各参数类型中随机选取预设用例类型对应的参数类型;计算机设备根据预设用例类型和参数类型选取至少一种可用调用方式,在至少一种可用调用方式中选取调用方式,根据PL/SQL语句块和调用方式生成测试用例。
示例性地,预设用例类型是自定义函数,随机选取的参数类型是IN,根据自定义函数和IN参数可以确定至少一种可用调用方式,在至少一种可用调用方式中选取调用方式,比如调用方式为select fun()from dual;预设用例类型是自定义函数,随机选取的参数类型是OUT,根据自定义函数和OUT参数选取至少一种可用调用方式,在至少一种可用调用方式中选取调用方式,比如调用方式为begin fun();end;预设用例类型是存储过程,随机选取的参数类型是IN,根据存储过程和IN参数随机选取的调用方式为call procedure()。其中,fun()可以是函数的名称,指向名称对应的函数,dual是虚拟表,调用方式:“selectfun()from dual”表示在虚拟表中调用函数的结果;调用方式:“begin fun();end”表示调用函数;procedure()可以是存储过程的名称,调用方式:“call procedure()”用于调用存储过程的名称对应的存储过程。
在上述实施例中,可以根据声明语句块和可执行语句块生成不同预设用例类型的PL/SQL语句块,根据PL/SQL语句块的参数类型和预设用例类型确定调用方式,再根据PL/SQL语句块和调用方式确定测试用例,进而可以根据测试需求构建不同预设用例类型的测试用例,提升了生成测试用例的灵活度。
在一些实施例中,在声明语句块中选取异常变量;基于概率表中的可执行类语法结构下各语句标识对应的概率值,生成异常操作语句;基于异常变量和异常操作语句构建异常处理语句块;基于声明语句块和可执行语句块构建测试用例,包括:基于声明语句块、可执行语句块和异常处理语句块构建测试用例。
其中,PL/SQL语句块的结构如图3所示,可以包括声明部分、可执行部分和异常处理部分,声明部分和异常处理部分是可选部分。
声明语句块包括异常声明语句,异常声明语句是定义异常变量的语句,比如异常声明语句是:DECLARE NO_DATA_FOUND EXCEPTION,即预定义了NO_DATA_FOUND是异常变量,NO_DATA_FOUND表示未返回数据;异常操作语句是触发异常时执行的语句,异常操作语句可以是基础操作语句或流程控制语句。
需要说明的是,当声明语句块中不包括异常声明语句时,可以将标准异常变量作为异常变量,标准异常变量可以通过OTHERS表示,标准异常变量可以表示所有未被明确定义的异常。
具体地,计算机设备在声明语句块中随机选取至少一个异常声明语句,获取每一异常声明语句的异常变量;针对每一异常变量,计算机设备可以基于概率表中的可执行类语法结构下各语句标识对应的概率值,选取异常操作语句标识,并根据异常操作语句标识生成该异常变量的异常操作语句,根据至少一个异常变量和对应的异常操作语句构建至少一个异常处理语句,根据至少一个异常处理语句构建异常处理语句块。
其中,基于概率表中的可执行类语法结构下各语句标识对应的概率值,选取异常操作语句标识,与基于概率表中可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识的过程相同,因此选取异常操作语句表示的过程可以参考上述对选取基础操作语句标识和流程控制语句标识的说明。
在一种实现方式中,可以在选取的基础操作语句标识和流程控制语句标识中随机选取异常操作语句标识,根据异常操作语句标识生成异常操作语句,可以提升得到异常操作语句的效率。
在另一种实现方式中,可以在生成的可执行语句块中随机选取一个语句作为异常操作语句,可以提升得到异常操作语句的效率。
示例性地,异常处理语句块的语法结构如下:
EXCEPTION
WHEN <异常变量> THEN
<异常操作语句>;
其中,EXCEPTION是异常处理部分的开头,WHEN <异常变量> THEN <异常操作语句>是异常处理语句,异常处理语句块可以包括多个异常处理语句;当可执行部分被运行时存在异常变量,则执行异常操作语句。
具体地,基于声明语句块、可执行语句块和异常处理语句块构建测试用例,可以是基于声明语句块、可执行语句块和异常处理语句块,构建预设用例类型对应的过程化查询语句块;随机选取预设用例类型对应的参数类型,并基于预设用例类型和参数类型确定调用方式;依据过程化查询语句块和调用方式构建测试用例。
示例性地,PL/SQL语句块包括声明部分、可执行部分和异常处理部分,如下所示:
DECLARE
声明语句1;
声明语句2;
BEGIN
可执行语句1;
可执行语句2;
EXCEPTION
异常处理语句1;
异常处理语句2;
END;
在上述实施例中,可以选取异常变量,以及根据概率表中的概率值产生异常操作语句,进而灵活构建异常处理语句块,使得执行测试用例时可以捕获异常情况,避免测试意外停止,提升数据库的测试效果。
步骤208,采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
其中,目标数据库是被测试的数据库;执行结果包括目标数据库执行测试用例所涉及的数据,包括返回数据和操作日志,返回数据是目标数据库执行测试用例所返回的数据,操作日志包括执行测试用例过程中涉及的操作数据;比如目标数据库执行测试用例的过程中发生错误,错误信息可以被记录在操作日志中,又如在执行测试用例过程中,针对目标数据库进行了增删查改操作,增删查改操作涉及的数据被记录在操作日志中。
具体地,计算机设备在目标数据库上执行测试用例,可以是通过测试用例的调用方式,调用测试用例包括的PL/SQL语句块,以在目标数据库上执行测试用例,获取目标数据库执行测试用例所得的执行结果。
在一些实施例中,步骤208之后,还包括:采用测试用例对参考数据库进行测试,得到参考结果;当执行结果和参考结果一致时,确定执行结果满足正确条件;当执行结果和参考结果不一致时,确定执行结果不满足正确条件。
其中,参考数据库执行测试用例所得的参考结果是正确结果,执行结果满足正确条件,表示执行结果正确,执行结果不满足正确条件,表示执行结果错误。
通过比较执行结果和参考结果是否一致,以确定执行结果是否正确的测试方式,也被称为差分测试,差分测试是一种模糊测试方法,用于比较在相同输入条件下不同对象的行为差异,以检测对象的错误。
其中,采用测试用例对参考数据库进行测试,得到参考结果的过程,与上述得到执行结果的过程相同;参考结果包括参考数据库执行测试用例所涉及的数据,包括返回数据和操作日志。
示例性地,测试目标数据库的oracle兼容性,参考数据库可以是oracle数据库,目标数据库执行测试用例得到执行结果,oracle数据库执行测试用例得到参考结果,若执行结果与参考结果一致,则确定目标数据库在测试用例下的执行结果满足正确条件;若执行结果与参考结果不一致,则确定目标数据库在测试用例下的执行结果不满足正确条件;oracle数据库是一种关系型数据库管理系统(RDBMS),广泛应用于企业级应用和大型数据中心,oracle数据库支持大型数据集的存储和管理,能够处理高度复杂的查询和事务处理。
在上述实施例中,分别在目标数据库和参考数据库上执行测试用例,通过比较执行结果和参考结果是否一致,确定执行结果是否满足正确条件,由于执行结果和参考结果包括执行测试用例所涉及的数据,可以检测在目标数据库上执行测试用例的中间操作的正确性,提升目标数据库的测试效果。
在一些实施例中,步骤208之后,还包括:在执行结果不满足正确条件的情况下,获取测试用例中各语句的语句标识;增加概率表中各语句的语句标识对应的概率值。
其中,执行结果不满足正确条件,表征执行结果错误;测试用例中的各语句,是测试用例包括的PL/SQL语句块中的各语句。
具体地,计算机设备在确定执行结果不满足正确条件的情况下,获取测试用例中PL/SQL语句块中的各语句的语句标识,采用预设增量增加概率表中各语句标识的概率值,以实现依据执行结果对概率表中的概率值进行动态调整;预设增量可以根据实际需求设定,比如预设增量可以是0.1,本实施例对预设增量的具体取值不进行限定。
需要说明的是,数据库的测试方法包括多个测试轮次,每个测试轮次执行的过程相同,本实施例是对一个测试轮次执行的过程进行说明。
在当前测试轮次中,依据执行结果增加概率表中测试用例中各语句的语句标识对应的概率值之后,返回依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识的步骤继续执行,以进入下一测试轮次;由于在上一测试轮次中,增加了执行结果为错误的测试用例中各语句的语句标识对应的概率值,在下一测试轮次构建的下一测试用例包括上一测试用例中的语句的概率较大,使得执行结果为错误的测试用例中的语句可以被重复用于测试,有助于分析目标数据库存在的错误。
在一些实施例中,步骤208之后,还包括:在执行结果满足正确条件的情况下,对目标数据库当前的正确累计次数进行调整;当调整后的正确累计次数满足表更新条件时,对概率表中的各概率值进行更新。
在一种实现方式中,正确累计次数,可以是采用多个测试轮次构建的多个测试用例对目标数据库进行测试所得的多个执行结果中,满足正确条件的执行结果的累计数量。
调整后的正确累计次数满足表更新条件,可以是调整后的正确累计次数大于第一预设阈值;第一预设阈值可以根据实际需求设定,比如第一预设阈值可以是50,本申请实施例对第一预设阈值的具体取值不进行限定。
对概率表中的各概率值进行更新,是对概率表中的所有概率值进行更新。
具体地,在当前测试轮次的执行结果满足正确条件的情况下,获取当前的正确累计次数,并将当前的正确累计次数加1,得到调整后的正确累计次数;当调整后的正确累计次数大于第一预设阈值,则对概率表中的各概率值进行更新;其中,对概率表中的各概率值进行更新,可以是重新随机生成各概率值,采用重新生成的各概率值替换概率表中各概率值,以实现对概率表中的各概率值进行更新。
在此实现方式中,在对概率表中的各概率值进行更新之后,将当前的正确累计次数置为0,使得基于更新后的概率表执行的后续测试轮次,重新统计正确累计次数。
在另一种实现方式中,正确累计次数,可以是连续的测试轮次的执行结果满足正确条件的累计次数;正确累计次数满足表更新条件,可以是正确累计次数大于第二预设阈值;第二预设阈值可以根据实际需求设定,比如第二预设阈值可以是10,本申请实施例对第二预设阈值的具体取值不进行限定。
具体地,在当前测试轮次的执行结果满足正确条件的情况下,将当前的正确累计次数加1,得到调整后的正确累计次数;当调整后的正确累计次数大于第二预设阈值时,对概率表中的各概率值进行更新。
在此实现方式中,在对概率表中的各概率值进行更新之后,将当前的正确累计次数置为0,使得基于更新后的概率表执行的后续测试轮次,重新统计正确累计次数;此外,当正确累计次数表示连续的测试轮次的执行结果满足正确条件的累计次数时,若当前测试轮次的执行结果不满足正确条件,则将当前的正确累计次数置为0。
需要说明的是,对概率表中的所有概率值进行更新之后,后续测试轮次中基于更新后的概率表构建的测试用例包括的语句,与基于更新前的概率表构建的测试用例包括的语句可能不同,可以提升测试用例的丰富程度,进而可以提升测试的覆盖率。
示例性地,如图4所示,数据库的测试方法包括:
步骤401,依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;
步骤402,依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;
步骤403,基于声明语句块和可执行语句块构建测试用例;
步骤404,采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果;采用测试用例对参考数据库进行测试,得到参考结果;当执行结果和参考结果一致时,确定执行结果满足正确条件;当执行结果和参考结果不一致时,确定执行结果不满足正确条件;
步骤4051,在执行结果不满足正确条件的情况下,获取测试用例中各语句的语句标识;增加概率表中各语句的语句标识对应的概率值;
步骤4052,在执行结果满足正确条件的情况下,对目标数据库当前的正确累计次数进行调整;当调整后的正确累计次数满足表更新条件时,对概率表中的各概率值进行更新。
上述数据库的测试方法中,根据概率表中各语句标识对应的概率值,选取声明语句标识、基础操作语句标识和流程控制语句标识,根据声明语句标识生成声明语句块,根据基础操作语句标识和流程控制语句标识构建可执行语句块,再根据声明语句块和可执行语句块构建测试用例,采用测试用例对目标数据库进行测试,得到执行结果;实现了自动构建PL/SQL类型的测试用例,提升了构建PL/SQL类型的测试用例的效率,进而提升了目标数据库的测试效率;在不同的测试轮次中,根据概率表中的概率值选取的各语句标识可能不同,进而可以根据各语句标识对应的语句构建不同的测试用例,提升了测试用例的丰富程度,可以提升数据库测试的覆盖率;此外,由于概率表中的概率值基于执行结果进行动态调整,使得语句标识被选取的概率发生变化,进而构建的测试用例更加丰富,进一步提升了数据库测试的覆盖率。
在一些实施例中,依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,包括:在声明类语法结构下选择至少一个声明类子结构;在概率表中获取声明类子结构下各语句标识对应的概率值;依据声明类子结构下各语句标识对应的概率值选取声明语句标识。
其中,声明类语法结构如图5所示;声明类语法结构包括多个声明类子结构,分别为类型定义子结构、变量声明子结构、函数定义子结构和存储过程定义子结构;选取的声明类子结构可以是类型定义子结构、变量声明子结构、函数定义子结构和存储过程定义子结构中的至少一个。
类型定义子结构下的各语句标识包括但不限于:游标类型定义标识、collection类型定义标识、record类型定义标识和subtype类型定义标识;游标类型定义标识下又包括:ref cursor标识;collection类型定义标识下又包括:关联数组标识、varray标识和嵌套表标识;collection类型是用于存储值的集合类型,record类型是记录的类型;subtype类型表示子类型,用于对类型进行进一步限定;ref cursor标识用于查询结果集;varray标识是可变数组标识。
变量声明子结构下的各语句标识包括但不限于:基本类型变量标识、基本类型常量标识、游标变量标识、anydata变量标识和exception变量标识;基本类型变量标识下又包括sql类型标识和plsql类型标识;游标变量标识下又包括select语句标识;anydata变量表示任意数据类型的变量;exception变量表示异常变量;select语句用于从库中检索数据。
具体地,计算机设备可以根据测试需求,确定声明类语法结构包括的多个声明类子结构的权重,依据权重在多个声明类子结构中选取至少一个声明类子结构。
当选取的声明类子结构包括类型定义子结构时,基于类型定义子结构下的各语句标识的概率值,在类型定义子结构下的各语句标识中随机选取至少一个声明语句标识;当选取的声明类子结构包括变量声明子结构时,基于变量声明子结构下的各语句标识的概率值,在变量声明子结构下的各语句标识中随机选取至少一个声明语句标识。
当选取的声明类子结构包括函数定义子结构时,将函数定义标识作为选取的声明语句标识;当选取的声明类子结构包括存储过程定义子结构时,将存储过程定义标识作为选取的声明语句标识。
示例性地,在变量声明子结构中随机选取变量类型的声明语句标识,设定变量名称可以var(表示变量)开头,后跟自然数递增,例如var1,var2。
在选取至少一个声明语句标识之后,可以在PL/SQL的语法树中选取至少一个声明语句标识对应的子语法树,运行子语法树以生成声明语句标识对应的声明语句,根据至少一个声明语句构建声明语句块。
在上述实施例中,基于概率表中的概率值选取声明语句标识,使得在不同测试轮次选取的声明语句标识可能不同,提升了声明语句块的丰富程度,进而提升了测试用例的丰富程度。
在一些实施例中,可执行类语法结构包括基础操作层级结构和流程控制层级结构;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,包括:在概率表中的基础操作层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选基础操作语句标识;在候选基础操作语句标识不存在子孙基础操作语句标识的情况下,将候选基础操作语句标识作为基础操作语句标识;在候选基础操作语句标识存在子孙基础操作语句标识,且子孙基础操作语句标识不存在对应概率值的情况下,通过随机种子在子孙基础操作语句标识中选取基础操作语句标识;依据概率表中的流程控制层级结构下各语句标识对应的概率值,选取流程控制语句标识。
其中,基础操作层级结构如图6所示;基础操作层级结构包括但不限于属于第一层级的变量赋值操作标识、DML操作标识、动态SQL操作标识、游标操作标识、调用操作标识和抛出异常操作标识,属于第一层级的各操作标识下,可能包括属于第二层级和更低层级的操作标识,使得基础操作层级结构呈树状结构;属于第一层级的操作标识下的、属于第二层级或更低层级的操作标识,是属于第一层级的操作标识的子孙基础操作语句标识。
以变量赋值操作标识为例;参考图6,变量赋值操作标识的子孙基础操作语句标识包括:属于第二层级的简单表达式赋值操作标识、select into赋值操作标识和函数调用赋值操作标识;在可能的场景下,逐层选取得到的候选基础操作语句标识可以是简单表达式赋值操作标识、select into赋值操作标识和函数调用赋值操作标识中的至少一个;selectinto赋值操作用于将检索的结果赋值给变量。
其中,简单表达式赋值操作标识用于生成简单表达式赋值语句,简单表达式赋值操作标识包括赋值变量标识和基础表达式标识,即简单表达式赋值操作语句由赋值变量和基础表达式组成(图6的虚线框表示组成的内容);select into赋值操作标识用于生成select into赋值语句,select into赋值操作标识包括赋值变量标识和select语句标识组成,即select into赋值语句由赋值变量和select语句组成;select语句又可以由select语句、布尔表达式、基础表达式和表/视图/同义词等数据库对象组成;此外,DML操作标识、动态SQL操作标识等其他属于第一层级的操作标识的子孙基础操作语句标识也可以参考图6确定,不再赘述。
图6中,insert用于插入新的数据;insert values用于指定要插入的数据值;insert select用于插入查询结果;delete from table where用于在指定表中删除满足特定条件的记录;update table set用于修改表中的记录,merge用于根据源表和目标表之间的比较修改记录;commit用于确保数据库操作被保存在,rollback用于进行回滚操作;fitch into用于从游标中获取数据,并将获取的数据赋值给变量;exit when not found用于在游标中没有获取到数据时退出;fitch bulk collect into用于从游标中批量提取数据。
候选基础操作语句标识,是依据概率表中的概率值,在基础操作层级结构中逐层选取得到的;逐层选取指的是,首先依据概率值在第一层级的各语句标识中选取一个语句标识,若该语句标识包括更低层级的语句标识,则继续依据在更低层级的语句标识中选取语句标识,如此逐层选取,直至选取的语句标识不包括更低层级的语句标识,或者直至选取的语句标识包括的更低层级的语句标识,而更低层级的语句标识没有配置对应的概率值,则将该选取的语句标识作为候选基础操作语句标识。
若依据概率值选取的候选基础操作语句标识不包括更低层级的子孙基础操作语句标识时,则直接将候选基础操作语句标识作为基础操作语句标识。
为了节省资源,概率表可能不包括基础操作层级结构中所有语句标识的概率值,在依据概率值逐层选取到候选基础操作语句标识之后,若候选基础操作语句标识包括更低层级且没有对应概率值的子孙基础操作语句标识时,可以在子孙基础操作语句标识中随机选取基础操作语句标识。
示例性地,概率表包括基础操作层级结构中属于第一层级语句标识的概率值;比如,基于概率值在基础操作层级结构中逐层选取得到的候选基础操作语句标识,是属于第一层级的语句标识是抛出异常操作标识,抛出异常操作标识没有子孙基础操作语句标识,则将抛出异常操作标识作为基础操作语句标识;再如,比如基于概率值在基础操作层级结构中逐层选取得到的候选基础操作语句标识,是属于第一层级的变量赋值操作标识;变量赋值操作标识包括属于第二层级的子孙基础操作语句标识(简单表达式赋值操作标识、select into赋值操作标识和函数调用赋值操作标识),则根据随机种子在变量赋值操作标识的子孙基础操作语句标识中随机选取基础操作语句标识。
根据概率表中概率值,在基础操作层级结构中逐层选取得到候选基础操作语句标识,在候选基础操作语句标识包括子孙基础操作语句标识且子孙基础操作语句标识不存在对应概率值的情况下,在子孙基础操作语句中随机选取基础操作语句标识,使得选取基础操作语句标识的过程的随机性较强,在不同测试轮次选取的基础操作语句标识可能不同,提升了测试用例的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,依据概率表中的流程控制层级结构下各语句标识对应的概率值,选取流程控制语句标识,包括:在概率表中的流程控制层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选流程控制语句标识;在候选流程控制语句标识不存在子孙流程控制语句标识的情况下,将候选流程控制语句标识作为流程控制语句标识;在候选流程控制语句标识存在子孙流程控制语句标识,且子孙流程控制语句标识不存在对应概率值的情况下,通过随机种子在子孙流程控制语句标识中选取流程控制语句标识。
其中,流程控制层级结构如图7所示;流程控制层级结构包括但不限于属于第一层级的条件控制语句标识、循环语句标识和goto语句标识,属于第一层级的各标识下可能包括属于第二层级和更低层级的标识,使得流程控制层级结构呈树状结构。
以条件控制语句标识为例;条件控制语句标识包括但不限于属于第二层级的ifelse语句标识、case when语句标识;if else语句标识的子孙流程控制语句标识包括:ifcondition then statement语句标识、if then else语句标识和if then elsif语句标识;if else语句用于基于条件执行不同的操作;case when语句用于根据不同条件,返回不同的值;if then else语句用于根据某个条件是否为真,执行不同的操作;if then elsif语句用于处理多个条件分支。
其中,if condition then statement语句标识用于生成if condition thenstatement语句,if condition then statement语句指的是,若condition(条件)为真,则执行then后面的语句;if condition then statement语句标识包括条件判断表达式标识和基础操作语句标识,即if condition then statement语句由条件判断表达式和基础操作语句组成(图7的虚线框表示组成的内容);此外,条件控制语句的其他子孙流程控制语句标识,以及子孙流程控制语句标识的组成,可以通过图7确定;循环语句标识和goto语句标识的组成,也可以通过图7确定,不再赘述。
图7中,continue可以用于跳过当前循环的剩余部分,continue when用于在满足条件时跳过当前循环的剩余部分;goto label用于跳转到指定标签。
候选流程控制语句标识,是依据概率表中的概率值,在流程控制层级结构中逐层选取得到的。示例性地,候选流程控制语句标识可以是条件控制语句标识、循环语句标识和goto语句标识中的至少一个。
若依据概率值选取的候选流程控制语句标识不包括更低层级的子孙流程控制语句标识,则直接将候选流程控制语句标识作为流程控制语句标识。
为了节省资源,概率表可能不包括流程控制层级结构中所有语句标识的概率值,若依据概率值选取的候选流程控制语句标识包括更低层级的子孙流程控制语句标识,且子孙流程控制语句标识没有对应的概率值时,可以在子孙流程控制语句标识中随机选取一个语句标识作为流程控制语句标识。
在上述实施例中,根据概率表中概率值,在流程控制层级结构中逐层选取得到候选流程控制语句标识,在候选流程控制语句标识包括子孙流程控制语句标识且子孙流程控制语句标识不存在对应概率值的情况下,在子孙流程控制语句中随机选取流程控制语句标识,使得选取流程控制语句标识的过程的随机性较强,在不同测试轮次选取的流程控制语句标识可能不同,提升了测试用例的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基于基础操作语句标识和流程控制语句标识生成可执行语句块,包括:在可执行类语法结构的语法树中,获取基础操作语句标识对应的基础操作子语法树,并基于基础操作子语法树生成基础操作语句;在可执行类语法结构的语法树中,获取流程控制语句标识对应的流程控制子语法树,并基于流程控制子语法树生成流程控制语句;依据基础操作语句和流程控制语句构建可执行语句块。
其中,语法树是源代码语法结构的一种抽象标识,以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构;语法树可以用于生成代码。
语句标识与语法树上节点存在对应关系,语句标识对应的子语法树包括该语句标识对应的节点和该节点的子孙节点。
具体地,在选取得到基础操作语句标识之后,在可执行类语法结构的语法树中,获取基础操作语句标识对应的节点,依据该节点确定基础操作语句标识对应的基础操作子语法树,在语句生成器中运行该基础操作子语法树,可以生成基础操作语句。
同样地,在选取得到流程控制语句标识之后,在可执行类语法结构的语法树中,获取流程控制语句标识对应的节点,依据该节点确定流程控制语句标识对应的流程操作子语法树,在语句生成器中运行该流程操作子语法树,可以生成流程控制语句;再根据生成的基础操作语句和流程控制语句构建可执行语句块。
在一种实现方式中,流程控制语句标识包括流程控制层级结构标识和操作语句标识,依据流程控制层级结构标识生成流程控制层级结构语句,依据操作语句标识生成操作语句;具体可以是,在可执行类语法结构的语法树中获取流程控制语句标识对应的流程操作子语法树,以及获取操作语句标识对应的流程操作子语法树;根据流程控制语句标识对应的流程操作子语法树生成流程控制层级结构语句,依据操作语句标识对应的流程操作子语法树生成操作语句,进而得到流程控制语句。其中,操作语句可以是基础操作语句,因此操作语句标识对应的流程操作子语法树,可以与上述的基础操作语句标识对应的基础操作子语法树相同。
在上述实施例中,通过选取的语句标识在语法树中确定对应的子语法树,进而根据子语法树生成语句,实现了自动生成语句,提升了构建语句的效率,进而提升了构建测试用例的效率。
在一些实施例中,基础操作子语法树包括基础表达式树,基础操作语句包括基础表达式语句;基于基础操作子语法树生成基础操作语句,包括:在基础表达式树的运算符节点、条件表达式节点、函数节点和操作数节点中,选取至少一个节点;依据至少一个节点生成基础表达式语句。
其中,基础表达式语句的语法结构如图8所示,基础表达式树的结构与基础表达式语句的语法结构相似。
依据基础表达式的结构可知,基础表达式语句存在多种样式,比如基础表达式语句可以是运算符表达式、函数等,示例性地,基础表达式可以是“Hello, World!”,是一个字符串的常量;在确定生成的基础操作语句是基础表达式语句之后,还需要确定生成的基础标识式语句的具运算符体样式。
基础操作子语法树包括属于第一层级的运算符节点、条件表达式节点、函数节点和操作数节点,属于第一层级的各节点还包括更低层级的子孙节点,比如函数节点还包括字符函数节点、数学函数节点、日期函数节点等。
具体地,可以根据测试需求,设定基础表达式树的运算符节点、条件表达式节点、函数节点和操作数节点的权重;基础标识语句的数量可以是一个或多个;计算机设备可以依据权重,在属于第一层级的运算符节点、条件表达式节点、函数节点和操作数节点中随机选取至少一个节点,对于选取的每个节点,在该节点包括的子孙节点中随机选取一个子孙节点作为目标节点,依据该目标节点生成基础表达式语句,进而得到至少一个基础表示式语句。
需要说明的是,运算符节点、条件表达式节点、函数节点和操作数节点可以嵌套使用,比如运算符节点的操作数可以是函数节点,函数节点的操作数可以是条件表达式节点。
在上述实施例中,在基础操作语句标识是基础表达式标识时,在依据基础表达式树生成基础表达式语句的过程中,在基础表达式树中随机选取节点,并根据选取的节点生成基础表达式语句,使得基础表达式语句的生成过程具有较强的随机性,提升了生成的基础操作语句的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基础操作子语法树包括布尔表达式树,基础操作语句包括布尔表达式语句;基于基础操作子语法树生成基础操作语句,包括:在布尔表达式树中选取至少一个比较运算符,并依据至少一个比较运算符生成至少一个比较表达式;在布尔表达式树中选取至少一个逻辑运算符;依据至少一个比较表达式和至少一个逻辑运算符生成布尔表达式语句。
其中,布尔表达式语句的语法结构如图9所示,布尔表达式树的结构与布尔表达式语句的语法结构相似。
依据布尔表达式的结构可知,布尔表达式语句包括比较运算符和逻辑运算符,依据比较运算符和逻辑运算符之间的不同组合方式,可以得到不同的布尔表达式语句。
具体地,计算机设备可以通过随机种子在布尔表达式树中选取一个比较运算符;示例性地,比较运算符可以是IS NULL /IS NOT NULL, >, <, >=, <=, <>, !=, LIKE/NOT LIKE, BETEEN AND/ NOT BETEEN AND, IN/ NOT IN, ANY/ SOME/ ALL, EXSITS/ NOTEXSITS中的至少一个;其中,IS NULL /IS NOT NULL用于比较表达式的值是否为NULL(空值);LIKE/ NOT LIKE用于进行模糊比较;BETEEN AND/ NOT BETEEN AND用于比较数据是否在指定范围;EXSITS/ NOT EXSITS也是子查询语句;对于选取的每个比较运算符,随机生成该比较运算符的基础表达式,根据该比较运算符和基础表达式生成比较表达式,如此可以得到至少一个比较表达式;其中随机生成基础表达式的方式可以参考上述实施例的说明。
计算机设备在布尔表达式中选取至少一个逻辑运算符,逻辑运算符可以是AND,OR, NOT;采用逻辑运算符对至少一个比较表达式组成一个布尔表达式语句。示例性地,布尔表达式语句为:(x > 5) AND (y < 30),其中,(x > 5)和(y < 30)是比较表达式,AND是逻辑运算符。
在上述实施例中,在基础操作标识是布尔表达式标识时,在布尔表达式树中随机选取比较运算符和逻辑运算符,以生成布尔表达式语句,使得布尔表达式语句的生成过程具有较强的随机性,提升了生成的布尔表示式语句的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基础操作子语法树包括子查询树,基础操作语句包括子查询语句;子查询语句的语法结构如图10所示,子查询树的结构与子查询语句的语法结构相似。
基于基础操作子语法树生成基础操作语句,包括:在子查询树的with节点、select节点、from节点、where节点、group by节点中随机选取一个节点作为第一节点,在选取的第一节点的子孙节点中随机选取一个节点作为第二节点,根据第一节点和第二节点生成子查询语句;with操作用于定义临时的命名结果集;from操作用于从指定的表或者视图中进行查询或读取数据;where操作用于过来结果集中的记录;group by操作用于将结果集中的记录组合成摘要行。
其中,with节点的子孙节点包括子查询节点,若选取的第二节点是with节点的子孙节点,则可以通过递归调用的方式,继续在子查询树查询该子查询节点的子孙节点。
select节点的子孙节点包括子查询节点、基础表达式节点和列名节点,若选取的第二节点是基础表达式节点时,可以在基础表达式树中生成基础表达式语句,该基础表达式语句作为第二节点对应的语句,用于生成子查询语句;若第二节点是列名节点,则可以通过目标数据库的元数据表进行随机选取得到列名。
from节点的子孙节点包括数据库中的表/视图/同义词节点、value表达式节点、table函数节点、子查询节点等;where节点的子孙节点包括条件判断表达式,当选取的第二节点是条件判断表达式节点时,可以根据布尔表达式树生成布尔表达式语句,该布尔表达式语句作为第二节点对应的语句,用于生成子查询语句;group by节点的子孙节点包括基础表达式节点和条件判断表达式节点,同样可以基于基础表达式树或布尔表达式树生成选取的第二节点对应的语句;value表达式可以指定列或变量,table函数可以与值函数联合使用,以返回表变量。
在基础操作语句标识是子查询标识时,可以在子查询树中随机选取第一节点和第二节点,以得到子查询语句,使得子查询语句的生成过程具有较强的随机性,提升了生成的子查询语句的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基础操作语句标识可以是赋值语句标识,相应地,基础操作语句可以是赋值语句。
具体地,赋值语句标识可以是表达式赋值语句标识,相应地,基础操作语句可以是表达式赋值语句。计算机设备在赋值变量列表中随机选择一个赋值变量作为左操作数,在变量和常量表达式中随机选取一个作为右操作数,根据左操作数和右操作数生成赋值语句;其中,常量表达式可以依据基础表达式树中的操作数节点生成。示例性地,表达式赋值语句为:var1:=1,左操作数是var1,右操作数是1(常量表达式)。
赋值语句标识可以是select into赋值操作标识,相应地,基础操作语句可以是select into赋值语句。计算机设备在赋值变量列表中选取一个赋值变量,根据子查询树的SELECT节点生成SELECT语句,根据SELECT语句和选取的赋值变量生成select into赋值语句;示例性地,select into赋值语句为:SELECT c1 INTO var1 FROM table WHERE c0>v1,其中,var1是选取一个赋值变量,c1是与var1相匹配的列的名称。
赋值语句标识可以是函数调用赋值语句标识,相应地,函数调用赋值语句可以是函数调用赋值语句;计算机设备在赋值变量列表中选取一个赋值变量,确定该赋值变量的类型,生成返回参数的类型与赋值变量的类型一致的函数,依据生成的函数和赋值变量确定函数调用赋值语句;示例性地,v1:=FUNC(exp1,exp2),其中,v1是选取一个赋值变量,FUNC(exp1,exp2)是选取的函数。
赋值语句是根据随机选取的复制变量或随机生成的基础表达式语句、函数得到的,使得赋值语句的生成过程的随机性很强,提升了赋值语句的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基础操作语句标识可以是DML操作标识,相应地,基础操作语句可以是DML操作语句;对于选取到的DML操作标识,可以在预设的最大语句数量的限制下,生成多个DML操作语句;DML操作语句包括数据库对象(表、视图和同义词)、基础表达式语句、子查询语句和布尔表达式语句,还可以包括关键字;数据对象可以在目标数据库中随机选取;基础表达式语句、子查询语句和布尔表达式语句的生成方式可以参考上述实施例中的说明。
在一些实施例中,基础操作语句标识可以是动态SQL操作语句标识,动态SQL操作语句标识可以是动态DML操作标识和存储过程调用标识;计算机设备可以依据上一实施例中的说明生成DML操作语句,通过USING子句提供参数值,该参数值可以是DML操作语句中的列相匹配;示例性地,动态SQL操作语句是EXECUTE IMMEDIATE 'UPDATE table SET c1 = :x' USING var1;USING子句可以用于指定两个表在进行自然连接时所使用的共同列。
动态SQL操作语句是基于随机生成的DML操作语句确定的,使得不同测试轮次生成的动态SQL操作语句不同,提升了动态SQL操作语句的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基础操作语句标识可以是游标操作语句标识,游标操作语句标识可以是显示游标操作语句标识、隐式游标操作语句标识和动态游标操作语句标识。
具体地,在选取到显示游标操作语句标识时,在声明语句块中增加游标变量定义语句,可以按照c1、c2定义,游标变量定义语句还包括select语句;显示游标操作语句标识包括打开游标语句标识(OPEN CURSOR)、读取数据语句标识(FOR LOOP,或FETCH BULKCOLLECT)和关闭游标语句标识(CLOSE CURSOR);FOR LOOP表示一种结构化循环,可以根据指定的次数或范围进行循环;对于FOR LOOP语句标识,根据游标返回的数据类型随机选取一个变量接收数据,如果未选取到,则在声明语句块中增加变量声明语句;FETCH BULKCOLLECT可以用于检索多行数据,对于FETCH BULK COLLECT语句标识,根据游标返回的变量类型,在声明语句块中增加集合数据类型声明语句。
示例性地,游标类型声明语句和显示游标操作语句可以是:
DECLARE
v_employees employees%ROWTYPE;
CURSOR c1 is SELECT * FROM employees;
BEGIN
OPEN c1;
FOR i IN 1..10 LOOP
其中,v_employees employees%ROWTYPE用于声明变量v_employees;CURSOR c1is SELECT * FROM employees用于声明游标c1,游标c1选择employees表中的所有行;OPENc1用于打开游标c1;FOR i IN 1..10 LOOP用于从游标c1中检索前10行数据,并将其存储在v_employees变量中。
在选取到隐式游标操作语句标识时,隐式游标操作语句标识包括SELECT语句标识和LOOP语句标识;LOOP用于实现一种循环,在遇到退出循环条件时停止执行。
依据SELECT语句标识或LOOP语句标识生成隐式游标操作语句的具体过程,可以参考上述实施例中对SELECT语句标识或FOR LOOP语句标识的说明。
在选取到动态游标操作语句标识时,在声明语句块中添加游标变量类型;动态游标操作语句标识可以是打开游标语句标识、读取数据语句标识(LOOP,或FETCH BULKCOLLECT),具体可参考上述显示游标操作语句标识的说明。
游标操作语句可以是显示游标操作语句、隐式游标操作语句或动态游标操作语句,使得生成的CURSOR操作语句有多种可能性,提升了数据库测试的覆盖率。
在一些实施例中,基础操作语句标识可以是调用操作标识,调用操作标识可以包括函数调用语句标识或存储过程调用语句标识;对于函数调用语句标识,可以在目标数据库中随机选择一个函数作为调用对象,依据选取的函数和函数的参数类型生成函数调用表达式;同样地,可以在目标数据库中随机选择一个存储过程作为调用对象,进而生成存储过程调用语句;通过随机选择提升了函数调用语句和存储过程调用语句的丰富度,进而提升了数据库测试的覆盖率。
在一些实施例中,基础操作语句标识可以是抛出异常语句标识(RAISEEXCEPTION),可以在声明语句块中定义一个异常变量,异常变量可以是随机产生的,以实现在出现异常变量时将该异常抛出。
在一些实施例中,依据概率表中的声明类语法结构下各语句标识对应的概率值之前,还包括:获取配置文件,依据配置文件进行环境预置,以构建测试所需环境。
具体地,配置文件包括:数据库对象配置信息、测试配置信息和环境参数配置信息;数据库对象配置信息包括表、视图、数据类型、函数、索引等配置信息,测试配置信息包括表中的数据量、子查询的最大递归深度、join表的最大数量、最大语句数量和概率表;配置文件可以是依据测试需求手动设置,也可以采用默认的配置文件。
依据配置文件进行环境预置,包括清理数据库环境,根据配置文件创建测试所需的数据库对象,根据数据类型和配置文件随机产生数据并插入到表中,再根据配置文件配置数据库环境参数。
在一些实施例中,数据库的测试方法还包括,获取目标数据库的元数据信息,元数据信息包括表名、列名、列的类型、视图、函数等,元数据信息可以用于生成PL/SQL语句块中的语句。
在一些实施例中,配置文件还包括测试时长阈值,数据库的测试方法还包括,在对目标数据库进行测试的时长达到测试时长阈值时,根据对目标数据库进行测试的多个测试轮次的执行结果生成测试报告并输出。
示例性地,如图11所示,数据库的测试方法可以通过测试工具实现,测试工具的输入是配置文件,输出为测试报告,在通过测试工具进行数据库测试时,需要调用目标数据库和参考数据库;通过测试工具进行环境预置、生成PL/SQL测试用例、执行PL/SQL测试用例,记录PL/SQL测试用例和执行结果,以及对记录的PL/SQL测试用例和执行结果进行测试分析,得到测试报告;当目标数据库和参考数据库存在语法差异时,测试工具还可以对PL/SQL测试用例进行语法转换,得到可以在目标数据库和参考数据库上执行的转换后PL/SQL测试用例。
示例性地,数据库的测试方法可以通过以下伪代码实现。
input :Database;RefDatabase;ConfgFile
output:plsgl block
1.Initialization enuironment;
2.meta_data←RetrieveMetaDatalDatabase);
3.prob_table ←InitProbabilityTable();
4.rule_confg-LoadConfg(ConfgFile);
5.while query_num< mar-query_num do;
6.plsql query-GeneratePlsgl(meta_data,prob_table,rule_confg);
7.ExecutPlsql (Database,plsql query);
8.ExecutPlsgl(RefDatabase,plsql query);
9.result CallPlsql(Database,plsql query);
10.resultref←CallPlsgl(RefDatabase,plsgl query);
11.prob_table←UpdateProbTablewithresult (plsqlquery,prob_table,result, resultref);
12.Procedure GENERATEPLsQL(meta_data,prob table,rule_config)
13.declarespec,declarevars←BuildDecSpecification (meta_data, prob_table,rule_confg);
14.bodyspec ←BuildBodySpecification (meta,data,prob_table,declarevars, rule.confg);
15.bodyspec ←ShuffeStmt(bodyspec);
16.excepspec ←BuildExcepSpecification (meta, data, prob_table,declarevars, rule_confg)
17.excepspec-ShuffleStmt(ezcpspec);
18.plsqlspec:BuildPlsqlBlock(declarespec,bodyspec,excpspec);
19.plsqlquery-SpectoPlsgl(plsglspec,case_scenarios);
20.return plsql query;
21.Procedure ExEcUTPLsqL(Database,plsgl query)
22.plsql query←PlsqlAdaption (Database,plsgl query,dialect);
23.Eexcute(Database,plsql query);
24.Procedure CALLPLsqL(Database,plsgl query)
25.callquery+AnalyzePlsql(plsql query);
26.result←Eexcute(Database,callquery);
27.return result;
28.Procedure UPDATEPROBTABLEWITHREsuLT(plsql query, prob_table,resut, resultref)
29.if ResultComp(result, resultref) then
30.global successnum ++;
31.if successnum >maxsuccessnum then
32.prob table ←UpdateProbTable(prob_table);
// If no bug has been triggered for long time, update theprobabilitytable to cover the new query space
33.else
34.reset successnum;
35.prob table←UpdateProbTable(prob_table,plsgl query);
//If the plsgl query can trigger a bug, the generator will extractthe keyclauses, and update the probability table so that it is more likely to
36.return prob_table;
其中,Database是目标数据库,RefDatabase是参考数据库,ConfgFile是配置文件;第1行代码用于配置测试所需环境,第2行代码用于从目标数据库中获取元数据信息,第3行代码用于初始化概率表;第4行代码用于从配置文件中加载配置信息,第5行代码用于表示一个循环,用于持续生成PL/SQL测试用例,直至PL/SQL测试用例的数量达到query_num;第6-11行代码用于生成PL/SQL测试用例,并对目标数据库进行测试;具体地,第6行代码用于生成PL/SQL测试用例,第7-10行代码,用于实现目标数据库执行PL/SQL测试用例,得到执行结果,以及参考数据库执行PL/SQL测试用例,并得到参考结果;第11行代码,用于实现根据执行结果和参考结果更新概率表。
第12-20行代码是第6行代码的具体实现过程;第21-23行代码是第7行代码的具体实现过程;第24-27行代码是第9行代码的具体实现过程;第28-36行代码是第11行代码的具体实现过程。
在一些实施例中,数据库的测试方法可以应用于测试目标数据库的oracle兼容性的场景中,在该场景下,参考数据库是oracle数据库;如图12所示,数据库的测试方法包括:
步骤1201,获取配置文件;
步骤1202,根据配置文件进行环境预置;
步骤1203,基于概率表生成PL/SQL测试用例;
步骤1204,分别在目标数据库和oracle数据库上执行PL/SQL测试用例,得到目标数据库对应的执行结果和oracle数据库对应的参考结果;
步骤1205,比较执行结果和参考结果是否一致,若不一致,则执行步骤1206,若一致则执行步骤1207;
需要说明的是,当在目标数据库执行测试用例得到的执行结果,与oracle数据库运行测试用例得到的参考结果一致时,表示目标数据库执行测试用例时涉及的数据,与oracle数据库兼容。
步骤1206,更新概率表中PL/SQL测试用例中语句的语句标识对应的概率值,执行步骤1210;
步骤1207,对正确累计次数进行调整;
步骤1208,判断调整后的正确累计次数是否满足表更新条件,若是,则执行步骤1209,若否,则执行步骤1210;
步骤1209,对概率表中的所有概率值进行随机更新,执行步骤1210;
步骤1210,判断对目标数据库进行测试的时长是否达到测试时长阈值,若否,则执行步骤1203,若是,则执行步骤1211;
步骤1211,根据测试用例和对应的执行结果产生测试报告。
在一些实施例中,如图13所示,数据库的测试方法包括:
步骤1301,在声明类语法结构下选择至少一个声明类子结构;在概率表中获取声明类子结构下各语句标识对应的概率值;依据声明类子结构下各语句标识对应的概率值选取声明语句标识;
步骤1302,根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;
步骤1303,在概率表中的基础操作层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选基础操作语句标识;在候选基础操作语句标识不存在子孙基础操作语句标识的情况下,将候选基础操作语句标识作为基础操作语句标识;在候选基础操作语句标识存在子孙基础操作语句标识,且子孙基础操作语句标识不存在对应概率值的情况下,通过随机种子在子孙基础操作语句标识中选取基础操作语句标识;
步骤1304,在概率表中的流程控制层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选流程控制语句标识;在候选流程控制语句标识不存在子孙流程控制语句标识的情况下,将候选流程控制语句标识作为流程控制语句标识;在候选流程控制语句标识存在子孙流程控制语句标识,且子孙流程控制语句标识不存在对应概率值的情况下,通过随机种子在子孙流程控制语句标识中选取流程控制语句标识;
步骤1305,在可执行类语法结构的语法树中,获取基础操作语句标识对应的基础操作子语法树;
步骤13061,基础操作子语法树包括基础表达式树;在基础表达式树的运算符节点、条件表达式节点、函数节点和操作数节点中,选取至少一个节点;依据至少一个节点生成基础表达式语句;基础操作语句包括基础表达式语句;
步骤13062,基础操作子语法树包括布尔表达式树;在布尔表达式树中选取至少一个比较运算符,并依据至少一个比较运算符生成至少一个比较表达式;在布尔表达式树中选取至少一个逻辑运算符;依据至少一个比较表达式和至少一个逻辑运算符生成布尔表达式;基础操作语句包括布尔表达式语句;
步骤1307,在可执行类语法结构的语法树中,获取流程控制语句标识对应的流程控制子语法树,并基于流程控制子语法树生成流程控制语句;依据基础操作语句和流程控制语句构建可执行语句块;
步骤1308,在声明语句块中选取异常变量;基于概率表中的可执行类语法结构下各语句标识对应的概率值,生成异常操作语句;基于异常变量和异常操作语句构建异常处理语句块;
步骤1309,基于声明语句块、可执行语句块和异常处理语句块构建测试用例;
步骤1310,采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果;采用测试用例对参考数据库进行测试,得到参考结果;当执行结果和参考结果一致时,确定执行结果满足正确条件;当执行结果和参考结果不一致时,确定执行结果不满足正确条件;
步骤13111,在执行结果不满足正确条件的情况下,获取测试用例中各语句的语句标识;增加概率表中各语句的语句标识对应的概率值;
步骤13112,在执行结果满足正确条件的情况下,对目标数据库当前的正确累计次数进行调整;当调整后的正确累计次数满足表更新条件时,对概率表中的各概率值进行更新。
上述数据库的测试方法中,根据概率表中各语句标识对应的概率值,选取声明语句标识、基础操作语句标识和流程控制语句标识,根据声明语句标识生成声明语句块,根据基础操作语句标识和流程控制语句标识构建可执行语句块,再根据声明语句块和可执行语句块构建测试用例,采用测试用例对目标数据库进行测试,得到执行结果;实现了自动构建PL/SQL类型的测试用例,提升了构建PL/SQL类型的测试用例的效率,进而提升了目标数据库的测试效率;在不同的测试轮次中,根据概率表中的概率值选取的各语句标识可能不同,进而可以根据各语句标识对应的语句构建不同的测试用例,提升了测试用例的丰富程度,可以提升数据库测试的覆盖率;此外,由于概率表中的概率值基于执行结果进行动态调整,使得语句标识被选取的概率发生变化,进而构建的测试用例更加丰富,进一步提升了数据库测试的覆盖率。
应该理解的是,虽然如上的各实施例所涉及的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,如上的各实施例所涉及的流程图中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
基于同样的发明构思,本申请实施例还提供了一种用于实现上述所涉及的数据库的测试方法的数据库的测试装置。该装置所提供的解决问题的实现方案与上述方法中所记载的实现方案相似,故下面所提供的一个或多个数据库的测试装置实施例中的具体限定可以参见上文中对于数据库的测试方法的限定,在此不再赘述。
在一些实施例中,如图14所示,提供了一种数据库的测试装置,包括:声明语句块生成模块1401、可执行语句块生成模块1402、测试用例构建模块1403和测试模块1404,其中:
声明语句块生成模块1401,用于依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;
可执行语句块生成模块1402,用于依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;
测试用例构建模块1403,用于基于声明语句块和可执行语句块构建测试用例;
测试模块1404,用于采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
在一些实施例中,数据库的测试装置还包括:概率值调整模块,用于在执行结果不满足正确条件的情况下,获取测试用例中各语句的语句标识;增加概率表中各语句的语句标识对应的概率值。
在一些实施例中,概率值调整模块,还用于在执行结果满足正确条件的情况下,对目标数据库当前的正确累计次数进行调整;当调整后的正确累计次数满足表更新条件时,对概率表中的各概率值进行更新。
在一些实施例中,数据库的测试装置还包括:结果比较模块,用于采用测试用例对参考数据库进行测试,得到参考结果;当执行结果和参考结果一致时,确定执行结果满足正确条件;当执行结果和参考结果不一致时,确定执行结果不满足正确条件。
在一些实施例中,声明语句块生成模块1401,还用于在声明类语法结构下选择至少一个声明类子结构;在概率表中获取声明类子结构下各语句标识对应的概率值;依据声明类子结构下各语句标识对应的概率值选取声明语句标识。
在一些实施例中,可执行类语法结构包括基础操作层级结构和流程控制层级结构;可执行语句块生成模块1402,还用于在概率表中的基础操作层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选基础操作语句标识;在候选基础操作语句标识不存在子孙基础操作语句标识的情况下,将候选基础操作语句标识作为基础操作语句标识;在候选基础操作语句标识存在子孙基础操作语句标识,且子孙基础操作语句标识不存在对应概率值的情况下,通过随机种子在子孙基础操作语句标识中选取基础操作语句标识;依据概率表中的流程控制层级结构下各语句标识对应的概率值,选取流程控制语句标识。
在一些实施例中,可执行语句块生成模块1402,还用于在概率表中的流程控制层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选流程控制语句标识;在候选流程控制语句标识不存在子孙流程控制语句标识的情况下,将候选流程控制语句标识作为流程控制语句标识;在候选流程控制语句标识存在子孙流程控制语句标识,且子孙流程控制语句标识不存在对应概率值的情况下,通过随机种子在子孙流程控制语句标识中选取流程控制语句标识。
在一些实施例中,可执行语句块生成模块1402,还用于在可执行类语法结构的语法树中,获取基础操作语句标识对应的基础操作子语法树,并基于基础操作子语法树生成基础操作语句;在可执行类语法结构的语法树中,获取流程控制语句标识对应的流程控制子语法树,并基于流程控制子语法树生成流程控制语句;依据基础操作语句和流程控制语句构建可执行语句块。
在一些实施例中,基础操作子语法树包括基础表达式树,基础操作语句包括基础表达式语句;可执行语句块生成模块1402,还用于在基础表达式树的运算符节点、条件表达式节点、函数节点和操作数节点中,选取至少一个节点;依据至少一个节点生成基础表达式语句。
在一些实施例中,基础操作子语法树包括布尔表达式树,基础操作语句包括布尔表达式语句;可执行语句块生成模块1402,还用于在布尔表达式树中选取至少一个比较运算符,并依据至少一个比较运算符生成至少一个比较表达式;在布尔表达式树中选取至少一个逻辑运算符;依据至少一个比较表达式和至少一个逻辑运算符生成布尔表达式语句。
在一些实施例中,数据库的测试装置还包括:异常处理语句块生成模块,用于在声明语句块中选取异常变量;基于概率表中的可执行类语法结构下各语句标识对应的概率值,生成异常操作语句;基于异常变量和异常操作语句构建异常处理语句块;相应地,测试用例构建模块1403,还用于基于声明语句块、可执行语句块和异常处理语句块构建测试用例。
在一些实施例中,测试用例构建模块1403,还用于基于声明语句块和可执行语句块,构建预设用例类型对应的过程化查询语句块;选取预设用例类型对应的参数类型,并基于预设用例类型和参数类型确定调用方式;依据过程化查询语句块和调用方式构建测试用例。
上述数据库的测试装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一些实施例中,提供了一种计算机设备,该计算机设备可以是服务器或终端,以该计算机设备是服务器进行举例说明,其内部结构图可以如图15所示。该计算机设备包括处理器、存储器、输入/输出接口(Input/Output,简称I/O)和通信接口。其中,处理器、存储器和输入/输出接口通过系统总线连接,通信接口通过输入/输出接口连接到系统总线。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质和内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储与数据库的测试方法相关的数据。该计算机设备的输入/输出接口用于处理器与外部设备之间交换信息。该计算机设备的通信接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种数据库的测试方法。
本领域技术人员可以理解,图15中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一些实施例中,提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现以下步骤:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
在一些实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
在一些实施例中,提供了一种计算机程序产品,包括计算机程序,该计算机程序被处理器执行时实现以下步骤:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据声明语句标识构建声明语句块;概率表中的概率值依据执行结果进行动态调整;依据概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于基础操作语句标识和流程控制语句标识生成可执行语句块;基于声明语句块和可执行语句块构建测试用例;采用测试用例对目标数据库进行测试,得到目标数据库在测试用例下的执行结果。
需要说明的是,本申请所涉及的用户信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于分析的数据、存储的数据、展示的数据等),均为经用户授权或者经过各方充分授权的信息和数据,且相关数据的收集、使用和处理需要符合相关规定。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-OnlyMemory,ROM)、磁带、软盘、闪存、光存储器、高密度嵌入式非易失性存储器、阻变存储器(ReRAM)、磁变存储器(Magnetoresistive Random Access Memory,MRAM)、铁电存储器(Ferroelectric Random Access Memory,FRAM)、相变存储器(Phase Change Memory,PCM)、石墨烯存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器等。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic RandomAccess Memory,DRAM)等。本申请所提供的各实施例中所涉及的数据库可包括关系型数据库和非关系型数据库中至少一种。非关系型数据库可包括基于区块链的分布式数据库等,不限于此。本申请所提供的各实施例中所涉及的处理器可为通用处理器、中央处理器、图形处理器、数字信号处理器、可编程逻辑器、基于量子计算的数据处理逻辑器等,不限于此。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本申请专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请的保护范围应以所附权利要求为准。
Claims (16)
1.一种数据库的测试方法,其特征在于,所述方法包括:
依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据所述声明语句标识构建声明语句块;所述概率表中的概率值依据执行结果进行动态调整;
依据所述概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于所述基础操作语句标识和所述流程控制语句标识生成可执行语句块;
基于所述声明语句块和所述可执行语句块构建测试用例;
采用所述测试用例对目标数据库进行测试,得到所述目标数据库在所述测试用例下的执行结果。
2.根据权利要求1所述的方法,其特征在于,所述采用所述测试用例对目标数据库进行测试,得到所述目标数据库在所述测试用例下的执行结果之后,还包括:
在所述执行结果不满足正确条件的情况下,获取所述测试用例中各语句的语句标识;
增加所述概率表中所述各语句的语句标识对应的概率值。
3.根据权利要求2所述的方法,其特征在于,所述采用所述测试用例对目标数据库进行测试,得到所述目标数据库在所述测试用例下的执行结果之后,还包括:
在所述执行结果满足所述正确条件的情况下,对所述目标数据库当前的正确累计次数进行调整;
当调整后的正确累计次数满足表更新条件时,对所述概率表中的各概率值进行更新。
4.根据权利要求3所述的方法,其特征在于,所述采用所述测试用例对目标数据库进行测试,得到所述目标数据库在所述测试用例下的执行结果之后,还包括:
采用所述测试用例对参考数据库进行测试,得到参考结果;
当所述执行结果和所述参考结果一致时,确定所述执行结果满足所述正确条件;
当所述执行结果和所述参考结果不一致时,确定所述执行结果不满足所述正确条件。
5.根据权利要求1所述的方法,其特征在于,所述依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,包括:
在声明类语法结构下选择至少一个声明类子结构;
在概率表中获取所述声明类子结构下各语句标识对应的概率值;
依据所述声明类子结构下各语句标识对应的概率值选取声明语句标识。
6.根据权利要求1所述的方法,其特征在于,所述可执行类语法结构包括基础操作层级结构和流程控制层级结构;
所述依据所述概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,包括:
在所述概率表中的所述基础操作层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选基础操作语句标识;
在所述候选基础操作语句标识不存在子孙基础操作语句标识的情况下,将所述候选基础操作语句标识作为基础操作语句标识;
在所述候选基础操作语句标识存在子孙基础操作语句标识,且所述子孙基础操作语句标识不存在对应概率值的情况下,通过随机种子在所述子孙基础操作语句标识中选取基础操作语句标识;
依据所述概率表中的所述流程控制层级结构下各语句标识对应的概率值,选取流程控制语句标识。
7.根据权利要求6所述的方法,其特征在于,所述依据所述概率表中的所述流程控制层级结构下各语句标识对应的概率值,选取流程控制语句标识,包括:
在所述概率表中的所述流程控制层级结构的各语句标识中,依据各语句标识的概率值进行逐层选取,得到候选流程控制语句标识;
在所述候选流程控制语句标识不存在子孙流程控制语句标识的情况下,将所述候选流程控制语句标识作为流程控制语句标识;
在所述候选流程控制语句标识存在子孙流程控制语句标识,且所述子孙流程控制语句标识不存在对应概率值的情况下,通过随机种子在所述子孙流程控制语句标识中选取流程控制语句标识。
8.根据权利要求1所述的方法,其特征在于,所述基于所述基础操作语句标识和所述流程控制语句标识生成可执行语句块,包括:
在所述可执行类语法结构的语法树中,获取所述基础操作语句标识对应的基础操作子语法树,并基于所述基础操作子语法树生成基础操作语句;
在所述可执行类语法结构的语法树中,获取所述流程控制语句标识对应的流程控制子语法树,并基于所述流程控制子语法树生成流程控制语句;
依据所述基础操作语句和所述流程控制语句构建可执行语句块。
9.根据权利要求8所述的方法,其特征在于,所述基础操作子语法树包括基础表达式树,所述基础操作语句包括基础表达式语句;
所述基于所述基础操作子语法树生成基础操作语句,包括:
在所述基础表达式树的运算符节点、条件表达式节点、函数节点和操作数节点中,选取至少一个节点;
依据所述至少一个节点生成所述基础表达式语句。
10.根据权利要求8所述的方法,其特征在于,所述基础操作子语法树包括布尔表达式树,所述基础操作语句包括布尔表达式语句;
所述基于所述基础操作子语法树生成基础操作语句,包括:
在所述布尔表达式树中选取至少一个比较运算符,并依据所述至少一个比较运算符生成至少一个比较表达式;
在所述布尔表达式树中选取至少一个逻辑运算符;
依据所述至少一个比较表达式和所述至少一个逻辑运算符生成所述布尔表达式语句。
11.根据权利要求1至10中任一项所述的方法,其特征在于,所述方法还包括:
在所述声明语句块中选取异常变量;
基于所述概率表中的可执行类语法结构下各语句标识对应的概率值,生成异常操作语句;
基于所述异常变量和所述异常操作语句构建异常处理语句块;
所述基于所述声明语句块和所述可执行语句块构建测试用例,包括:
基于所述声明语句块、所述可执行语句块和所述异常处理语句块构建测试用例。
12.根据权利要求1至10中任一项所述的方法,其特征在于,所述基于所述声明语句块和所述可执行语句块构建测试用例,包括:
基于所述声明语句块和所述可执行语句块,构建预设用例类型对应的过程化查询语句块;
选取所述预设用例类型对应的参数类型,并基于所述预设用例类型和所述参数类型确定调用方式;
依据所述过程化查询语句块和所述调用方式构建测试用例。
13.一种数据库的测试装置,其特征在于,所述装置包括:
声明语句块生成模块,用于依据概率表中的声明类语法结构下各语句标识对应的概率值,选取声明语句标识,并根据所述声明语句标识构建声明语句块;所述概率表中的概率值依据执行结果进行动态调整;
可执行语句块生成模块,用于依据所述概率表中的可执行类语法结构下各语句标识对应的概率值,选取基础操作语句标识和流程控制语句标识,并基于所述基础操作语句标识和所述流程控制语句标识生成可执行语句块;
测试用例构建模块,用于基于所述声明语句块和所述可执行语句块构建测试用例;
测试模块,用于采用所述测试用例对目标数据库进行测试,得到所述目标数据库在所述测试用例下的执行结果。
14.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至12中任一项所述的方法的步骤。
15.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至12中任一项所述的方法的步骤。
16.一种计算机程序产品,包括计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至12中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410298773.6A CN117891748A (zh) | 2024-03-15 | 2024-03-15 | 数据库的测试方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410298773.6A CN117891748A (zh) | 2024-03-15 | 2024-03-15 | 数据库的测试方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117891748A true CN117891748A (zh) | 2024-04-16 |
Family
ID=90643066
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410298773.6A Pending CN117891748A (zh) | 2024-03-15 | 2024-03-15 | 数据库的测试方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117891748A (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6138112A (en) * | 1998-05-14 | 2000-10-24 | Microsoft Corporation | Test generator for database management systems |
US6581052B1 (en) * | 1998-05-14 | 2003-06-17 | Microsoft Corporation | Test generator for database management systems |
CN113076250A (zh) * | 2021-04-14 | 2021-07-06 | 南京大学 | 一种带约束测试模型的动态随机测试方法及装置 |
CN114924966A (zh) * | 2022-05-25 | 2022-08-19 | 北京奥星贝斯科技有限公司 | 基于数据库pl语言的测试用例生成方法以及装置 |
CN115344500A (zh) * | 2022-08-30 | 2022-11-15 | 中国科学院软件研究所 | 面向关系型数据库中sql语句执行的自动化测试方法及装置 |
-
2024
- 2024-03-15 CN CN202410298773.6A patent/CN117891748A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6138112A (en) * | 1998-05-14 | 2000-10-24 | Microsoft Corporation | Test generator for database management systems |
US6581052B1 (en) * | 1998-05-14 | 2003-06-17 | Microsoft Corporation | Test generator for database management systems |
CN113076250A (zh) * | 2021-04-14 | 2021-07-06 | 南京大学 | 一种带约束测试模型的动态随机测试方法及装置 |
CN114924966A (zh) * | 2022-05-25 | 2022-08-19 | 北京奥星贝斯科技有限公司 | 基于数据库pl语言的测试用例生成方法以及装置 |
CN115344500A (zh) * | 2022-08-30 | 2022-11-15 | 中国科学院软件研究所 | 面向关系型数据库中sql语句执行的自动化测试方法及装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108038222B (zh) | 用于信息系统建模和数据访问的实体-属性框架的系统 | |
US9990362B2 (en) | Profiling data with location information | |
US9760571B1 (en) | Tabular DB interface for unstructured data | |
Gyorödi et al. | A comparative study of relational and non-relational database models in a web-based application | |
US7831632B2 (en) | Method and system for reconstruction of object model data in a relational database | |
US9747349B2 (en) | System and method for distributing queries to a group of databases and expediting data access | |
US7536406B2 (en) | Impact analysis in an object model | |
US7984031B2 (en) | Query builder for testing query languages | |
CN108595664A (zh) | 一种hadoop环境下的农业数据监控方法 | |
US20210191903A1 (en) | Generating hash trees for database schemas | |
Jayathilake et al. | A study into the capabilities of NoSQL databases in handling a highly heterogeneous tree | |
CN104462161A (zh) | 基于分布式数据库的结构化数据查询方法 | |
CN109885585A (zh) | 支持存储过程、触发器与视图的分布式数据库系统和方法 | |
US20230259518A1 (en) | Scalable metadata-driven data ingestion pipeline | |
CN114238085A (zh) | 接口测试方法、装置、计算机设备、存储介质 | |
US10162603B2 (en) | Loading data for iterative evaluation through SIMD registers | |
US20180074821A1 (en) | Iterative evaluation of data through simd processor registers | |
US10311051B1 (en) | Storing modeling alternatives with unitized data | |
Khalil et al. | New approach for implementing big datamart using NoSQL key-value stores | |
CN117891748A (zh) | 数据库的测试方法、装置、计算机设备和存储介质 | |
US9959295B1 (en) | S-expression based computation of lineage and change impact analysis | |
US11138174B2 (en) | Electronic database and method for forming same | |
CN112667859A (zh) | 基于内存的数据处理方法及装置 | |
US10198249B1 (en) | Accessing schema-free databases | |
Altın et al. | Analyzing the Encountered Problems and Possible Solutions of Converting Relational Databases to Graph Databases |
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 |