CN116383063A - 模拟数据生成方法、装置、计算机存储介质及电子设备 - Google Patents

模拟数据生成方法、装置、计算机存储介质及电子设备 Download PDF

Info

Publication number
CN116383063A
CN116383063A CN202310358135.4A CN202310358135A CN116383063A CN 116383063 A CN116383063 A CN 116383063A CN 202310358135 A CN202310358135 A CN 202310358135A CN 116383063 A CN116383063 A CN 116383063A
Authority
CN
China
Prior art keywords
data
data simulation
simulation
test task
script
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
Application number
CN202310358135.4A
Other languages
English (en)
Inventor
徐怡浩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Industrial and Commercial Bank of China Ltd ICBC
Original Assignee
Industrial and Commercial Bank of China Ltd ICBC
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Industrial and Commercial Bank of China Ltd ICBC filed Critical Industrial and Commercial Bank of China Ltd ICBC
Priority to CN202310358135.4A priority Critical patent/CN116383063A/zh
Publication of CN116383063A publication Critical patent/CN116383063A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-oriented languages
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Computing Systems (AREA)
  • Debugging And Monitoring (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)
  • Test And Diagnosis Of Digital Computers (AREA)

Abstract

本申请公开了一种模拟数据生成方法、装置、计算机存储介质及电子设备。涉及云计算领域。该方法包括:确定客户端的测试任务;接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。通过本申请,解决了相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题。

Description

