CN113760701A - 测试处理方法及装置 - Google Patents

测试处理方法及装置 Download PDF

Info

Publication number
CN113760701A
CN113760701A CN202010819885.3A CN202010819885A CN113760701A CN 113760701 A CN113760701 A CN 113760701A CN 202010819885 A CN202010819885 A CN 202010819885A CN 113760701 A CN113760701 A CN 113760701A
Authority
CN
China
Prior art keywords
mock
class
bytecode
test
application
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
CN202010819885.3A
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.)
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
Original Assignee
Beijing Jingdong Century Trading Co Ltd
Beijing Wodong Tianjun Information Technology Co Ltd
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 Beijing Jingdong Century Trading Co Ltd, Beijing Wodong Tianjun Information Technology Co Ltd filed Critical Beijing Jingdong Century Trading Co Ltd
Priority to CN202010819885.3A priority Critical patent/CN113760701A/zh
Publication of CN113760701A publication Critical patent/CN113760701A/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

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

本申请实施例提供一种测试处理方法及装置,该方法包括:接收测试管理后台发送的测试事件的信息,其中,测试事件的信息包括加载路径、第一类的关键字、第一方法的签名。根据加载路径,获取第二类,其中,第二类中包括第二方法。根据第一类的关键字,获取第一类的字节码。从第一类的字节码中获取第一方法对应的第一字节码,并将第一字节码替换为第二类的第二字节码,得到mock处理后的第一方法。接收针对mock处理后的第一方法的第一请求,并返回mock数据。通过将第一方法对应的字节码替换为第二方法对应的字节码,以在无需入侵应用程序的代码的情况下实现MockServer,有效降低了MockServer的实现复杂度。

Description