模拟数据生成方法、装置、计算机存储介质及电子设备
技术领域
本申请涉及云计算领域,具体而言,涉及一种模拟数据生成方法、装置、计算机存储介质及电子设备。
背景技术
在相关技术中,在对业务系统的承压极限进行测试时,为避免调用外部系统,需要通过Mock模拟方法来模拟需要调用的外部系统的属性和行为,生成模拟数据。但在现有技术中,通常在服务端侧,通过搭建服务框架、梳理需要调用的外部系统的系统信息、在调用方进行调试、修改等一系列复杂的操作才能实施Mock模拟,该方法需要花费较高的资源成本,且需要在调试方内部进行配置修改,对于调用方来说业务侵入性较高。
针对相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题,目前尚未提出有效的解决方案。
发明内容
本申请提供一种模拟数据生成方法、装置、计算机存储介质及电子设备,以解决相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题。
根据本申请的一个方面,提供了一种模拟数据生成方法。该方法包括:确定客户端的测试任务;据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
可选的,在确定客户端的测试任务之后,还包括:基于测试任务,确定数据模拟组件接入位置,其中,数据模拟组件接入位置用于指示数据模拟组件在测试任务中的接入位置;基于测试任务,编写数据模拟脚本;基于数据模拟配置中心提供的配置管理接口,将数据模拟组件接入位置和数据模拟脚本,上传至数据模拟配置中心进行存储。
可选的,基于测试任务,编写数据模拟脚本,包括:确定测试任务需要的模拟数据的数据类型和数据格式;基于数据类型和数据格式,编写数据模拟脚本。
可选的,基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象,包括:基于数据模拟脚本,通过字符串拼接的方式在数据模拟组件内生成目标类源代码;对目标类源代码进行动态编译,得到目标类字节码;对目标类字节码进行实例化,得到数据模拟逻辑对象。
可选的,上述方法还包括:接收与测试任务对应的业务请求;基于业务请求,调用数据模拟逻辑对象,生成目标模拟数据,其中,目标模拟数据用于测试任务。
可选的,对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句,包括:采用字节码增强技术,对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
可选的,上述方法用于在对第一系统进行业务测试,且业务测试需要调用第二系统的情况下,生成与第二系统的数据格式对应的模拟数据。
根据本申请的另一方面,提供了一种模拟数据生成装置。该装置包括:确定模块,用于确定客户端的测试任务;接收模块,用于接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;接入模块,用于基于数据模拟组件接入位置,将数据模拟组件接入客户端;获取模块,用于从数据模拟配置中心获取数据模拟脚本;生成模块,用于基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;修改模块,用于对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
根据本发明实施例的另一方面,还提供了一种计算机存储介质,计算机存储介质用于存储程序,其中,程序运行时控制计算机存储介质所在的设备执行一种模拟数据生成方法。
根据本发明实施例的另一方面,还提供了一种电子设备,包含一个或多个处理器和存储器;存储器中存储有计算机可读指令,处理器用于运行计算机可读指令,其中,计算机可读指令运行时执行一种模拟数据生成方法。
通过本申请,采用以下步骤:确定客户端的测试任务;接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句,解决了相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题。进而达到了直接在客户端实现数据模拟的生成,而无需对目标测试系统进行调试修改,简化模拟数据生成的操作,提高模拟数据的生成效率,降低模拟数据生成所需资源成本的效果。
附图说明
构成本申请的一部分的附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1是根据现有技术提供的Mock方法示意图;以及
图2是根据本申请实施例提供的模拟数据生成方法的流程图;
图3是根据本申请可选实施方式提供的客户端Mock模块示意图;
图4是根据本申请可选实施方式提供的基于字节码增强的客户端Mock方法的整体流程图;
图5是根据本申请可选实施方式提供的Mock探针侧流程图;
图6是根据本申请实施例提供的模拟数据生成装置的示意图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
需要说明的是,本公开所涉及的相关信息(包括但不限于用户设备信息、用户个人信息等)和数据(包括但不限于用于展示的数据、分析的数据等),均为经用户授权或者经过各方充分授权的信息和数据。例如,本系统和相关用户或机构间设置有接口,在获取相关信息之前,需要通过接口向前述的用户或机构发送获取请求,并在接收到前述的用户或机构反馈的同意信息后,获取相关信息。
需要说明的是,本公开所确定的模拟数据生成方法、装置、计算机存储介质及电子设备可用于云计算领域,也可用于除云计算领域之外的任意领域,本公开所确定的模拟数据生成方法、装置、计算机存储介质及电子设备的应用领域不做限定。
为了解决相关技术在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题,相关技术中出现了以下方法:
现有的Mock技术中,针对外部调用的模拟一般以服务端Mock为主。需要进行测试的系统通过搭建Mock服务,来模拟将被调用的外部系统。Mock服务需要模拟外部系统的属性及行为,向调用方提供相同格式的接口及数据。
图1是根据现有技术提供的Mock方法示意图,服务端Mock实施过程一般分为Mock服务搭建、模拟接口数据定义、Mock服务部署、调用方调用目标修改四个步骤:
(1)Mock服务搭建步骤:调用方根据外系统提供的接口协议(HTTP、GRPC),选择合适的Mock服务实现架构,搭建Mock服务框架,亦可选择开源Mock服务端复用。
(2)模拟接口数据定义:调用方梳理本系统调用的外系统信息,包括外系统的接口、接口参数、接口返回值等信息,根据上述信息,定义模拟接口并编写模拟返回数据。
(3)Mock服务部署:调用方部署并运行Mock服务并对其模拟的接口进行调试确认。
(4)调用方调用目标修改:调用方对外系统调用的目标IP地址端口等信息进行修改,指向Mock服务。
但基于服务端Mock实现的Mock方法,需要搭建Mock服务器,资源成本较高;需要修改调用方对外系统调用的目标IP地址端口等信息,业务侵入性较大。
(1)资源成本较高
通过部署Mock服务来模拟外部系统的接口行为,需要调用方研发人员针对Mock服务进行技术选型、对模拟接口进行开发、对返回数据进行编写等,完成上述任务后,需要调用方提供设备资源供Mock服务的部署。这都增加了Mock的资源成本。
(2)业务侵入性较大
调用Mock服务需要调用方修改相应的运行配置,包括调用方系统中对外系统目的IP地址端口信息的配置,并重新部署调用方应用使其生效,具有较大的业务侵入性。
基于此,本申请希望提供一种能够解决上述技术问题的方案,其详细内容将在后续实施例中得以阐述。
为了便于描述,以下对本申请实施例涉及的部分名词或术语进行说明:
Mock,Mock是一种模拟方法,是以可控的方式模拟真实的对象行为。主要面向的场景包括但不限于:真实对象可能还不存在(接口还未完成开发)、真实对象很难搭建起来(第三方支付联调)、真实对象的行为很难触发(网络错误或硬件错误)以及真实对象的行为是不确定的。
服务端,B/S架构的网站类应用主要分为客户端和服务端两大部分,服务端是指在服务器中运行的部分,主要负责存储数据和处理应用业务逻辑。
客户端,B/S架构的网站类应用主要分为客户端和服务端两大部分,客户端是指在浏览器中运行的部分,主要是用户看到的页面并与之交互的界面程序。
字节码增强,字节码是一种经过编译的、由代码和数据组成、为了实现特定软件运行的二进制文件。最典型的字节码应用就是Java字节码,在运行时通过Java虚拟机做一次转换生成机器指令,因此能够更好的跨平台运行。字节码增强是对字节码文件进行改造生成一个新的字节码文件的一种方法,在字节码生成之后对其进行修改以增强其功能,这种方式相当于对应用程序的二进制文件进行修改。字节码增强主要目的是为了减少冗余代码、提高程序性能、增加特定功能等。
动态编译,动态编译技术是指在程序运行期间,能够动态完成源代码文件到字节码文件的编译转换的技术。Java的动态编译功能是从JDK1.6开始引入的,通过使用Java代码重写过的编译器接口可以在程序运行时编译Java源代码,然后再通过类加载器将编译好的类加载进JVM生效,是一种按需编译方法。
探针,Java探针是JDK提供的能够在无源代码侵入的情况下对应用追加某种特定功能的一种技术。Java探针是在JDK5之后提供的新特性,可以让我们在不修改程序代码的前提下通过Instrumentation API改变运行中的java程序。通过探针技术我们可以在加载java文件之前进行拦截并修改字节码,或者在运行期间修改已经加载的类的字节码,从而达到功能增强的目的。
根据本申请的实施例,提供了一种模拟数据生成方法。
图2是根据本申请实施例提供的模拟数据生成方法的流程图。如图2所示,该方法包括以下步骤:
步骤S202,确定客户端的测试任务;
步骤S204,接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;
步骤S206,基于数据模拟组件接入位置,将数据模拟组件接入客户端;
步骤S208,从数据模拟配置中心获取数据模拟脚本;
步骤S210,基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;
步骤S212,对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
本申请实施例采用探针技术,在客户端内设置数据模拟组件(即数据模拟探针),在客户端外设置数据模拟配置中心,在需要对目标测试系统执行测试任务时,由数据模拟组件从数据模拟配置中心获取数据模拟组件接入位置和数据模拟脚本,其中,数据模拟组件可以根据数据模拟组件接入位置接入客户端,即数据模拟组件可以在该位置处生成模拟数据,而数据模拟组件可以根据数据模拟脚本生成数据模拟逻辑对象,该数据模拟逻辑对象在执行状态下就可以对应生成测试任务中所需调用的模拟数据,之后通过对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句,就可以确保在测试任务执行过程中能够成功调用数据模拟逻辑对象,从而生成目标模拟数据。
需要说明的是,本申请实施例中的上述测试任务、数据模拟组件其本质可以是一组代码,通过在测试任务代码中插入对应的数据模拟组件代码,可以在测试任务代码的运行过程中通过调用数据模拟组件代码生成模拟数据。
可选地,在本申请实施例提供的模拟数据生成方法中,在确定客户端的测试任务之后,还包括:基于测试任务,确定数据模拟组件接入位置,其中,数据模拟组件接入位置用于指示数据模拟组件在测试任务中的接入位置;基于测试任务,编写数据模拟脚本;基于数据模拟配置中心提供的配置管理接口,将数据模拟组件接入位置和数据模拟脚本,上传至数据模拟配置中心进行存储。
在确定出客户端内需要执行的测试任务之后,需要基于测试任务,先确定出数据模拟组件在测试任务中的接入位置,并基于该测试任务编写用于生成模拟数据的数据模拟脚本,在确定出上述的接入位置和数据模拟脚本之后,本申请实施例并不直接将接入位置和数据模拟脚本发送至数据模拟组件,而是通过数据模拟配置中心提供的配置管理接口,上传至数据模拟配置中心进行存储,之后由数据模拟组件从数据模拟配置中心获取得到,若接入位置和/或数据模拟脚本需要更改调整,则可以通过数据模拟配置中心进行更改调整,其中,数据模拟组件在从数据模拟配置中心处获取接入位置和数据模拟脚本时,可以采用定时获取的方式,也可以仅在数据模拟组件接收到数据需求指令的情况下获取,等等。
需要说明的是,本申请实施例中的数据模拟配置中心除了可以对接入位置和数据模拟脚本进行存储和发送之外,还可以用于管理数据模拟组件的相关配置,例如,可以提供配置管理相关HTTP接口供用户在调用方进行调用,并设置数据模拟组件的接入位置和数据模拟脚本,还可以提供配置以获取HTTP接口供数据模拟组件获取数据模拟脚本,等等。
可选地,在本申请实施例提供的模拟数据生成方法中,基于测试任务,编写数据模拟脚本,包括:确定测试任务需要的模拟数据的数据类型和数据格式;基于数据类型和数据格式,编写数据模拟脚本。
在编写数据模拟脚本时,可以根据测试任务所需调用的模拟数据的数据类型和数据格式进行编写,保证数据模拟组件返回的目标模拟数据的准确性,例如,可以根据测试任务中的参数确定数据模拟组件的调用逻辑,也可以根据测试任务所需的数据类型确定数据模拟组件的返回值类型(如,字符,字符串,字段,类,对象,等等),还可以在编写脚本的过程中,通过引入数据构造工具来提升脚本的编写效率和准确性,(如,随机数生成工具,随机字符串生成工具,时间格式处理工具,字符串对象转换工具,等等)。
需要说明的是,在编写数据模拟脚本时,为提升效率,也可预先设置数据模拟组件的逻辑对象源码模板,通过利用该模板,用户仅需人工编写一部分脚本正文,即可和结合该模板直接生成数据模拟脚本。
可选地,在本申请实施例提供的模拟数据生成方法中,基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象,包括:基于数据模拟脚本,通过字符串拼接的方式在数据模拟组件内生成目标类源代码;对目标类源代码进行动态编译,得到目标类字节码;对目标类字节码进行实例化,得到数据模拟逻辑对象。
可选地,在本申请实施例提供的模拟数据生成方法中,上述方法还包括:接收与测试任务对应的业务请求;基于业务请求,调用数据模拟逻辑对象,生成目标模拟数据,其中,目标模拟数据用于测试任务。
当接收到与测试任务对应的业务请求时,测试任务开始执行,并基于测试任务中增加的用于调用数据模拟逻辑对象的调用语句,对数据模拟逻辑对象进行调用,数据模拟逻辑对象经调用后开始运行并在运行结束后返回生成的目标模拟数据,测试任务则可以利用该目标模拟数据继续进行测试。
可选地,在本申请实施例提供的模拟数据生成方法中,对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句,包括:采用字节码增强技术,对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
本申请实施例通过采用字节码增强技术对测试任务进行字节码层面上的修改,以在测试任务中增加对数据模拟逻辑对象的调用语句,其中,根据实际应用需求或用户的使用习惯,可以根据调用语句在测试任务中插入的位置进行设定,例如,可以将调用语句插入在测试任务的前面,这样在正式执行测试任务之前就可以完成目标模拟数据的生成,也可以根据测试任务中对于目标模拟数据的调用逻辑,将该调用语句插入在调用目标模拟数据的某一具体执行操作前,等等。
可选地,在本申请实施例提供的模拟数据生成方法中,上述方法用于在对第一系统进行业务测试,且业务测试需要调用第二系统的情况下,生成与第二系统的数据格式对应的模拟数据。
面对业务不断增长带来的日渐增大的访问压力,越来越多的企业开始实践生产环境的压力测试,期望从中获得自身业务系统的承压极限。在生产环境执行压测,压测流量经过的系统链路与正常业务流量是完全一致的。若被压测的系统链路中存在对外部系统的调用,在压测场景下调用外部系统可能会造成不必要的麻烦,而本申请实施例所提出的模拟数据生成方法可以在需要调用外部系统(即第二系统)所产生的数据时,直接在当前的测试系统(即第一系统)中生成与外部系统格式一致的模拟数据,该模拟数据可以直接被第一系统用于测试调用,而不需要与第二系统发生真正的数据调用或信息交互,等等。
需要说明的是,本申请实施例可以用于实现客户端Mock。
其中,Mock是在测试活动中发展而来的,旨在通过一个虚拟的对象来模拟一个外来的或不容易构造的对象,并模拟该对象的各种属性及行为,从而实现对外部依赖的暂时隔离。但现有技术中的Mock通常基于服务端实现,需要的资源成本较高,对于执行测试任务的系统来说业务侵入性也较大。
针对上述问题,通过本申请实施例的方法可以实现客户端Mock,即,通过采用探针技术,设置Mock配置中心(即本申请实施例中的数据模拟组件)和Mock探针(即本申请实施例中的数据模拟配置中心),首先在客户端确定需要用到模拟数据的测试任务,将与该测试任务对应的Mock规则和脚本传输至Mock配置中心,Mock探针通过Mock注入点接入客户端,Mock探针从Mock配置中心获取Mock规则和脚本,基于该规则和脚本形成Mock逻辑对象,利用字节码增强技术对测试任务进行字节码层面的修改,在测试任务中增加对Mock逻辑对象的调用语句,最后基于业务请求执行测试任务,完成对Mock逻辑的调用。
通过上述方法,可以实现Mock的接入与应用解耦,即无需对执行测试任务的系统进行调试、修改等对接改造操作,也不必搭建服务框架、梳理需要调用的外部系统的系统信息,大大节省了应用引入额外依赖并进行接入开发的相关工作,业务侵入性大大降低,且仅需部署少量Mock配置中心节点,所有Mock脚本配置相关工作均通过远程配置实时生效,无需部署被调用Mock服务端,Mock逻辑在应用节点内部,大大节省了资源成本。
本申请实施例提供的模拟数据生成方法,通过确定客户端的测试任务;接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句,解决了相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题。进而达到了直接在客户端实现数据模拟的生成,而无需对目标测试系统进行调试修改,简化模拟数据生成的操作,提高模拟数据的生成效率,降低模拟数据生成所需资源成本的效果。
根据上述实施例及可选实施例,本申请还提出了一种可选实施方式,下面进行说明。
本申请可选实施方式提出一种基于字节码增强的客户端Mock方法。本申请基于Java字节码增强技术与Java类动态编译技术实现客户端Mock探针,利用JavaWeb技术实现并部署Mock配置中心,串联起应用节点接入、Mock脚本配置下发至Mock注入生效的整体流程,最终实现客户端Mock,克服了现有服务端Mock方式对资源依赖成本高、对业务侵入性较大的问题,提供一种应用简单、实施成本较低的方法。
图3是根据本申请可选实施方式提供的客户端Mock模块示意图,如图3所示,本申请可选实施方式整体由Mock配置中心和Mock探针两个模块组成。Mock探针对接应用节点,通过Mock配置中心拉取Mock配置后,将Mock执行逻辑注入应用节点,形成Mock注入点,后续Mock逻辑均由Mock注入点执行。
其中,Mock配置中心基于Java Web架构搭建,负责管理Mock配置,提供配置管理相关HTTP接口供调用方业务研发人员调用并设置Mock规则、Mock脚本等信息;提供配置获取HTTP接口供Mock探针拉取Mock规则脚本信息。
其中,Mock探针基于Java Agent架构实现,应用节点接入探针后,探针将作为应用节点的一部分即与应用节点在同一个进程运行。Mock探针负责从Mock配置中心定时拉取当前接入应用节点的Mock规则,而后根据Mock规则中Mock脚本动态生成Java对象实例,并利用字节码增强技术实现目标方法字节码层面的修改,将Mock调用逻辑添加至目标方法中。
图4是根据本申请可选实施方式提供的基于字节码增强的客户端Mock方法的整体流程图,如图4所示,本申请可选实施方式的流程如下:
(1)Mock规则设置及脚本编写
由应用节点的业务研发人员确定需要Mock的位点(即Mock探针的接入位置),并编写基于Java语言的Mock脚本,通过Mock配置中心提供的Mock配置管理接口,上传并设置Mock规则及脚本。Mock配置中心将Mock规则脚本写入数据表进行存储。
其中,Mock规则即用于确定Mock探针所要接入的应用节点,也就是本申请实施例中的接入位置。
(2)探针拉取Mock规则及动态Java对象生成
接入应用节点的探针作为应用节点进程的一部分运行,探针通过Mock配置管理接口拉取已入表存储的Mock规则,并根据规则中配置的Mock脚本,通过字符串拼接方式形成Java类源代码,随后利用Java语言提供的动态编译API(javax.tools.JavaCompiler)对源代码进行动态编译形成类字节码并使用应用类加载器加载之,最后通过实例化动态获取Java对象实例,该对象实例即可实际运行Mock逻辑的对象。
(3)目标方法修改及Mock逻辑注入
探针根据Mock规则配置的目标方法,在应用节点Java进程中获取目标方法所在类,并通过字节码增强技术对该目标类型进行重定义,也就是通过字节码增强技术,修改该类原始字节码,在目标方法执行前增加对Mock逻辑对象调用的语句,最后将修改后字节码提交并通过类加载器重新加载使之生效。
(4)Mock生效,业务请求执行Mock逻辑
应用节点接收业务请求,目标方法执行Mock逻辑,调用Mock逻辑对象,最终返回模拟数据。
基于上述流程,下面从Mock探针侧对该过程进行说明,图5是根据本申请可选实施方式提供的Mock探针侧流程图,如图5所示,基于Mock逻辑对象源码模板,通过字符串拼接替换,将Mock脚本插入模板转换为Mock逻辑Java对象源码。利用JavaCompiler动态编译技术,将Mock逻辑Java对象源码编译为类字节码,并通过对象实例化,实例化Mock逻辑对象后,使用字节码增强工具,对需要注入Mock逻辑的目标方法进行字节码层面的修改,添加Mock逻辑对象调用语句,最后将修改后字节码提交并通过类加载器重新加载使之生效,完成Mock流程。
Mock脚本分成两部分,一部分是以import开头的引入类型申明,代表该脚本需要使用到的类型申明;另一部分是脚本逻辑正文,最终以return返回语句结束。格式示例如下:
Figure BDA0004164159390000111
Mock逻辑对象源码模板如下:
Figure BDA0004164159390000112
其中##{IMPORT_CODE}为引入申明替换符,代表Mock类需要引入的外部类型申明,Mock脚本中第一部分import申明将会替换其中;##{MOCK_CODE}为逻辑代码正文,代表Mock主要逻辑,Mock脚本中第二部分脚本逻辑正文将会替换其中。
最终Mock逻辑对象的调用,将会以(实例名.doMock)的方法调用形式,通过字节码增强的方式插入到需要Mock的目标方法中,增强后的目标方法初始语句将会是Mock逻辑调用,示例如下:
Figure BDA0004164159390000121
字节码增强本质上是对已被Java虚拟机加载的类型字节码进行修改,主要操作的目标是类的字节码数组,在本方法中,可通过开源字节码增强工具javassist实现,目标方法的Mock插入操作通过调用其CtMethod#insertBefore方法,在目标方法原有逻辑执行前执行Mock方法。
Mock脚本由以import开头的引入类型申明和以return返回语句结束的脚本逻辑正文两部分组成,使用语法与Java语言语法完全相同。
1、引入类型申明:在脚本正文中,引入的Java类型需通过import语句显示引入。例如,脚本正文需要将字符串以ArrayList列表的形式作为返回值返回,则需要添加引入申明:import java.util.ArrayList;
2、脚本逻辑正文:脚本逻辑正文与正常Java程序代码的方法体正文格式一致,最终需将模拟的返回值数据,通过return语句返回。
另外,在本申请可选实施方式中,Mock返回值通过编写的脚本进行构造,由应用研发人员根据目标方法的返回值类型、目标方法上下文综合判断得出。返回值的准确性通过以下三点保障:
1、目标方法参数:
目标方法入参,通过args数组形式,提供给脚本正文使用,应用研发人员可根据运行时参数情况,判断目标方法需处理的Mock逻辑。以表数据分页查询为例,目标方法一般含有分页查询页码、页大小等参数,应用研发人员需判断请求页大小,在Mock脚本正文中组装对应大小的返回值列表返回。
2、目标方法返回值类型
业务研发人员需对Mock的目标方法返回值有一个比较清晰的了解,包括返回值类型、返回值拥有哪些属性字段等等,从而在Mock脚本中正确构造返回值对象。例如,当返回值为对象类型时,Mock脚本需包含类型引入申明、返回对象实例化语句、返回对象属性设置语句等,确保返回对象可用。
3、提供数据构造工具
业务研发人员编写Mock脚本时,在某些情况下需要对返回数据通过随机方式构造,或者将字符串转换为对象格式。Mock探针提供一系列数据构造工具来满足这些特殊的数据构造需求,例如随机数生成工具、随机字符串生成工具、时间格式处理工具、字符串对象转换工具等等。上述工具都可通过Mock脚本正文直接引入使用,将会大大简化Mock脚本的编写开发过程。
综上,本申请可选实施方式基于Java字节码增强技术和JavaCompiler动态编译技术,通过探针方式,将Mock接入与应用解耦;利用模板化的Mock脚本与多样的数据构造工具结合,提供了一种在客户端实现Mock的方法。相较于现有的服务端Mock技术,具有业务侵入性低、资源成本较低等优势。
1、业务侵入性低
应用节点通过探针方式接入Mock,仅需部署探针介质、修改启动脚本后重启节点即可,业务代码无需进行对接改造,大大节省了应用引入额外依赖并进行接入开发的相关工作,业务侵入性大大降低。
2、资源成本较低
本申请可选实施方式仅需部署少量Mock配置中心节点,所有Mock脚本配置相关工作均通过远程配置实时生效,无需部署被调用Mock服务端,Mock逻辑在应用节点内部,大大节省了资源成本。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本申请实施例还提供了一种模拟数据生成装置,需要说明的是,本申请实施例的模拟数据生成装置可以用于执行本申请实施例所提供的用于模拟数据生成方法。以下对本申请实施例提供的模拟数据生成装置进行介绍。
图6是根据本申请实施例提供的模拟数据生成装置的示意图。如图6所示,该装置包括:确定模块61,接收模块62,接入模块63,获取模块64,生成模块65和修改模块66,下面对该装置进行介绍。
确定模块61,用于确定客户端的测试任务;接收模块62,连接至上述确定模块61,用于接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;接入模块63,连接至上述接收模块62,用于基于数据模拟组件接入位置,将数据模拟组件接入客户端;获取模块64,连接至上述接入模块63,用于从数据模拟配置中心获取数据模拟脚本;生成模块65,连接至上述获取模块64,用于基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;修改模块66,连接至上述生成模块65,用于对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
可选地,在本申请实施例提供的模拟数据生成装置中,还包括:第一确定单元,用于基于测试任务,确定数据模拟组件接入位置,其中,数据模拟组件接入位置用于指示数据模拟组件在测试任务中的接入位置;第一编写单元,用于基于测试任务,编写数据模拟脚本;上传单元,用于基于数据模拟配置中心提供的配置管理接口,将数据模拟组件接入位置和数据模拟脚本,上传至数据模拟配置中心进行存储。
可选地,在本申请实施例提供的模拟数据生成装置中,第一编写单元包括:第二确定单元,用于确定测试任务需要的模拟数据的数据类型和数据格式;第二编写单元,用于基于数据类型和数据格式,编写数据模拟脚本。
可选地,在本申请实施例提供的模拟数据生成装置中,生成模块65包括:第一生成单元,用于基于数据模拟脚本,通过字符串拼接的方式在数据模拟组件内生成目标源代码;编译单元,用于对源代码进行动态编译,得到目标类字节码;实例化单元,用于对目标类字节码进行实例化,得到数据模拟逻辑对象。
可选地,在本申请实施例提供的模拟数据生成装置中,还包括:接收单元,用于接收与测试任务对应的业务请求;第二生成单元,用于基于业务请求,调用数据模拟逻辑对象,生成目标模拟数据,其中,目标模拟数据用于测试任务。
可选地,在本申请实施例提供的模拟数据生成装置中,修改模块66包括:修改单元,用于采用字节码增强技术,对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
可选地,本申请实施例提供的模拟数据生成装置用于在对第一系统进行业务测试,且业务测试需要调用第二系统的情况下,生成与第二系统的数据格式对应的模拟数据。
本申请实施例提供的模拟数据生成装置,通过确定客户端的测试任务;接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句,解决了相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题,进而达到了直接在客户端实现数据模拟的生成,而无需对目标测试系统进行调试修改,简化模拟数据生成的操作,提高模拟数据的生成效率,降低模拟数据生成所需资源成本的效果。
上述模拟数据生成装置包括处理器和存储器,上述确定模块61,接收模块62,接入模块63,获取模块64,生成模块65和修改模块66等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。
处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来解决相关技术中在生成与外部系统对应的模拟数据时所需资源成本高、对于目标测试系统的业务侵入性大的问题,进而达到直接在客户端实现数据模拟的生成,而无需对目标测试系统进行调试修改,简化模拟数据生成的操作,提高模拟数据的生成效率,降低模拟数据生成所需资源成本的效果。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。
本发明实施例提供了一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时实现所述模拟数据生成方法。
本发明实施例提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行所述模拟数据生成方法。
如图3所示,本发明实施例提供了一种电子设备,电子设备70包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现以下步骤:确定客户端的测试任务;接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。本文中的设备可以是服务器、PC、PAD、手机等。
本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有如下方法步骤的程序:确定客户端的测试任务;接收来自客户端外的数据模拟配置中心的数据模拟组件接入位置;基于数据模拟组件接入位置,将数据模拟组件接入客户端;从数据模拟配置中心获取数据模拟脚本;基于数据模拟脚本,在数据模拟组件内生成数据模拟逻辑对象;对测试任务进行字节码层面的修改,在测试任务中增加用于调用数据模拟逻辑对象的调用语句。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (10)