测试处理方法及装置
技术领域
本申请实施例涉及计算机技术,尤其涉及一种测试处理方法及装置。
背景技术
Mock(模拟)测试是指在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
其中,MockServer是用于实现Mock功能的一个服务,现有技术在实现MockServer时,通常是在应用程序中置入Mock规则,以及接口各种协议的Mock实现,从而可以在应用程序的测试过程中,匹配相应的mock规则,从而返回接口相应协议的mock实现。
然而,上述实现方式需要侵入应用程序的代码,对应用程序的代码进行修改,从而导致MockServer的实现复杂度较高。
发明内容
本申请实施例提供一种测试处理方法及装置,以克服MockServer的实现复杂度较高的问题。
第一方面,本申请实施例提供一种测试处理方法,应用于第一应用,包括:
接收测试管理后台发送的测试事件的信息,其中,所述测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,所述第一方法为所述第一类中的方法,所述第一方法为所述第一应用中需要进行mock处理的方法;
根据所述加载路径,获取第二类,其中,所述第二类中包括第二方法,所述第二方法为用于实现对所述第一方法的mock处理;
根据所述第一类的关键字,获取所述第一类的字节码;
从所述第一类的字节码中获取所述第一方法对应的第一字节码,并将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一方法;
接收针对所述mock处理后的第一方法的第一请求,并返回mock数据。
在一种可能的设计中,所述测试事件的信息还包括进程关键字;
所述方法还包括:
根据所述进程关键字,在所述第一应用的多个进程中确定目标进程。
在一种可能的设计中,所述将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一方法,包括:
针对所述目标进程,所述第一应用擦写所述目标进程中的所述第一字节码;
所述第一应用将所述第二字节码作为所述第一方法对应的新的字节码,得到mock处理后的第一方法。
在一种可能的设计中,所述方法还包括:
获取所述第二类的字节码,并将所述第二类的字节码保存至所述第一应用的内存中。
在一种可能的设计中,所述根据所述加载路径,获取第二类之后,所述方法还包括:
对所述第二类中的第二方法进行校验;
若所述第二方法校验不通过,则向所述测试管理后台发送指示信息,其中,所述指示信息用于指示所述测试事件的执行状态为启动失败。
在一种可能的设计中,所述对所述第二类中的第二方法进行校验,包括:
对所述第二方法的元注解信息进行校验。
在一种可能的设计中,所述接收测试管理后台发送的测试事件的信息,包括:
所述第一应用通过超文本传输协议HTTP协议接收所述测试管理后台的事件路由器发送的测试事件的信息。
第二方面,本申请实施例提供一种测试处理装置,应用于第一应用,包括:
接收模块,用于接收测试管理后台发送的测试事件的信息,其中,所述测试事件的信息包括加载路径、第一类的关键字、第一装置的签名,其中,所述第一装置为所述第一类中的装置,所述第一装置为所述第一应用中需要进行mock处理的装置;
获取模块,用于根据所述加载路径,获取第二类,其中,所述第二类中包括第二装置,所述第二装置为用于实现对所述第一装置的mock处理;
所述获取模块,还用于根据所述第一类的关键字,获取所述第一类的字节码;
处理模块,用于从所述第一类的字节码中获取所述第一装置对应的第一字节码,并将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一装置;
所述接收模块,还用于接收针对所述mock处理后的第一装置的第一请求,并返回mock数据。
在一种可能的设计中,所述测试事件的信息还包括进程关键字;
所述处理模块还用于:
根据所述进程关键字,在所述第一应用的多个进程中确定目标进程。
在一种可能的设计中,所述处理模块具体用于:
针对所述目标进程,所述第一应用擦写所述目标进程中的所述第一字节码;
所述第一应用将所述第二字节码作为所述第一装置对应的新的字节码,得到mock处理后的第一装置。
在一种可能的设计中,所述获取模块还用于:
获取所述第二类的字节码,并将所述第二类的字节码保存至所述第一应用的内存中。
在一种可能的设计中,所述处理模块还用于:
在根据所述加载路径,获取第二类之后,对所述第二类中的第二装置进行校验;
若所述第二装置校验不通过,则向所述测试管理后台发送指示信息,其中,所述指示信息用于指示所述测试事件的执行状态为启动失败。
在一种可能的设计中,所述处理模块具体用于:
对所述第二装置的元注解信息进行校验。
在一种可能的设计中,所述接收模块具体用于:
所述第一应用通过超文本传输协议HTTP协议接收所述测试管理后台的事件路由器发送的测试事件的信息。
第三方面,本申请实施例提供一种测试处理设备,包括:
存储器,用于存储程序;
处理器,用于执行所述存储器存储的所述程序,当所述程序被执行时,所述处理器用于执行如上第一方面以及第一方面各种可能的设计中任一所述的方法。
第四方面,本申请实施例提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行如上第一方面以及第一方面各种可能的设计中任一所述的方法。
本申请实施例提供一种测试处理方法及装置,该方法包括:接收测试管理后台发送的测试事件的信息,其中,测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,第一方法为第一类中的方法,第一方法为第一应用中需要进行mock处理的方法。根据加载路径,获取第二类,其中,第二类中包括第二方法,第二方法为用于实现对第一方法的mock处理。根据第一类的关键字,获取第一类的字节码。从第一类的字节码中获取第一方法对应的第一字节码,并将第一字节码替换为第二类的第二字节码,得到mock处理后的第一方法。接收针对mock处理后的第一方法的第一请求,并返回mock数据。通过接收测试事件的信息,从而获取第一类中第一方法对应的字节码和第二方法对应的字节码,并且将第一方法对应的字节码替换为第二方法对应的字节码,以在无需入侵应用程序的代码的情况下实现MockServer,有效降低了MockServer的实现复杂度。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的提供MockServer的示意图;
图2为本申请实施例提供的测试处理方法的流程图;
图3为本申请另一实施例提供的测试处理方法的流程图;
图4为本申请实施例提供的测试处理方法的流程示意图;
图5为本申请实施例提供的测试处理装置的结构示意图;
图6为本申请实施例提供的测试处理设备的硬件结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
为了便于介绍本申请的技术方案,首先对本申请中所涉及的相关概念进行介绍:
Mock测试:Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
Mock数据:Mock数据是通过伪造的Mock接口向前端开发单元返回的前端开发单元所需要的测试数据,使得前端开发单元不依赖于服务器端的开发进度。其中,一个Mock接口需要定义一个接口规则,每一个接口规则对应一种数据。
MockServer:MockServer是用于实现Mock功能的一个服务,其中MockServer可以通过接口文档进行测试,将接口与数据进行分离,通过条件和结果数据进行行为的模拟,就像mock对象可以任意模拟对象一样。MockServer一般用于前端测试,当后台服务没有完成时,可以通过接口来模拟功能,使得前端与后台服务开发保持一致。
JVM动态agent:Java虚拟机(Java Virtual Machine,JVM)动态代理程序(agent)是基于Java开发套件(Java Development Kit,JDK)的JVM工具界面(JVM Tool Interface,JVMTI)和Instrument的一种技术。
其中,JVMTI是JVM暴露出来的一些供扩展的接口集合,JVMTI是基于事件驱动的,JVM每执行到一定的逻辑就会调用一些事件的回调接口,这些接口可以供开发者扩展自己的逻辑。
其中,Instrument可以用来构建一个独立于应用程序的agent,用来监测和协助运行在JVM上的程序,也能够用来动态替换和修改某些类的定义。
Javasist:是一种动态生成字节码的技术,提供了运行时动态生成和操作Java字节码的方法。使用Javasist来进行字节码擦写,操作简便,性能良好。
在上述介绍的相关概念的基础上,下面对结合图1对本申请所涉及的MockServer进行介绍,图1为本申请实施例提供的提供MockServer的示意图:
目前,用于提供服务的应用大多数都不是孤立存在的,其或多或少都存在外部的依赖关系,其中外部的依赖关系会加大联调和测试的复杂度,以及在后台开发没有完成时,前端的测试工作就无法进行。
例如参见图1,假设当前存在应用1,其中应用1需要对客户端1、客户端2提供正常的服务,以及假设当前应用1存在外部服务依赖1、外部服务依赖2以及外部服务依赖3,那么在测试过程中,应用1依赖的所有外部服务都必须正常工作,紧密配合,任何一方出了问题,都可能导致客户端的请求处理失败,从而导致测试异常,因此会导致测试的复杂程度较高。
针对此问题,可以通过提供MockServer,从而使得应用可以直接提供数据进行联调和测试,而无需考虑外部依赖。
在一种可能的实现方式中,例如可以参见图1,在应用1的内部提供Mock服务,其中Mock服务是虚假的服务程序,其同样接收客户端的请求,并返回结果,对客户端程序来说,与真实服务是一样的。
其中,Mock服务与真实服务的唯一差别是:Mock服务不执行具体的业务逻辑,只根据输入参数不同,返回事先已经准备好的结果数据,从而无需考虑应用的外部依赖关系,有效降低了测试的复杂程度。
目前,在MockServer的一种可能的实现方式中,可以通过内置mock规则的实现方式,例如参照上述图1,可以在应用程序中置入Mock规则,以及接口各种协议的Mock实现。在后续测试过程中,应用程序可以匹配mock规则,从而返回接口相应协议的mock实现,若匹配不到mock规则,则执行正常调用。
在MockServer的另一种可能的实现方式中,可以通过外置mock规则的实现方式,例如可以实现一个mock规则后台,以及一个适配各种接口协议的代理(proxy)系统,在应用程序中织入调用proxy的代码逻辑,由proxy系统根据具体协议来决定是调用真实接口还是mock后台。
然而,无论是内置mock规则的实现方式,还是外置mock规则的实现方式,都需要侵入应用程序的代码,对应用程序的代码进行修改,以实现MockServer,或者在执行mock动作时,还需要进行停机重启等干涉应用程序运行的操作,其中针对不同的应用程序,需要分别进行MockServer的实现,从而导致MockServer的实现复杂度较高。
同时,现有技术中的实现方案通常是实现接口级的mock,无法实现更细粒度的mock;以及,现有技术的实现方案中通常需要适配多种接口协议,无法做到协议透明。
针对现有技术中的问题,本申请提供了一种测试处理方法,以在无需侵入应用程序的代码的情况下实现MockServer,有效降低MockServer的实现复杂度。
下面结合具体的实施例对本申请提供的测试处理方法进行介绍,图2为本申请实施例提供的测试处理方法的流程图,本申请中实施例的执行主体可以为第一应用,在实际实现过程中,第一应用可以为需要进行测试的任一个应用。
如图2所示,该方法包括:
S201、接收测试管理后台发送的测试事件的信息,其中,测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,第一方法为第一类中的方法,第一方法为第一应用中需要进行mock处理的方法。
在本实施例中,测试管理后台用于管理mock规则,以及测试管理后台还用于向第一应用发送测试事件的信息,在一种可能的实现方式中,在测试管理后台中可以存储有多条mock规则。
其中,每条mock规则例如可以包括如下信息中的至少一种:待mock的类的关键字、待mock的方法的签名,待mock的应用的互联网协议(Internet Protocol,IP)地址,进程关键字,数据包,其中,数据包中例如可以包括mock方法的正向实现。
其中,待mock类的关键字例如可以包括包名、类名,待mock方法的签名例如可以包括方法名、方法参数、返回类型。
在一种可能的实现方式中,测试管理后台可以响应于用户的操作触发执行某一个mock规则,或者测试管理后台还可以在启动之后自动执行某一个mock规则,在执行mock规则的规程中,可以根据mock规则中的待mock应用的IP地址,确定IP地址对应的第一应用。
则测试管理后台可以根据待mock应用的IP地址,向第一应用发送测试事件的信息,对应的,本实施例中第一应用可以接收测试管理后台发送的测试事件的信息,在本实施例中,测试事件的信息可以包括加载路径、第一类的关键字、第一方法的签名,本实施例中的第一方法为第一应用中需要进行mock处理的方法,第一方法为第一类中的方法,也就是说本实施例中需要对第一类中的第一方法进行mock处理。
在本实施例中,测试事件例如可以为mock事件,用于实现对第一方法的mock。
在一种可能的实现方式中,第一应用和测试管理后台之间进行测试事件的信息的传输时,可以是基于超文本传输协议(Hyper Text Transfer Protocol,HTTP)进行信息的传输,其中,使用HTTP协议在内网环境下具有较好的协议穿透性。
S202、根据加载路径,获取第二类,其中,第二类中包括第二方法,第二方法为用于实现对第一方法的mock处理。
本实施例中的加载路径用于指示第二类的存储路径,则第一应用可以根据加载路径获取第二类,第二类中包括第二方法。
在本实施例中,需要对第一方法进行mock处理,本实施例中第一应用所获取的第二类中的第二方法,就是用于实现对第一方法的mock处理的。
在一种可能的实现方式中,例如原本的第一方法的输入数据是某个外部依赖的输出数据,那么第一应用在接收到针对第一方法的请求时,就需要外部依赖才能够实现第一方法。
对应的,本实施例中的第二方法可以直接根据请求返回相应的数据,而无需等待外部依赖的输出数据,从而实现了对第一方法的mock处理。
在实际实现过程中,第二方法的具体实现可以根据实际需求进行选择,例如在上述示例中,第二方法根据请求如何返回相应的数据,本实施例对第二方法中的实现逻辑不做限制,只要其可以根据请求返回相应的数据即可。
S203、根据第一类的关键字,获取第一类的字节码。
在本实施例中,第一应用中可以包括多个类,则根据第一类的关键字,可以获取到第一应用中的第一类,对应的可以获取第一类的字节码。
其中,字节码是一种包含执行程序,由一序列操作(Operation,OP)代码/数据对组成的二进制文件,是一种中间码。
S204、从第一类的字节码中获取第一方法对应的第一字节码,并将第一字节码替换为第二类的第二字节码,得到mock处理后的第一方法。
在本实施例中,第一类中例如可以包括有多个方法,则第一类的字节码中可以包括多个方法的字节码,其中,可以从第一类的字节码中获取第一方法对应的第一字节码。
在一种可能的实现方式中,可以根据第一方法的签名,从第一类的字节码中获取第一方法对应的第一字节码。
以及在本实施例中,第二类同样对应有第二类的字节码,可以理解的是,第二类中包括第二方法,则第二类的字节码实际上就是第二方法所对应的字节码,以及本实施例中的第二方法是用于实现对第一方法的mock处理的。
则在本实施例的一种可能的实现方式中,可以将第一字节码替换为第二类的第二字节码,在替换之后,则mock处理后的第一方法所对应的字节码就是第二类的字节码,也就是第二方法所对应的第二字节码。
从而mock后的第一方法可以执行第二方法中的逻辑,直接根据请求返回相应的数据,而无需外部依赖。
对第一应用中需要进行mock的方法执行上述处理过程,得到mock处理后的第一方法,从而可以实现MockServer。
需要说明的是,字节码的替换可以在第一应用的内部,由第一应用实现执行过程,而无需对第一应用进行入侵。
S205、接收针对mock处理后的第一方法的第一请求,并返回mock数据。
在实现MockServer之后,第一应用可以接收针对于mock处理后的第一方法的第一请求,在本实施例中,mock处理后的第一方法可以根据第一请求直接返回相应的数据,而无需考虑外部依赖,因此可以直接返回mock数据。
在本实施例中,通过对第一方法的第一字节码进行替换,从而可以在无需侵入应用程序的代码的情况下实现MockServer,有效降低MockServer的实现复杂度。
本申请实施例提供的测试处理方法,包括:接收测试管理后台发送的测试事件的信息,其中,测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,第一方法为第一类中的方法,第一方法为第一应用中需要进行mock处理的方法。根据加载路径,获取第二类,其中,第二类中包括第二方法,第二方法为用于实现对第一方法的mock处理。根据第一类的关键字,获取第一类的字节码。从第一类的字节码中获取第一方法对应的第一字节码,并将第一字节码替换为第二类的第二字节码,得到mock处理后的第一方法。接收针对mock处理后的第一方法的第一请求,并返回mock数据。通过接收测试事件的信息,从而获取第一类中第一方法对应的字节码和第二方法对应的字节码,并且将第一方法对应的字节码替换为第二方法对应的字节码,以在无需入侵应用程序的代码的情况下实现MockServer,有效降低了MockServer的实现复杂度。
在上述实施例的基础上,下面对本申请所涉及的测试处理方法进行进一步的详细介绍,图3为本申请另一实施例提供的测试处理方法的流程图。
如图3所示,该方法包括:
S301、接收测试管理后台发送的测试事件的信息,其中,测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,第一方法为第一类中的方法,第一方法为第一应用中需要进行mock处理的方法。
其中,S301的实现方式与S201相同,此处不再赘述。
S302、根据加载路径,获取第二类,其中,第二类中包括第二方法,第二方法为用于实现对第一方法的mock处理。
在本实施例中对根据加载路径获取第二类的实现方式进行进一步的详细介绍:
在本实施例中,可以根据加载路径进行第二类的加载,在一种可能的实现方式中,本实施例中的第二类可以包括第二方法的正向实现。
在另一种可能的实现方式中,第一数据包中还可以包括第二方法的逆向实现,其中,第二方法的逆向实现即为测试事件的逆向操作,可以理解为将mock处理后的第一方法逆向操作为原始的第一方法。
基于上述实施例的介绍可以确定的是,mock规则中可以包括数据包,在本实施例中,数据包例如可以为Java归档(Java Archive,jar)包,加载路径例如可以为jar包的上传路径,以及数据包中可以包括第二类,则可以根据加载路径进行第二类的加载。
在本实施例中,第一应用中例如可以包括定制的类加载器,其中定制的类加载器用于加载第二类。
在一种可能的实现方式中,定制的类加载器例如可以继承自URLClassLoader,其中,URLClassLoader是Java中的类加载器,本实施例中定制的类加载器可以按自定义路径加载指定类。
以及,本实施例中定制的类加载器可以重写ClassLoader的loadClass方法,从而实现优先从本实施例中的加载路径加载第二类。
如果加载成功,则返回第二类;如果加载失败,则委托给JVM体系加载器,遵从双亲委派顺序加载;如果JVM体系加载器仍然加载失败,则从父加载器URLClassLoader所指定的加载路径上进行第二类的加载。
在实际实现过程中,例如本实施例中定制的类加载器可以重写ClassLoader的getResource方法,以实现优先从指定的加载路径上查找统一资源定位器(UniformResource Locator,URL),如果指定的加载路径上查找不到,则从启动类路径上查找URL。
S303、对第二类中的第二方法进行校验,判断校验是否通过,若否,则执行S304,若是,则执行S305。
在本实施例中,在获取到第二类之后,可以首先对第二类中的第二方法进行校验,若校验失败,则可以确定第二类中的第二方法存在问题,无需进行后续的mock操作了。
在一种可能的实现方式中,第一应用可以对第二方法的元注解信息进行校验,如果确定元注解信息符合规范,则可以确定校验成功,否则确定校验失败。
其中元注解信息的规范例如可以包可以如下中的至少一种:
Mock的正向方法以注解@mock标识,Mock的负向方法以@unmock标识;
Mock的正向方法所在类的包全限定名为:原始类的包全限定名+“.mock”;
Mock的正向方法签名和需mock的方法一致;
Mock的负向方法方法名是unmock+正向方法名,除名称外,Mock的负向方法的和Mock的正向方法的方法参数和返回类型一致;
在一种可能的实现方式中,若第二方法满足上述规范,则确定校验成功,校验成功之后可以执行后续的mock操作,否则确定校验失败。
S304、向测试管理后台发送指示信息,其中,指示信息用于指示测试事件的执行状态为启动失败。
在一种可能的实现方式中,若确定校验失败,则第一应用可以向测试管理后台发送指示信息,指示当前的测试事件的执行状态为启动失败,从而无需进行后续操作。
S305、获取第二类的字节码,并将第二类的字节码保存至第一应用的内存中。
在本实施例中,还可通过定制化的类加载器获取第二类的字节码,在一种可能的实现方式中,例如可以通过上述介绍的定制化类加载器,将第二类的字节码加载到内存中。
以及,本实施例中还可以通过javasist池对象构造技术,把第二类中的第二方法提取到专有缓冲中,以便后续进行字节码的擦写。
在一种可能的实现方式中,本实施例对S303和S302的执行顺序可以为同时执行,或者还可以为先执行S302,再执行S303,本实施例对此不做特别限制。
S306、根据进程关键字,在第一应用的多个进程中确定目标进程。
在本实施例中,测试事件的信息中还可以包括进程关键字,其中进程关键字用于指示具体对哪一个进程的第一方法进行mock操作。
其中,进程关键字例如可以为进程身份标识号(Identity document,ID),或者还可以为应用名称等唯一识别进程的标识,在实际实现过程中,进程关键字的具体实现可以根据实际需求进行选择,只要进程关键字可以用于唯一的标识一个进程即可。
第一应用中包括有多个进程,则可以根据进程关键字,在第一应用的多个进程中确定目标进程。
在一种可能的实现方式中,例如可以通过java反射技术,调用JDK底层类库VirtualMachine中的list方法,从而列出第一应用中所运行的所有Java虚拟机(JavaVirtual Machine,JVM)进程的对象信息,并通过进程关键字进行过滤,从而得到目标进程的对象信息,然后反射调用JDK类库VirtualMachineDescriptor中的id方法,从而获得最终匹配的目标进程的id。
S307、针对目标进程,第一应用擦写目标进程中的第一字节码。
S308、第一应用将第二字节码作为第一方法对应的新的字节码,得到mock处理后的第一方法。
在本实施例中,通过擦写目标进程中的第一字节码,并且将第二字节码作为第一方法所对应的新的字节码,从而可以实现对第一方法中的字节码的替换,以得到mock处理后的第一方法。
在一种可能的实现方式中,可以基于JVM动态agent技术,加载agent回调接口从而获得Instrument对象,以及通过javasist技术擦写目标进程中的第一类中的字节码中第一方法所对应的第一字节码。
其次,再通过Instrument对象将第二字节码重新加载到第一类中,从而实现了修改指定的第一方法,实现了对第一方法的mock操作。
S307、接收针对mock处理后的第一方法的第一请求,并返回mock数据。
其中,S307的实现方式与S205相同,此处不再赘述。
本申请实施例提供的测试处理方法,包括:接收测试管理后台发送的测试事件的信息,其中,测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,第一方法为第一类中的方法,第一方法为第一应用中需要进行mock处理的方法。根据加载路径,获取第二类,其中,第二类中包括第二方法,第二方法为用于实现对第一方法的mock处理。对第二类中的第二方法进行校验,判校验是否通过,若否,则向测试管理后台发送指示信息,其中,指示信息用于指示测试事件的执行状态为启动失败。若是,则获取第二类的字节码,并将第二类的字节码保存至第一应用的内存中。根据进程关键字,在第一应用的多个进程中确定目标进程。针对目标进程,第一应用擦写目标进程中的第一字节码。第一应用将第二字节码作为第一方法对应的新的字节码,得到mock处理后的第一方法。接收针对mock处理后的第一方法的第一请求,并返回mock数据。通过定制化的类加载器实现第二类的加载,从而可以从指定的加载路径上加载第二类,同时通过对第二方法进行校验,以在对第一方法进行mock处理之前,首先保证第二方法的正确性,若第二方法的校验不通过,则无需进行后续的mock处理,有效节省了系统的开销。
在上述实施例的基础上,下面结合一个包括测试管理后台和第一应用的流程示意图,对本申请提供名的测试处理方法进行一个整体的说明,图4为本申请实施例提供的测试处理方法的流程示意图。
参见图4,图4中包括测试管理后台和多个应用,其中各个应用可以通过容器(Docker)实现,每个应用对应有各自的IP地址。
测试管理后台可以响应于用户的操作,新建一条mock规则,并且接收针对mock规则的录入信息,其中录入信息例如可以包括待mock的类的关键字、待mock的方法的签名、待mock的应用的IP地址、进程关键字。
其中录入信息可以包括mock正向信息,或者还可以包括逆向信息,逆向是正向的反操作,其中正向信息是指mock操作需要提供的信息,逆向信息是指取消mock操作所需要的信息。
当录入信息为mock正向信息时,则mock操作为正向操作;当录入信息为mock逆向信息时,则mock操作为逆向操作。
在一种可能的实现方式中,正向操作是必须的,逆向操作是可选的,若不录入mock逆向信息,则不能取消mock操作,除非容器(Docker)重启。
在接收到录入信息之后,测试管理后台还可以接收到上传的,该jar包里定义有第二类,第二类中包括用于实现对第一方法的mock操作的第二方法的正向实现。
在一种可能的实现方式中,如果需要第一方法进行mock逆向操作,则还需要在第二类中添加第二方法的逆向实现,其中正向方法和逆向方法需要符合相应的规范。
接着测试管理后台可以响应于写入操作,将录入信息和jar包和当前的mock规则进行关联,生成一条mock规则,并写入至规则池中。
在测试管理后台检测到测试事件时,测试管理后台可以根据测试事件从测试池中选择相应的mock规则,并将事件类型和测试事件的上下文信息信息传递给事件触发器,由事件触发器决定后续的动作,其中,事件上下文信息例如可以包括上述实施例介绍mock规则的录入信息、jar包的加载路径。
其中,事件触发器可以决定是否向事件路由器发送该测试事件的事件上下文信息,在一种可能的实现方式中,事件触发器例如可以读取测试管理后台的全局配置,并且根据白名单或者黑名单来确定当前的测试事件是否可以执行,若可以,则向事件路由器发送该测试事件的信息;若不可以,则拒绝传递该测试事件的信息。
在另一种可能的实现方式中,事件触发器还例如可以判断当前的测试事件是否有授权,若有,则向事件路由器发送该测试事件的信息;若没有,则拒绝传递该测试事件的信息,其中测试事件的授权例如可以为开发人员或者测试人员配置的。
其中,事件路由器在接收到事件触发器传递的测试事件的事件上下文信息指挥,可以根据其中的待mock的应用的IP地址,确定第一应用,假设当前待mock的应用的IP地址为IP1,则可以确定第一应用为图4中的应用1。
接着,事件路由器可以将测试事件的信息发送给应用1的事件启动器,在一种可能的实现方式中,应用1的时间启动器可以根据进程关键字识别目标进程,并且通过类加载器加载第二类,并且获取第二类的字节码,以及对第二类中的第二方法进行元注解信息的校验。
若校验不通过,则可以向测试管理后台发送指示信息,指示测试事件的执行状态为启动失败,对应的测试管理后台中的状态该同步器可以标记当前的测试事件所对应的mock规则异常。
若校验通过,则还可以通过Javasist提取第二类中的第二方法,以便后续进行字节码的擦写。
之后,针对目标进程通过JVM代理(JVM动态agent技术)擦写第一类中第一方法对应的第一字节码,并将第二类的第二字节码重新加载为第一方法所对应的字节码,从而实现了对第一方法的mock处理,得到mock处理后的第一方法。
在完成对第一方法的mock处理之后,第一应用还可以向测试管理后台的状态同步器发送第二指示信息,以指示当前的测试事件的执行状态为执行成功。
综上所述,本申请实施例提供的测试处理方法,可以不侵入应用程序的代码的情况下实现MockServer,降低了MockServer实现的复杂度,并且执行Mock动作无需重启应用程序,可移植性强;以及本实施例提供的测试处理方法可以针对具体的方法实现mock操作,避免了现有技术中仅能实现接口级的操作所导致的测试灵活性较低,以及本实施例中的方法可以基于JVM,有效实现了协议透明。
同时,针对现有技术中Mock规则外置时,代理系统实际成为了网关系统,是流量的交汇处,当mock流量大时会导致系统资源开销较大的问题,本申请提供的方法中无需代理,基于IP和进程关键字进行路由,实现了定点推送,没有流量的汇聚点,从而有效节省了系统开销。
图5为本申请实施例提供的测试处理装置的结构示意图。如图5所示,该装置50包括:接收模块501、获取模块502以及处理模块503。
接收模块501,用于接收测试管理后台发送的测试事件的信息,其中,所述测试事件的信息包括加载路径、第一类的关键字、第一装置的签名,其中,所述第一装置为所述第一类中的装置,所述第一装置为所述第一应用中需要进行mock处理的装置;
获取模块502,用于根据所述加载路径,获取第二类,其中,所述第二类中包括第二装置,所述第二装置为用于实现对所述第一装置的mock处理;
所述获取模块502,还用于根据所述第一类的关键字,获取所述第一类的字节码;
处理模块503,用于从所述第一类的字节码中获取所述第一装置对应的第一字节码,并将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一装置;
所述接收模块501,还用于接收针对所述mock处理后的第一装置的第一请求,并返回mock数据。
在一种可能的设计中,所述测试事件的信息还包括进程关键字;
所述处理模块503还用于:
根据所述进程关键字,在所述第一应用的多个进程中确定目标进程。
在一种可能的设计中,所述处理模块503具体用于:
针对所述目标进程,所述第一应用擦写所述目标进程中的所述第一字节码;
所述第一应用将所述第二字节码作为所述第一装置对应的新的字节码,得到mock处理后的第一装置。
在一种可能的设计中,所述获取模块502还用于:
获取所述第二类的字节码,并将所述第二类的字节码保存至所述第一应用的内存中。
在一种可能的设计中,所述处理模块503还用于:
在根据所述加载路径,获取第二类之后,对所述第二类中的第二装置进行校验;
若所述第二装置校验不通过,则向所述测试管理后台发送指示信息,其中,所述指示信息用于指示所述测试事件的执行状态为启动失败。
在一种可能的设计中,所述处理模块503具体用于:
对所述第二装置的元注解信息进行校验。
在一种可能的设计中,所述接收模块501具体用于:
所述第一应用通过超文本传输协议HTTP协议接收所述测试管理后台的事件路由器发送的测试事件的信息。
本实施例提供的装置,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,本实施例此处不再赘述。
图6为本申请实施例提供的测试处理设备的硬件结构示意图,如图6所示,本实施例的测试处理设备60包括:处理器601以及存储器602;其中
存储器602,用于存储计算机执行指令;
处理器601,用于执行存储器存储的计算机执行指令,以实现上述实施例中测试处理方法所执行的各个步骤。具体可以参见前述方法实施例中的相关描述。
可选地,存储器602既可以是独立的,也可以跟处理器601集成在一起。
当存储器602独立设置时,该测试处理设备还包括总线603,用于连接所述存储器602和处理器601。
本申请实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行指令时,实现如上测试处理设备所执行的测试处理方法。
在本申请所提供的几个实施例中,应该理解到,所揭露的设备和方法,可以通过其它的方式实现。例如,以上所描述的设备实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
上述以软件功能模块的形式实现的集成的模块,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(英文:processor)执行本申请各个实施例所述方法的部分步骤。
应理解,上述处理器可以是中央处理单元(英文:Central Processing Unit,简称:CPU),还可以是其他通用处理器、数字信号处理器(英文:Digital Signal Processor,简称:DSP)、专用集成电路(英文:Application Specific Integrated Circuit,简称:ASIC)等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合发明所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。
存储器可能包含高速RAM存储器,也可能还包括非易失性存储NVM,例如至少一个磁盘存储器,还可以为U盘、移动硬盘、只读存储器、磁盘或光盘等。
总线可以是工业标准体系结构(Industry Standard Architecture,ISA)总线、外部设备互连(Peripheral Component,PCI)总线或扩展工业标准体系结构(ExtendedIndustry Standard Architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,本申请附图中的总线并不限定仅有一根总线或一种类型的总线。
上述存储介质可以是由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。存储介质可以是通用或专用计算机能够存取的任何可用介质。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述各实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的范围。

Claims (16)

1.一种测试处理方法,其特征在于,应用于第一应用,包括:
接收测试管理后台发送的测试事件的信息,其中,所述测试事件的信息包括加载路径、第一类的关键字、第一方法的签名,其中,所述第一方法为所述第一类中的方法,所述第一方法为所述第一应用中需要进行mock处理的方法;
根据所述加载路径,获取第二类,其中,所述第二类中包括第二方法,所述第二方法为用于实现对所述第一方法的mock处理;
根据所述第一类的关键字,获取所述第一类的字节码;
从所述第一类的字节码中获取所述第一方法对应的第一字节码,并将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一方法;
接收针对所述mock处理后的第一方法的第一请求,并返回mock数据。
2.根据权利要求1所述的方法,其特征在于,所述测试事件的信息还包括进程关键字;
所述方法还包括:
根据所述进程关键字,在所述第一应用的多个进程中确定目标进程。
3.根据权利要求2所述的方法,其特征在于,所述将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一方法,包括:
针对所述目标进程,所述第一应用擦写所述目标进程中的所述第一字节码;
所述第一应用将所述第二字节码作为所述第一方法对应的新的字节码,得到mock处理后的第一方法。
4.根据权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:
获取所述第二类的字节码,并将所述第二类的字节码保存至所述第一应用的内存中。
5.根据权利要求1所述的方法,其特征在于,所述根据所述加载路径,获取第二类之后,所述方法还包括:
对所述第二类中的第二方法进行校验;
若所述第二方法校验不通过,则向所述测试管理后台发送指示信息,其中,所述指示信息用于指示所述测试事件的执行状态为启动失败。
6.根据权利要求5所述的方法,其特征在于,所述对所述第二类中的第二方法进行校验,包括:
对所述第二方法的元注解信息进行校验。
7.根据权利要求1所述的方法,其特征在于,所述接收测试管理后台发送的测试事件的信息,包括:
所述第一应用通过超文本传输协议HTTP协议接收所述测试管理后台的事件路由器发送的测试事件的信息。
8.一种测试处理装置,其特征在于,应用于第一应用,包括:
接收模块,用于接收测试管理后台发送的测试事件的信息,其中,所述测试事件的信息包括加载路径、第一类的关键字、第一装置的签名,其中,所述第一装置为所述第一类中的装置,所述第一装置为所述第一应用中需要进行mock处理的装置;
获取模块,用于根据所述加载路径,获取第二类,其中,所述第二类中包括第二装置,所述第二装置为用于实现对所述第一装置的mock处理;
所述获取模块,还用于根据所述第一类的关键字,获取所述第一类的字节码;
处理模块,用于从所述第一类的字节码中获取所述第一装置对应的第一字节码,并将所述第一字节码替换为所述第二类的第二字节码,得到mock处理后的第一装置;
所述接收模块,还用于接收针对所述mock处理后的第一装置的第一请求,并返回mock数据。
9.根据权利要求8所述的装置,其特征在于,所述测试事件的信息还包括进程关键字;
所述处理模块还用于:
根据所述进程关键字,在所述第一应用的多个进程中确定目标进程。
10.根据权利要求9所述的装置,其特征在于,所述处理模块具体用于:
针对所述目标进程,所述第一应用擦写所述目标进程中的所述第一字节码;
所述第一应用将所述第二字节码作为所述第一装置对应的新的字节码,得到mock处理后的第一装置。
11.根据权利要求8-10任一项所述的装置,其特征在于,所述获取模块还用于:
获取所述第二类的字节码,并将所述第二类的字节码保存至所述第一应用的内存中。
12.根据权利要求8所述的装置,其特征在于,所述处理模块还用于:
在根据所述加载路径,获取第二类之后,对所述第二类中的第二装置进行校验;
若所述第二装置校验不通过,则向所述测试管理后台发送指示信息,其中,所述指示信息用于指示所述测试事件的执行状态为启动失败。
13.根据权利要求12所述的装置,其特征在于,所述处理模块具体用于:
对所述第二装置的元注解信息进行校验。
14.根据权利要求8所述的装置,其特征在于,所述接收模块具体用于:
所述第一应用通过超文本传输协议HTTP协议接收所述测试管理后台的事件路由器发送的测试事件的信息。
15.一种测试处理设备,其特征在于,包括:
存储器,用于存储程序;
处理器,用于执行所述存储器存储的所述程序,当所述程序被执行时,所述处理器用于执行如权利要求1至7中任一所述的方法。
16.一种计算机可读存储介质,其特征在于,包括指令,当其在计算机上运行时,使得计算机执行如权利要求1至7中任一所述的方法。
CN202010819885.3A 2020-08-14 2020-08-14 测试处理方法及装置 Pending CN113760701A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010819885.3A CN113760701A (zh) 2020-08-14 2020-08-14 测试处理方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010819885.3A CN113760701A (zh) 2020-08-14 2020-08-14 测试处理方法及装置

Publications (1)

Publication Number Publication Date
CN113760701A true CN113760701A (zh) 2021-12-07

Family

ID=78785585

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010819885.3A Pending CN113760701A (zh) 2020-08-14 2020-08-14 测试处理方法及装置

Country Status (1)

Country Link
CN (1) CN113760701A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115114595A (zh) * 2022-08-29 2022-09-27 北京中安星云软件技术有限公司 一种基于JNI运行Java加密jar包的方法及系统

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115114595A (zh) * 2022-08-29 2022-09-27 北京中安星云软件技术有限公司 一种基于JNI运行Java加密jar包的方法及系统

Similar Documents

Publication Publication Date Title
US11687645B2 (en) Security control method and computer system
Dinh et al. Favocado: Fuzzing the Binding Code of JavaScript Engines Using Semantically Correct Test Cases.
US7293251B2 (en) Initiating and debugging a process in a high assurance execution environment
US7739698B2 (en) Multiplatform API usage tool
US8782607B2 (en) Contract failure behavior with escalation policy
AU2021206497B2 (en) Method and apparatus for authority control, computer device and storage medium
US20040243882A1 (en) System and method for fault injection and monitoring
US20070083792A1 (en) System and method for error detection and reporting
CN104346148A (zh) 获取程序性能消耗信息的方法、装置及系统
CN110879781A (zh) 程序调试方法、装置、电子设备及计算机可读存储介质
CN111444103A (zh) 一种Web页面自动化测试方法及相关设备
CN108322458B (zh) Web应用入侵检测方法、系统、计算机设备和存储介质
CN114625660A (zh) 调试方法及装置
CN113760701A (zh) 测试处理方法及装置
Lawall et al. WYSIWIB: exploiting fine‐grained program structure in a scriptable API‐usage protocol‐finding process
CN111538659A (zh) 业务场景的接口测试方法、系统、电子设备和存储介质
KR102111392B1 (ko) 테스트 통합 관리시스템 및 그 제어방법
JP6586143B2 (ja) ファイルの実行をエミュレートするシステム及び方法
CN113139190A (zh) 程序文件检测方法、装置、电子设备及存储介质
US7571428B2 (en) Reliability contracts
CN110908725A (zh) 应用程序启动方法、装置、电子设备及可读介质
CN111625784B (zh) 一种应用的反调试方法、相关装置及存储介质
CN115543486B (zh) 面向无服务器计算的冷启动延迟优化方法、装置和设备
US11989280B2 (en) Pointer authentication failure detection
CN109426601B (zh) 一种对程序进行无状态检测的方法和装置

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