1.一种模拟数据生成方法,其特征在于,包括:
确定客户端的测试任务;
接收来自所述客户端外的数据模拟配置中心的数据模拟组件接入位置;
基于所述数据模拟组件接入位置,将数据模拟组件接入所述客户端;
从所述数据模拟配置中心获取数据模拟脚本;
基于所述数据模拟脚本,在所述数据模拟组件内生成数据模拟逻辑对象;
对所述测试任务进行字节码层面的修改,在所述测试任务中增加用于调用所述数据模拟逻辑对象的调用语句。
2.根据权利要求1所述的方法,其特征在于,在所述确定客户端的测试任务之后,还包括:
基于所述测试任务,确定所述数据模拟组件接入位置,其中,所述数据模拟组件接入位置用于指示所述数据模拟组件在所述测试任务中的接入位置;
基于所述测试任务,编写所述数据模拟脚本;
基于所述数据模拟配置中心提供的配置管理接口,将所述数据模拟组件接入位置和所述数据模拟脚本,上传至所述数据模拟配置中心进行存储。
3.根据权利要求2所述的方法,其特征在于,所述基于所述测试任务,编写所述数据模拟脚本,包括:
确定所述测试任务需要的模拟数据的数据类型和数据格式;
基于所述数据类型和所述数据格式,编写所述数据模拟脚本。
4.根据权利要求1所述的方法,其特征在于,所述基于所述数据模拟脚本,在所述数据模拟组件内生成数据模拟逻辑对象,包括:
基于所述数据模拟脚本,通过字符串拼接的方式在所述数据模拟组件内生成目标类源代码;
对所述目标类源代码进行动态编译,得到目标类字节码;
对所述目标类字节码进行实例化,得到所述数据模拟逻辑对象。
5.根据权利要求1所述的方法,其特征在于,所述方法还包括:
接收与所述测试任务对应的业务请求;
基于所述业务请求,调用所述数据模拟逻辑对象,生成目标模拟数据,其中,所述目标模拟数据用于所述测试任务。
6.根据权利要求1所述的方法,其特征在于,所述对所述测试任务进行字节码层面的修改,在所述测试任务中增加用于调用所述数据模拟逻辑对象的调用语句,包括:
采用字节码增强技术,对所述测试任务进行字节码层面的修改,在所述测试任务中增加用于调用所述数据模拟逻辑对象的调用语句。
7.根据权利要求1至6中任意一项所述的方法,其特征在于,所述方法用于在对第一系统进行业务测试,且所述业务测试需要调用第二系统的情况下,生成与所述第二系统的数据格式对应的模拟数据。
8.一种模拟数据生成装置,其特征在于,包括:
确定模块,用于确定客户端的测试任务;
接收模块,用于接收来自所述客户端外的数据模拟配置中心的数据模拟组件接入位置;
接入模块,用于基于所述数据模拟组件接入位置,将数据模拟组件接入所述客户端;
获取模块,用于从所述数据模拟配置中心获取数据模拟脚本;
生成模块,用于基于所述数据模拟脚本,在所述数据模拟组件内生成数据模拟逻辑对象;
修改模块,用于对所述测试任务进行字节码层面的修改,在所述测试任务中增加用于调用所述数据模拟逻辑对象的调用语句。
9.一种计算机存储介质,其特征在于,所述计算机存储介质用于存储程序,其中,所述程序运行时控制所述计算机存储介质所在的设备执行权利要求1至7中任意一项所述的模拟数据生成方法。
10.一种电子设备,其特征在于,包括一个或多个处理器和存储器,所述存储器用于存储一个或多个程序,其中,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现权利要求1至7中任意一项所述的模拟数据生成方法。
CN202310358135.4A 2023-04-04 2023-04-04 模拟数据生成方法、装置、计算机存储介质及电子设备 Pending CN116383063A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310358135.4A CN116383063A (zh) 2023-04-04 2023-04-04 模拟数据生成方法、装置、计算机存储介质及电子设备

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310358135.4A CN116383063A (zh) 2023-04-04 2023-04-04 模拟数据生成方法、装置、计算机存储介质及电子设备

Publications (1)

Publication Number Publication Date
CN116383063A true CN116383063A (zh) 2023-07-04

Family

ID=86978352

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310358135.4A Pending CN116383063A (zh) 2023-04-04 2023-04-04 模拟数据生成方法、装置、计算机存储介质及电子设备

Country Status (1)

Country Link
CN (1) CN116383063A (zh)

Similar Documents

Publication Publication Date Title
US11010283B2 (en) Mock-based unit test(s) for an end-to-end test of a code snippet
US9678726B1 (en) Automatic generation of plugins for development tools
US8615750B1 (en) Optimizing application compiling
US10209968B2 (en) Application compiling
US7996816B2 (en) Method and apparatus for dynamically binding service component implementations for specific unit test cases
US10489274B2 (en) Using emulation to disassociate verification from stimulus in functional test
US8640104B2 (en) Computer method and apparatus for debugging in a dynamic computer language
KR101246967B1 (ko) 어플리케이션 호스트 환경에서 유닛 테스트를 실행하기 위한 방법 및 장치
JP5415557B2 (ja) デバッギングのためのユーザ・スクリプト・コードの変換
US8166347B2 (en) Automatic testing for dynamic applications
US20130167123A1 (en) Application debugging
US20090265368A1 (en) Automatic generation of user interfaces
US8607203B1 (en) Test automation framework using dependency injection
US8572554B2 (en) Method and system for integrating Java and JavaScript technologies
CN102667730A (zh) 设计时调试
US20170242665A1 (en) Generation of hybrid enterprise mobile applications in cloud environment
CN105378658A (zh) 自动源代码生成
US8904346B1 (en) Method and system for automated load testing of web applications
CN117112060A (zh) 组件库构建方法、装置、电子设备及存储介质
CN113778897B (zh) 接口的自动测试方法、装置、设备及存储介质
Zafar et al. Sol2js: translating solidity contracts into javascript for hyperledger fabric
CN111367512B (zh) 一种应用程序开发中创建Android库模块依赖关系的方法及装置
US9489179B2 (en) Application programming interface tracing mechanism
Wood et al. Triton: a domain specific language for cyber-physical systems
Zein et al. Static analysis of android apps for lifecycle conformance

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