CN117950991A - 程序测试方法、装置、电子设备及计算机可读存储介质 - Google Patents

程序测试方法、装置、电子设备及计算机可读存储介质 Download PDF

Info

Publication number
CN117950991A
CN117950991A CN202311572412.8A CN202311572412A CN117950991A CN 117950991 A CN117950991 A CN 117950991A CN 202311572412 A CN202311572412 A CN 202311572412A CN 117950991 A CN117950991 A CN 117950991A
Authority
CN
China
Prior art keywords
version
code
program
historical
determining
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
CN202311572412.8A
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.)
Mashang Xiaofei Finance Co Ltd
Original Assignee
Mashang Xiaofei Finance 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 Mashang Xiaofei Finance Co Ltd filed Critical Mashang Xiaofei Finance Co Ltd
Priority to CN202311572412.8A priority Critical patent/CN117950991A/zh
Publication of CN117950991A publication Critical patent/CN117950991A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Stored Programmes (AREA)

Abstract

本申请提供了一种程序测试方法、装置、电子设备及计算机可读存储介质;方法包括:迭代执行以下处理:基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序;针对所述目标程序进行流量回放,得到所述目标程序的回放结果;响应于所述回放结果表征所述目标程序运行异常,确定所述历史代码版本为新的当前代码版本;响应于所述回放结果表征所述目标程序运行正常,确定所述历史代码版本对应的版本代码为正常版本代码,并确定对所述历史代码版本进行更新后的代码版本的版本代码为异常版本代码。通过本申请,能够快速定位程序出现异常的版本代码。

Description

程序测试方法、装置、电子设备及计算机可读存储介质
技术领域
本申请涉及计算机技术,尤其涉及一种程序测试方法、装置、电子设备及计算机可读存储介质。
背景技术
当程序在测试或者使用时出现问题时,通常需要开发人员去分析定位问题,比如远程调试,分析日志文件等等,但是当实际应用场景中不方便使用这些方法定位问题时,比如生产环境不支持远程调试,程序代码没有打印日志文件,测试环境无法重现等,则需要开发人员重新审视代码以及代码变更以分析定位问题,而开发人员查看代码时一般需要了解上下文情况,了解代码的用途和提交记录。
开发人员通常需要逐行查看上下文代码以及逐个查看程序的历史版本代码,以定位到问题行以及问题代码的提交历史记录,这种手动方案导致解决程序异常问题的效率较低,无法很好地满足程序测试需求。
发明内容
本申请实施例提供一种程序测试方法、装置、电子设备、计算机可读存储介质及计算机程序产品,能够快速定位程序出现异常的版本代码。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种程序测试方法,所述方法包括:
基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序;
针对所述目标程序进行流量回放,得到所述目标程序的回放结果;
响应于所述回放结果表征所述目标程序运行异常,确定所述历史代码版本为新的当前代码版本;
响应于所述回放结果表征所述目标程序运行正常,确定所述历史代码版本对应的版本代码为正常版本代码,并确定对所述历史代码版本进行更新后的代码版本的版本代码为异常版本代码。
本申请实施例提供一种程序测试装置,包括:
程序确定模块,用于基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序;
流量回放模块,用于针对所述目标程序进行流量回放,得到所述目标程序的回放结果;
第一确定模块,用于响应于所述回放结果表征所述目标程序运行异常,确定所述历史代码版本为新的当前代码版本;
第二确定模块,用于响应于所述回放结果表征所述目标程序运行正常,确定所述历史代码版本对应的版本代码为正常版本代码,并确定对所述历史代码版本更新后的代码版本的版本代码为异常版本代码。
本申请实施例提供一种电子设备,所述电子设备包括:
存储器,用于存储计算机可执行指令和计算机程序;
处理器,用于执行所述存储器中存储的计算机可执行指令时,实现本申请实施例提供的程序测试方法。
本申请实施例提供一种计算机可读存储介质,存储有计算机程序或计算机可执行指令,用于被处理器执行时实现本申请实施例提供的程序测试方法。
本申请实施例提供一种计算机程序产品,包括计算机程序或计算机可执行指令,述计算机程序或计算机可执行指令被处理器执行时,实现本申请实施例提供的程序测试方法。
本申请实施例具有以下有益效果:
通过将当前版本代码与历史代码版本之间的差异文件加载至初始程序中,得到目标程序,能够快速得到待测试的目标程序,提高测试效率,然后针对目标程序进行流量回放,进而根据流量回放结果确定历史代码版本是否异常,能够快速自动定位出开始出现异常的代码版本,提高了程序测试的效率。
附图说明
图1A是本申请实施例提供的程序测试系统的架构示意图;
图1B是本申请实施例提供的程序测试方法的流程示意图;
图2是本申请实施例提供的电子设备的结构示意图;
图3A-图3B是本申请实施例提供的程序测试方法的流程示意图;
图4是本申请实施例提供的程序的异常代码文件查找方法的示意图;
图5是本申请实施例提供的程序测试方法的流程示意图;
图6是本申请实施例提供的程序测试方法的交互流程示意图;
图7是本申请实施例提供的动态替换差异文件的示意图;
图8是本申请实施例提供的服务实例的响应数据示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
在以下的描述中,所涉及的术语“第一\第二”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本申请实施例所使用的所有的技术和科学术语与所属技术领域的技术人员通常理解的含义相同。本申请实施例中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
对本申请实施例进行进一步详细说明之前,对本申请实施例中涉及的名词和术语进行说明,本申请实施例中涉及的名词和术语适用于如下的解释。
1)流量回放:是一种利用网络包捕捉和再现的技术,通过分析网络包,找出其中的重要信息并重新构造出网络通信场景。基本思想就是将真实的网络流量记录下来,然后将这些流量再次发生到目标系统中,模拟真实的网络环境。
2)Instrumentation类:是Java的工具包—java.lang.instrument下的一个接口,这个接口提供了注册类文件转换器(ClassFileTransformer)、获取所有已加载的类等功能,允许对已加载和未加载的类进行修改,Instrumentation的底层实现依赖于java虚拟机工具接口(Java Virtual Machine Toll,JVMTI),JVMTI是Java虚拟机(Java VirtualMachine,JVM)对外提供的扩展接口集合,JVMTI依赖于事件驱动,在JVM执行时会触发一些事件的回调,根据回调的接口可实现对原有系统的业务扩展。
3)Java代理(Java agent):是Java中一种特殊的jar文件,必须依附在Java程序上,通过Instrumentation API与Java虚拟机交互,二者需要一起使用。有两种加载Javaagent的时机:一是启动服务时通过vm参数-javaagent:xxx.jar来加载;二是在启动后通过attach API将agent动态加载到目标服务。
4)版本管理:是一种记录并管理文件或软件代码的历史变更记录的技术。允许多个人在同一文件或代码库上工作,并且每个人的更改都被记录下来,以便以后回溯更改。版本管理系统维护文件或代码的不同版本,并允许用户回到之前的版本,通常使用版本管理系统(VCS)进行版本管理,如分布式版本控制系统(Git)、集中式版本控制系统(SVN)等。
5)服务实例(Service Instance):服务器的虚拟计算环境,相当于一台虚拟机,包含CPU、内存、操作系统、网络、磁盘等最基础的计算组件。
6)附加服务(Java Attach):是一种让java进程之间进行通信的机制,通过attach机制可以将其他进行连接到目标JVM进程,然后进行一些目标操作,例如获取内存dump、获取线程dump、类信息统计、动态加载agent、获取系统属性等。
应用程序基本都会包含日志系统,程序运行的关键信息会以日志文件的形式记录到日志系统中,参见图4,图4是本申请实施例提供的程序的异常代码文件查找方法的示意图,当程序出现异常时,异常信息会被记录为日志文件,因此可以结合监控系统和告警系统将程序的异常信息通知到运维人员,由运维人员分析对应的日志文件以查找定位到异常的代码文件。
但是基于该方法查找程序的异常代码文件时,仅能通过日志文件查找异常代码文件,因此十分依赖日志文件的完整性,当某些异常信息未被记录为日志文件时,就无法基于该方法定位到异常的代码文件;另外基于日志文件进行分析时,需要结合代码上下文以及程序运行时的数据逐步分析,导致查找的效率较低。
本申请实施例提供一种程序测试方法、装置、电子设备、计算机可读存储介质及计算机程序产品,能够快速定位程序出现异常的版本代码,下面说明本申请实施例提的电子设备的示例性应用,本申请实施例提供的电子设备可以实施为笔记本电脑、平板电脑,台式计算机、机顶盒、移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)、智能手机、智能音箱、智能手表、智能电视、车载终端等各种类型的用户终端,也可以实施为服务器。下面,将说明电子设备实施为服务器时的示例性应用。
参见图1A,图1A是本申请实施例提供的程序测试系统的架构示意图,为实现支撑一个程序测试应用,终端200通过网络300连接服务器500,网络300可以是广域网或者局域网,又或者是二者的组合。
终端200用于在显示界面210显示初始程序的当前代码版本和当前代码版本的历史代码版本,并基于初始程序的当前代码版本和当前代码版本的历史代码版本之间的差异文件,确定目标程序,服务器500用于针对目标程序进行流量回放,得到目标程序的回放结果,当回放结果表征目标程序运行异常时,确定历史代码版本为新的当前代码版本;当回放结果表征目标程序运行正常时,确定历史代码版本对应的版本代码为正常版本代码,并确定对历史代码版本更新后的代码版本的版本代码为异常版本代码,将异常版本代码通过网络300发送至终端200,以使终端200在显示界面210显示异常版本代码,以便开发人员能够快速定位出首次出现异常的版本代码。
参见图1B,图1B是本申请实施例提供的程序测试方法的流程示意图,首先在客户端显示测试平台及初始程序(待检测程序),然后用户操作客户端将初始程序发送至服务器,服务器接收初始程序后,执行本申请实施例提供的程序测试方法,从版本管理系统数据库中查询得到初始程序的当前代码版本对应的版本代码以及历史代码版本对应的版本代码,从而得到目标程序,然后针对目标程序进行流量回放处理,得到回放结果,进而基于回放结果确定异常代码版本对应的版本代码,并输出异常代码版本对应的版本代码。
在一些实施例中,服务器500可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content DeliveryNetwork,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。终端200可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能音箱、智能手表、车载终端等,但并不局限于此。终端以及服务器可以通过有线或无线通信方式进行直接或间接地连接,本申请实施例中不做限制。
参见图2,图2是本申请实施例提供的电子设备的结构示意图,图2所示的电子设备400包括:至少一个处理器410、存储器450、至少一个网络接口420和用户接口430。电子设备400中的各个组件通过总线系统440耦合在一起。可理解,总线系统440用于实现这些组件之间的连接通信。总线系统440除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统440。
处理器410可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(Digital Signal Processor,DSP),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口430包括使得能够呈现媒体内容的一个或多个输出装置431,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口430还包括一个或多个输入装置432,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器450可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器450可选地包括在物理位置上远离处理器410的一个或多个存储设备。
存储器450包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Memory),易失性存储器可以是随机存取存储器(Random Access Memory,RAM)。本申请实施例描述的存储器450旨在包括任意适合类型的存储器。
在一些实施例中,存储器450能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统451,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块452,用于经由一个或多个(有线或无线)网络接口420到达其他电子设备,示例性的网络接口420包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(Universal Serial Bus,USB)等;
呈现模块453,用于经由一个或多个与用户接口430相关联的输出装置431(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
输入处理模块454,用于对一个或多个来自一个或多个输入装置432之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本申请实施例提供的程序测试装置可以采用软件方式实现,图2示出了存储在存储器450中的程序测试装置455,其可以是程序和插件等形式的软件,包括以下软件模块:程序确定模块4551、流量回放模块4552、第一确定模块4553、第二确定模块4554,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
在一些实施例中,终端或服务器可以通过运行各种计算机可执行指令或计算机程序来实现本申请实施例提供的程序测试方法。举例来说,计算机可执行指令可以是微程序级的命令、机器指令或软件指令。计算机程序可以是操作系统中的原生程序或软件模块;可以是本地(Native)应用程序(APPlication,APP),即需要在操作系统中安装才能运行的程序,如直播APP或者即时通信APP;也可以是可以嵌入至任意APP中的小程序,即只需要下载到浏览器环境中就可以运行的程序。总而言之,上述的计算机可执行指令可以是任意形式的指令,上述计算机程序可以是任意形式的应用程序、模块或插件。
将结合本申请实施例提供的服务器的示例性应用和实施,说明本申请实施例提供的程序测试方法。
下面,以实现本申请实施例的程序测试方法的电子设备为服务器为例,说明本申请实施例提供的程序测试方法,因此下文中不再重复说明各个步骤的执行主体。
参见图3A,图3A是本申请实施例提供的程序测试方法的流程示意图,本申请实施例提供的程序测试方法可以通过迭代执行步骤101至步骤104实现,将结合图3A示出的步骤进行说明。
在步骤101中,基于初始程序的当前代码版本与当前代码版本的历史代码版本之间的差异文件,确定目标程序。
在一些实施例中,获取当前代码版本对应的版本代码以及历史代码版本对应的版本代码之后,步骤101可以通过以下方式实现:基于当前代码版本对应的版本代码以及历史代码版本对应的版本代码,确定差异文件;将差异文件加载至初始程序中,得到目标程序。
初始程序的当前代码版本和历史代码版本可以通过版本管理系统进行管理,例如分布式版本控制系统(Git)、集中式版本控制系统(SVN)等,版本管理系统中保存有每一代码版本对应的完整代码。例如当使用Git进行版本管理时,可以先通过git log指令查看提交的每一代码版本的版本编号(commit_id),以确定当前代码版本和历史代码版本,并从版本管理系统中获取当前代码版本和历史代码版本分别对应的版本代码,然后通过git diff命令比较两个代码版本对应的版本代码之间的差异,得到差异文件,并对差异文件进行打包,得到打包后的差异文件。
例如,假设初始程序(即待测试程序)先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,历史代码版本为D,那么当每一代码版本中都保存有完整代码时,在第一次迭代处理中需要通过上述方法获取代码版本D和代码版本E对应的版本代码之间的差异文件,第一次迭代处理时的初始程序即为根据当前代码版本E对应的版本代码进行编译处理得到的可执行程序,目标程序是指将更新后的当前代码版本E对应的版本代码(将当前代码版本E对应的版本代码中需要替换的部分代码替换为代码版本D与代码版本E对应的版本代码之间的差异文件所得到的代码)进行编译处理得到的可执行程序。
如果有多次迭代的话,则在第二次迭代处理时的当前代码版本为D,历史代码版本为C,此时需要获取代码版本C和代码版本D对应的代码之间的差异文件,第二次迭代处理时的初始程序即根据当前代码版本D对应的版本代码进行编译处理得到的可执行程序,目标程序是指,将更新后的当前代码版本D对应的版本代码(将当前代码版本D对应的版本代码中需要替换的部分代码替换为代码版本C与代码版本D对应的版本代码之间的差异文件所得到的代码)进行编译处理得到的可执行程序。
在一些实施例中,将差异文件加载至初始程序中,得到目标程序,可以通过以下方式实现:对差异文件进行编码处理,得到代理程序包;将代理程序包通过附加服务加载至初始程序中,得到目标程序。
差异文件是指同一程序的不同版本的代码文件之间存在差异的文件,参见图7,图7是本申请实施例提供的动态替换差异文件的示意图,如图7所示,在得到差异文件后,验证平台基于Java中的java.lang.instrument包,将差异文件通过程序编码制作成符合规范的独立于初始程序(即运行程序)的代理程序包,用于替换和修改运行于服务实例中的初始程序中所要替换的目标类的定义,然后,将代理程序包和包含附加服务的jar包一起挂载到运行有初始程序程序的服务实例上,当启动附加服务时,由附加服务将代理程序包发送到服务实例中正在运行的初始程序的进程中,实现在服务实例的初始程序的进程中加载需要修改的差异文件,从而得到目标程序。
在一些实施例中,参见图3B,图3B是本申请实施例提供的程序测试方法的流程示意图,图3A示出的步骤101还可以通过图3B示出的步骤1011至步骤1013实现,下面将结合图3B示出的步骤具体说明。
在步骤1011中,获取当前代码版本对应的版本代码以及差异文件。
在一些实施例中,当在版本管理系统中保存每一代码版本对应的版本代码时,也可以仅在最初的代码版本中保存完整版本代码,然后在后续的每一代码版本中仅保存相较于最初的代码版本对应的版本代码的差异文件。因此在每一次迭代处理过程中,仅需获取最初的代码版本对应的版本代码(当前代码版本对应的版本代码)和后续的每一代码版本对应的差异文件即可。
例如,假设初始程序先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,历史代码版本为D,假设当前代码版本E对应的版本代码包括a、b,版本管理系统中保存的历史代码版本D对应的版本代码可以仅包括相较于当前代码版本E对应的版本代码的差异文件c或者差异文件b’,从而节省了版本管理系统的存储空间,并提升了获取差异文件的效率。
在步骤1012中,基于当前代码版本对应的版本代码以及差异文件,确定历史代码版本对应的版本代码。
在一些实施例中,当使用Git进行版本管理时,先通过git log指令查看提交的每一代码版本的版本编号(commit_id),从而确定当前代码版本和历史代码版本的版本编号,然后基于历史代码版本的版本编号从Git中查找相较于最初的代码版本对应的版本代码的差异文件,然后将差异文件添加到最初的代码版本对应的版本代码中,得到历史代码版本对应的版本代码。
例如,假设初始程序先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,历史代码版本为D,假设当前代码版本E对应的版本代码包括a、b,版本管理系统中保存的历史代码版本D对应的版本代码,仅包括相较于当前代码版本E对应的版本代码的差异文件c,则将差异文件c添加到当前代码版本E对应的版本代码中,得到历史代码版本D对应的版本代码a、b、c;或者当差异文件为时,则用差异文件c’替换当前代码版本E对应的版本代码中的c,得到历史代码版本D对应的版本代码a、b、c’,从而有效提升了获取差异文件的效率。
在步骤1013中,对历史代码版本对应的版本代码进行编码处理,得到目标程序。
在一些实施例中,对历史代码版本对应的版本代码进行编码处理即将历史代码版本对应的版本代码编译为可执行程序(即目标程序)的过程,例如当本申请实施例中的版本代码使用Java语言进行编写时,可以将历史代码版本对应的版本代码保存至文本编辑器或集成开发环境(Integrated Development Environment,IDE)中,例如Eclipse、IntelliJIDEA等,然后使用Javac编译器将历史代码版本对应的版本代码编译成Java字节码文件,字节码文件以.class为后缀,可以在任何支持Java虚拟机(JVM)的平台上运行。最后使用Java虚拟机(JVM)来运行Java程序时,JVM会加载并执行字节码文件,将其转化为目标程序并在操作系统上运行。
承接上例,假设初始程序先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,历史代码版本为D,当仅在最初的代码版本中保存完整代码,在后续的每一代码版本中仅保存相较于最初的代码版本对应的版本代码的差异文件时,则在第一次迭代处理中可以直接读取版本管理系统中保存的历史代码版本D对应的差异文件,然后将历史代码版本D对应的差异文件添加到当前代码版本E对应的版本代码中,得到历史代码版本D对应的版本代码,最后对历史代码版本D对应的版本代码进行编译处理,即可得到目标程序。通过上述方式可以快速得到目标程序,从而提升程序测试的效率。
在步骤102中,针对目标程序进行流量回放,得到目标程序的回放结果。
在一些实施例中,步骤102具体可以通过以下方式实现:获取预先录制的请求数据;通过运行有目标程序的服务实例对请求数据进行响应,得到请求数据的响应数据,并将响应数据作为回放结果。
在进行流量回放之前,需要先进行流量录制,流量录制方法可以为基于web服务器的录制、基于应用层的录制、基于网络协议栈的录制等,流量录制和回放工具可以为Nginx流量镜像插件-ngx_http_mirror_moudle、JVM-sandbox、GoReplay等。
当进行流量录制时,首先在终端上启动上述任意一种流量录制和回放工具,然后将安装有相关程序(不同于初始程序和目标程序)的测试设备或服务实例接入终端的本地网络,以使终端中运行的流量录制程序能够抓取测试设备或者服务实例产生的网络流量(包括请求数据);然后在测试设备或服务实例中打开并操作目标程序进行一系列目标操作,例如登录、浏览页面、播放视频等,同时终端上的流量录制工具会实时抓取到测试设备或服务实例发出的网络请求的环境域名是否符合预设的生产环境(例如生产环境、测试环境、开发环境、预发布环境等),如果判断符合预设的生产环境,则流量录制工具会持续录制该网络请求(请求数据),如果判断不符合预设的生产环境,则流量录制工具会停止录制;抓取到网络请求后,流量录制工具会进一步判断网络请求是否是利用超文本传输协议(HyperText Transfer Protocol,HTTP)来获取的,如果是则将该网络请求记录至中间件中,并生成操作日志,如果否则该网络请求不会被记录,最后将所有网络请求对应的操作日志汇总为日志文件存入相关数据库中,便于在流量回放时随时被调取。
在进行流量回放时,首先在终端上启动上述任意一种流量录制和回放工具,然后将安装有目标程序的测试设备或者服务实例接入终端的本地网络,以使终端中运行的流量录制程序能够将录制的请求数据发送至测试设备;然后确定需要进行流量回放的环境,并从上述存放有日志文件的数据库中调取该环境对应的请求数据,并将该请求数据发送至运行有目标程序的服务实例,以使服务实例对请求数据进行响应,得到针对请求数据的响应数据,并将响应数据作为流量回放结果。通过上述预先录制的流量数据反复针对目标程序进行验证,可以降低测试人员在测试过程中的参与次数,从而有效提升测试的效率。
在步骤103中,响应于回放结果表征目标程序运行异常,确定历史代码版本为新的当前代码版本。
在一些实施例中,在响应于回放结果表征目标程序运行异常,确定历史代码版本为新的当前代码版本之前,响应于回放结果不包括预设状态码、且回放结果不包含预设字段数据,确定回放结果表征目标程序运行异常。
参见图8,图8是本申请实施例提供的服务实例的响应数据示意图,图8中的http请求结果即服务实例针对请求数据进行响应得到的响应数据,对响应数据进行验证时,可以通过设置两个验证点分别对响应数据进行验证,例如通过性能测试工具LoadRunner进行设置,当响应数据与验证点1设置的验证数据不相同,即响应结果中未包含预设状态码(例如200),并且,将验证点2设置的针对http请求体(http.body)的正则表达式与响应数据进行正则匹配时,响应数据与验证点2设置的正则表达式匹配失败,即响应结果中不包含预设字段数据,则认为运行有目标程序的服务实例响应失败,从而得到验证结果,即确定目标程序运行异常。
当确定目标程序运行异常之后,确定历史代码版本为新的当前代码版本,并继续迭代处理,例如当初始程序先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,历史代码版本为D,当第一次迭代的结果表征目标程序运行异常时,将历史代码版本为D确定为新的当前代码版本,将历史代码版本C确定为新的历史代码版本,并继续迭代处理,如此迭代测试,提升了程序测试的自动化程度。
在步骤104中,响应于回放结果表征目标程序运行正常,确定历史代码版本对应的版本代码为正常版本代码,并确定对历史代码版本更新后的代码版本的版本代码为异常版本代码。
其中,对历史代码版本更新后的代码版本的版本代码为历史代码版本与当前代码版本之间的代码版本,或当前代码版本。
在一些实施例中,响应于回放结果表征目标程序运行正常,确定历史代码版本对应的版本代码为正常版本代码之前,响应于回放结果包括预设状态码,或者回放结果包含预设字段数据,确定回放结果表征目标程序运行正常。
继续参见图8,对响应结果进行验证时,当响应数据中包含验证点1设置的预设状态码(例如200)时,则认为运行有目标程序的服务实例响应成功;或者,通过验证点2设置的针对http请求体(http.body)的正则表达式与响应数据进行正则匹配,当响应数据与验证点2设置的正则表达式匹配成功,即响应结果中包含预设字段数据时,则也认为运行有目标程序的服务实例响应成功,从而得到验证结果,即确定目标程序运行正常。
当确定目标程序运行异常之后,确定历史代码版本对应的版本代码为正常版本代码,并确定历史代码版本更新后的代码版本对应的版本代码为异常版本代码,并结束迭代处理。例如当初始程序先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,历史代码版本为D,当第一次迭代的结果表征目标程序运行异常,将历史代码版本为D确定为新的当前代码版本,将历史代码版本C确定为新的历史代码版本,并继续迭代处理;第二次迭代的结果表征目标程序运行正常,则确定历史代码版本C对应的版本代码为正常版本代码,并确定历史代码版本C更新后的代码版本D对应的版本代码为异常版本代码,然后结束迭代处理,从而快速有效得到历史代码版本中开始产生异常的代码版本。
在一些实施例中,在步骤101之前,开始迭代处理,其中,迭代处理包括基于当前代码版本确定回放结果的过程;在确定对历史代码版本进行更新后的代码版本的版本代码为异常版本代码之后,结束迭代处理。
例如,迭代执行以下处理:基于初始程序的当前代码版本与当前代码版本的历史代码版本之间的差异文件,确定目标程序;针对目标程序进行流量回放,得到目标程序的回放结果;响应于回放结果表征目标程序运行异常,确定历史代码版本为新的当前代码版本,并继续迭代处理;响应于回放结果表征目标程序运行正常,确定历史代码版本对应的版本代码为正常版本代码,并确定对历史代码版本进行更新后的代码版本的版本代码为异常版本代码,并结束迭代处理。因此,通过迭代处理能够快速检测出首个异常版本代码,以便后续基于首个异常版本代码进行分析调试。
在一些实施例中,基于初始程序的当前代码版本与当前代码版本的历史代码版本之间的差异文件,确定目标程序之前,还可以包括以下步骤:确定当前代码版本与待验证的代码版本之间的版本间隔值;基于当前代码版本与版本间隔值,确定历史代码版本。
承接上例,假设初始程序先后一共发布了五个代码版本A-B-C-D-E,第一次迭代处理时的当前代码版本为E,如果当前代码版本与待验证的代码版本(即待验证的历史代码版本)之间的版本间隔值为1,则历史代码版本为D;如果当前代码版本与待验证的代码版本之间的版本间隔值为2,则历史代码版本为C;如果当前代码版本与待验证的代码版本之间的版本间隔值为3,则历史代码版本为B,通过自行设置当前代码版本与待验证的代码版本之间的版本间隔值,可以有效平衡测试速度和测试精度,从而使测试过程更加人性化。
在一些实施例中,确定当前代码版本与待验证的代码版本之间的版本间隔值,可以通过以下方式实现:显示多个候选版本间隔值;响应于针对多个候选版本间隔值的选择操作,将选中的候选版本间隔值作为版本间隔值。
在测试之前可以现在终端上显示多个候选版本间隔值,例如1、2、3、4等,然后由测试人员针对多个候选版本间隔值进行选取,从而将选中的候选版本间隔值作为版本间隔值,例如当从多个候选版本间隔值中选取2作为版本间隔值时,在每次迭代选取与当前代码版本间隔两个代码版本的历史代码版本进行测试。承接上例,如果第一次迭代处理时的当前代码版本为E,版本间隔值为2,则历史代码版本为C。
在一些实施例中,确定当前代码版本与待验证的代码版本之间的版本间隔值,可以通过以下方式实现:根据历史测试数据中的历史版本间隔值,自动确定当前代码版本与待验证的代码版本之间的版本间隔值。
这里,历史测试数据可以包括历史迭代处理次数,也可以包括目标程序运行异常的次数,承接上例,假设初始程序先后一共发布了十个测试代码版本A-B-C-…-I-J,假设历史版本间隔值取2,历史迭代处理次数为3,则当迭代处理三次时才检测到目标程序运行正常,则可以对历史版本间隔值2进行调整,例如减小为1。
在一些实施例中,根据历史测试数据中的历史版本间隔值,自动确定当前代码版本与待验证的代码版本之间的版本间隔值,可以通过以下方式实现:响应于历史测试数据中的迭代次数大于第一迭代次数阈值,增加历史版本间隔值,将增加后的历史版本间隔值作为版本间隔值;响应于历史测试数据中的迭代次数小于第二迭代次数阈值,减少历史版本间隔值,将减少后的历史版本间隔值作为版本间隔值。其中,第一迭代次数阈值大于或等于第二迭代次数阈值。
承接上例,假设初始程序先后一共发布了十个测试代码版本A-B-C-…-I-J,历史版本间隔值取2,第一迭代次数阈值也取3,历史测试数据中的迭代次数为4,即当迭代处理四次时才检测到目标程序运行正常,则说明版本间隔小,可以增加历史版本间隔值,例如将版本间隔值增加为4,以加快异常检测速度。假设第二迭代次数阈值取3(第二迭次数阈值可以等于第一迭代次数阈值,也可以小于第一迭代次数阈值),历史测试数据中的迭代次数为2,即当迭代处理两次时就检测到目标程序运行正常,则说明版本间隔大,可以减少历史版本间隔值,例如将版本间隔值减小为1。通过基于历史测试数据中的迭代次数动态调整版本间隔值,可以对测试的速度和精度进行有效调整,从而对具有不同数量的代码版本的程序进行测试时快速而精准地定位出出现异常的代码版本。
在一些实施例中,确定当前代码版本与待验证的代码版本之间的版本间隔值,还可以通过以下方式实现:基于初始程序的多个版本代码以及当前代码版本对应的版本代码调用神经网络模型进行预测处理,得到版本间隔值,其中,神经网络模型是基于当前版本代码样本、历史版本代码样本以及历史版本代码样本的测试标签训练得到的,测试标签包括历史版本代码样本的异常标签或正常标签。
在一些实施例中,初始程序的多个版本代码即初始程序先后发布的所有的代码版本分别对应的版本代码,神经网络模型可以是各种形式的,例如卷积网络、编码器(Transformer)模型等,损失函数可以是各种损失函数,例如交叉熵损失函数、L1损失函数、L2损失函数等,在此均不做限定。
在本申请实施例中,通过神经网络模型对版本间隔值进行预测,能够节省人工成本,并提高程序测试效率,使得基于初始程序的多个版本代码以及当前代码版本对应的版本代码进行预测得到的版本间隔值更加符合实际的测试需求。
下面,将说明本申请实施例在一个实际的应用场景中的示例性应用。
通常在程序出现问题时,需要去分析定位问题,比如远程调试,分析打印日志等等,但是当实际应用场景中不方便使用这些方法定位问题时,比如生产环境不支持远程调试,代码没有打印日志,测试环境无法重现等,则需要开发人员重新检查代码以及不同版本代码的变更情况以分析定位问题,而开发人员查看代码时一般需要了解代码上下文情况,了解代码的用途和提交记录。因此,如果能快速地将问题代码出现的问题定位到问题行以及问题代码的提交历史记录,便能更快的提供关键信息给相关人员以解决代码的相关问题。
应用程序的代码基本都会使用版本管理系统进行版本管理,以保存每一次变更的代码版本记录,如果当前程序部署的版本代码发生问题,则可以通过版本记录部署上一次版本来重现和验证问题。因此本申请实施例通过获取当前程序包的当前版本代码和上一个版本代码的差异文件,通过动态替换方式将差异文件加载到当前运行的程序中,并结合流量回放技术,回放请求数据,检查并验证此次回放的结果。如此反复加载上一个版本文件和回放验证,确认出现问题的版本代码的提交记录。
参见图5,图5是本申请实施例提供的程序测试方法的流程示意图,下面将结合图5示出的步骤进行详细说明。
在步骤201中,获取程序代码版本列表。
即从版本管理系统系统列表中获取当前代码版本与版本历史记录中的历史代码版本,比如代码版本:A-B-C-D。
在步骤202中,倒序选择代码版本,选择前一个版本。
承接上例,假设当前运行的程序对应的代码版本D存在异常,则需要倒序选择代码版本,获取相较于代码版本D的前一个代码版本C,然后通过git diff命令获取D和C两个代码版本对应的版本代码之间的差异文件。
在步骤203中,动态替换程序文件。
通过Java的动态替换能力将差异文件加载到当前运行的程序中,得到目标程序,并保证目标程序运行正常,此时记录该差异文件对应的代码版本C的编号和运行目标程序的服务器地址。
在步骤204中,流量回放到指定服务。
发起流量回放,将流量回放平台预先录制的流量数据中所包括的请求数据以http请求的方式访问步骤203中记录的服务器地址,从而接收到服务器针对请求数据的返回结果;或者也可以将流量回放平台预先录制的流量数据中所包括的请求数据以http请求的方式访问运行有目标程序的服务实例,从而得到服务实例针对请求数据的返回结果。
在步骤205中,验证返回结果是否符合预期,若是,则执行步骤206,若否,则执行步骤202。
即验证返回结果的http状态码是否等于200,以及验证返回结果中是否包含预设的字段数据,如果返回结果的http状态码等于200,或者返回结果中包含预设的字段数据,则表示返回结果符合预期,也即目标程序运行正常,此时继续执行步骤206;如果返回结果的http状态码不等于200,并且返回结果中也并未包含预设的字段数据,则表示返回结果不符合预期,也即目标程序运行异常,此时返回执行步骤202,即将代码版本C作为当前代码版本,并继续选择前一个代码版本B对应的版本代码进行验证。
在步骤206中,根据返回结果确定正常版本代码,并推导出出现异常的版本代码。
承接上例,当通过步骤205确定代码版本C为正常代码版本时,则确定代码版本C的后一个代码版本对应的版本代码为异常开始的版本代码,即代码版本D对应的版本代码为开始出现异常的版本代码。当通过步骤205确定代码版本B为正常代码版本时,则确定代码版本B的后一个代码版本对应的版本代码为异常开始的版本代码,即代码版本C对应的版本代码为开始出现异常的版本代码。
下面继续说明本申请实施例在一个实际的应用场景中的示例性应用,参见图6,图6是本申请实施例提供的程序测试方法的交互流程示意图,下面结合图6示出的步骤进行说明。
在步骤301中,验证平台在服务实例中准备类生产环境。
类生产环境即和生产环境一致的环境,例如预发布环境,然后部署当前需验证的运行程序(初始程序),比如线上部署的运行程序的镜像文件。
在步骤302中,验证平台向版本管理系统请求当前版本的父版本。
当时用Git作为版本管理系统时,验证平台从Git中查找到运行程序的当前代码版本的上一个代码版本的相关信息,上一个代码版本中包含差异文件,比如从git log中查找当前代码版本的版本编号(commit ID)的上一个代码版本的版本编号(parent commitID。
在步骤303中,版本管理系统向验证平台返回和上一个版本的差异文件。
在查询到当前代码版本和上一个代码版本后对两个代码版本对应的版本代码进行对比,得到上一个代码版本对应的差异文件列表,然后将差异文件添加到当前代码版本对应的版本代码中,得到parent commitId对应的文件内容;或者通过对比当前代码版本对应的版本代码与上一个代码版本对应的版本代码,得到差异文件。
在步骤304中,验证平台在服务实例中部署差异文件代码。
参见图7,图7是本申请实施例提供的动态替换差异文件的示意图,如图7所示,在得到差异文件后,验证平台基于Java中的java.lang.instrument包,通过instrumentation构建一个独立于初始程序(即运行程序)的代理程序包,用于替换和修改运行于服务实例中的初始程序中某些类的定义。首先将差异文件通过程序编码制作成符合规范的java代理程序t包,将代理程序包和包含附加服务的jar包一起挂载到运行程序的服务实例上,当启动附加服务时,由附加服务将代理程序包发送到服务实例的运行程序进程中,实现在服务实例的程序进程中加载需要修改的类文件(即差异文件)。需要说明的是,验证平台上可以同时针对多个运行程序进行测试,或者针对同一个程序的多个不同代码版本同时进行测试,因此图7中示出的是多线程处理过程。
继续参见图6,在步骤305中,验证平台向流量回放平台请求流量回放。
在步骤306中,流量回放平台将录制的网络请求重新发送到服务实例。
验证平台向流量回放平台请求流量回放后,流量回放平台将需要验证的请求数据发送至运行有已加载差异文件的程序进程的服务实例上,等待服务实例返回请求结果,这里可以同时部署多个服务实例,对比得到多个代码版本对应的版本代码之间的差异文件,并制作成不同版本之间的差异文件对应的agent包,分别加载到不同的服务实例上,发起多次流量回放,即分别以http方式请求到服务实例上,并接收返回请求结果数据,以同时针对多个代码版本进行测试。
在步骤307中,服务实例向验证平台返回响应结果。
服务实例接收到流量回放平台发送的网络请求后进行响应,从而返回响应结果,验证平台获取响应结果后,针对响应结果进行分析,参见图8,图8是本申请实施例提供的服务实例的响应数据示意图,图8中的http请求结果即服务实例针对请求数据进行响应得到的响应数据,对响应数据进行验证时,可以通过设置两个验证点分别对响应结果进行验证,当响应数据与验证点1设置的验证数据不相同,即响应结果中未包含预设状态码(例如200),并且,将验证点2设置的正则表达式与响应数结果进行正则匹配时,响应数据与验证点2设置的正则表达式匹配失败,即响应结果中不包含预设字段数据,则认为运行有目标程序的服务实例响应失败,从而得到验证结果,即确定程序运行异常;当响应数据中包含验证点1设置的预设状态码(例如200)时,则认为运行有程序的服务实例响应成功;或者,通过验证点2设置的正则表达式与响应数据进行正则匹配,当响应数据与验证点2设置的正则表达式匹配成功,即响应结果中包含预设字段数据时,则也认为运行有程序的服务实例响应成功,从而得到验证结果,即确定程序运行正常。
可以理解的是,在本申请实施例中,涉及到用户信息等相关的数据,当本申请实施例运用到具体产品或技术中时,需要获得用户许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
下面继续说明本申请实施例提供的程序测试装置455的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器440的程序测试装置455中的软件模块可以包括:
程序确定模块4551,用于基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序;流量回放模块4552,用于针对所述目标程序进行流量回放,得到所述目标程序的回放结果;第一确定模块4553,用于响应于所述回放结果表征所述目标程序运行异常,确定所述历史代码版本为新的当前代码版本;第二确定模块4554,用于响应于所述回放结果表征所述目标程序运行正常,确定所述历史代码版本对应的版本代码为正常版本代码,并确定对所述历史代码版本更新后的代码版本的版本代码为异常版本代码。
在一些实施例中,程序确定模块4551,还用于基于所述当前代码版本对应的版本代码以及所述历史代码版本对应的版本代码,确定所述差异文件;将所述差异文件加载至所述初始程序中,得到所述目标程序。
在一些实施例中,程序确定模块4551,还用于对所述差异文件进行编码处理,得到代理程序包;将所述代理程序包通过附加服务加载至所述初始程序中,得到所述目标程序。
在一些实施例中,程序确定模块4551,还用于基于所述当前代码版本对应的版本代码以及所述差异文件,确定所述历史代码版本对应的版本代码;对所述历史代码版本对应的版本代码进行编码处理,得到所述目标程序。
在一些实施例中,流量回放模块4552,还用于获取预先录制的请求数据;通过运行有所述目标程序的服务实例对所述请求数据进行响应,得到所述请求数据的响应数据,并将所述响应数据作为所述回放结果。
在一些实施例中,第一确定模块4553,还用于响应于所述回放结果不包括预设状态码、且所述回放结果不包含预设字段数据,确定所述回放结果表征所述目标程序运行异常。
在一些实施例中,第二确定模块4554,还用于响应于所述回放结果包括预设状态码,或者所述回放结果包含预设字段数据,确定所述回放结果表征所述目标程序运行正常。
在一些实施例中,程序确定模块4551,还用于确定所述当前代码版本与待验证的代码版本之间的版本间隔值;基于所述当前代码版本与所述版本间隔值,确定所述历史代码版本。
在一些实施例中,程序确定模块4551,还用于显示多个候选版本间隔值;响应于针对所述多个候选版本间隔值的选择操作,将选中的所述候选版本间隔值作为所述版本间隔值。
在一些实施例中,程序确定模块4551,还用于根据历史测试数据中的历史版本间隔值,自动确定所述当前代码版本与待验证的代码版本之间的版本间隔值。
在一些实施例中,程序确定模块4551,还用于响应于所述历史测试数据中的迭代次数大于第一迭代次数阈值,增加所述历史版本间隔值,将增加后的所述历史版本间隔值作为所述版本间隔值;响应于所述历史测试数据中的迭代次数小于第二迭代次数阈值,减少所述历史版本间隔值,将减少后的所述历史版本间隔值作为所述版本间隔值。
在一些实施例中,程序确定模块4551,还用于基于所述初始程序的多个版本代码以及所述当前代码版本对应的版本代码调用神经网络模型进行预测处理,得到所述版本间隔值,其中,所述神经网络模型是基于当前版本代码样本、历史版本代码样本以及所述历史版本代码样本的测试标签训练得到的,所述测试标签包括所述历史版本代码样本的异常标签或正常标签。
在一些实施例中,在基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序之前,开始迭代处理,其中,所述迭代处理包括基于当前代码版本确定所述回放结果的过程;在确定对所述历史代码版本进行更新后的代码版本的版本代码为异常版本代码之后,结束所述迭代处理。
本申请实施例提供了一种计算机程序产品,该计算机程序产品包括计算机程序或计算机可执行指令,该计算机程序或计算机可执行指令存储在计算机可读存储介质中。电子设备的处理器从计算机可读存储介质读取该计算机可执行指令,处理器执行该计算机可执行指令,使得该电子设备执行本申请实施例上述的程序测试方法。
本申请实施例提供一种存储有计算机可执行指令的计算机可读存储介质,其中存储有计算机可执行指令或者计算机程序,当计算机可执行指令或者计算机程序被处理器执行时,将引起处理器执行本申请实施例提供的程序测试方法,例如,如图3A示出的程序测试方法。
在一些实施例中,计算机可读存储介质可以是RAM、ROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,计算机可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,计算机可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(Hyper TextMarkup Language,HTML)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,计算机可执行指令可被部署为在一个电子设备上执行,或者在位于一个地点的多个电子设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个电子设备上执行。
综上所述,通过本申请实施例通过将当前版本代码与历史代码版本之间的差异文件加载至初始程序中,得到目标程序,能够快速得到待测试的目标程序,提高测试效率,然后针对目标程序进行流量回放,进而根据流量回放结果确定历史代码版本是否异常,能够快速定位开始出现问题的代码版本,从而减少了测试过程中的人员参与,提高了程序测试的效率。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。

Claims (16)

1.一种程序测试方法,其特征在于,所述方法包括:
基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序;
针对所述目标程序进行流量回放,得到所述目标程序的回放结果;
响应于所述回放结果表征所述目标程序运行异常,确定所述历史代码版本为新的当前代码版本;
响应于所述回放结果表征所述目标程序运行正常,确定所述历史代码版本对应的版本代码为正常版本代码,并确定对所述历史代码版本进行更新后的代码版本的版本代码为异常版本代码。
2.根据权利要求1所述的方法,其特征在于,所述基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序,包括:
基于所述当前代码版本对应的版本代码以及所述历史代码版本对应的版本代码,确定所述差异文件;
将所述差异文件加载至所述初始程序中,得到所述目标程序。
3.根据权利要求2所述的方法,其特征在于,所述将所述差异文件加载至所述初始程序中,得到所述目标程序,包括:
对所述差异文件进行编码处理,得到代理程序包;
将所述代理程序包通过附加服务加载至所述初始程序中,得到所述目标程序。
4.根据权利要求1所述的方法,其特征在于,所述基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序,包括:
基于所述当前代码版本对应的版本代码以及所述差异文件,确定所述历史代码版本对应的版本代码;
对所述历史代码版本对应的版本代码进行编码处理,得到所述目标程序。
5.根据权利要求1所述的方法,其特征在于,所述针对所述目标程序进行流量回放,得到所述目标程序的回放结果,包括:
获取预先录制的请求数据;
通过运行有所述目标程序的服务实例对所述请求数据进行响应,得到所述请求数据的响应数据,并将所述响应数据作为所述回放结果。
6.根据权利要求1所述的方法,其特征在于,所述方法还包括:
响应于所述回放结果不包括预设状态码、且所述回放结果不包含预设字段数据,确定所述回放结果表征所述目标程序运行异常;
响应于所述回放结果包括预设状态码,或者所述回放结果包含预设字段数据,确定所述回放结果表征所述目标程序运行正常。
7.根据权利要求1所述的方法,其特征在于,所述基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序之前,所述方法还包括:
确定所述当前代码版本与待验证的代码版本之间的版本间隔值;
基于所述当前代码版本与所述版本间隔值,确定所述历史代码版本。
8.根据权利要求7所述的方法,其特征在于,所述确定所述当前代码版本与待验证的代码版本之间的版本间隔值,包括:
显示多个候选版本间隔值;
响应于针对所述多个候选版本间隔值的选择操作,将选中的所述候选版本间隔值作为所述版本间隔值。
9.根据权利要求7所述的方法,其特征在于,所述确定所述当前代码版本与待验证的代码版本之间的版本间隔值,包括:
根据历史测试数据中的历史版本间隔值,自动确定所述当前代码版本与待验证的代码版本之间的版本间隔值。
10.根据权利要求9所述的方法,其特征在于,所述根据历史测试数据中的历史版本间隔值,自动确定所述当前代码版本与待验证的代码版本之间的版本间隔值,包括:
响应于所述历史测试数据中的迭代次数大于第一迭代次数阈值,增加所述历史版本间隔值,将增加后的所述历史版本间隔值作为所述版本间隔值;
响应于所述历史测试数据中的迭代次数小于第二迭代次数阈值,减少所述历史版本间隔值,将减少后的所述历史版本间隔值作为所述版本间隔值。
11.根据权利要求7所述的方法,其特征在于,所述确定所述当前代码版本与待验证的代码版本之间的版本间隔值,包括:
基于所述初始程序的多个版本代码以及所述当前代码版本对应的版本代码调用神经网络模型进行预测处理,得到所述版本间隔值,其中,所述神经网络模型是基于当前版本代码样本、历史版本代码样本以及所述历史版本代码样本的测试标签训练得到的,所述测试标签包括所述历史版本代码样本的异常标签或正常标签。
12.根据权利要求1所述的方法,其特征在于,在基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序之前,开始迭代处理,其中,所述迭代处理包括基于当前代码版本确定所述回放结果的过程;
在确定对所述历史代码版本进行更新后的代码版本的版本代码为异常版本代码之后,结束所述迭代处理。
13.一种程序测试装置,其特征在于,所述装置包括:
程序确定模块,用于基于初始程序的当前代码版本与所述当前代码版本的历史代码版本之间的差异文件,确定目标程序;
流量回放模块,用于针对所述目标程序进行流量回放,得到所述目标程序的回放结果;
第一确定模块,用于响应于所述回放结果表征所述目标程序运行异常,确定所述历史代码版本为新的当前代码版本;
第二确定模块,用于响应于所述回放结果表征所述目标程序运行正常,确定所述历史代码版本对应的版本代码为正常版本代码,并确定对所述历史代码版本更新后的代码版本的版本代码为异常版本代码。
14.一种电子设备,其特征在于,所述电子设备包括:
存储器,用于存储计算机可执行指令或者计算机程序;
处理器,用于执行所述存储器中存储的计算机可执行指令或者计算机程序时,实现权利要求1至12任一项所述的程序测试方法。
15.一种计算机可读存储介质,存储有计算机可执行指令或者计算机程序,其特征在于,所述计算机可执行指令或者计算机程序被处理器执行时实现权利要求1至12任一项所述的程序测试方法。
16.一种计算机程序产品,包括计算机可执行指令或计算机程序,其特征在于,所述计算机可执行指令或计算机程序被处理器执行时实现权利要求1至12任一项所述的程序测试方法。
CN202311572412.8A 2023-11-22 2023-11-22 程序测试方法、装置、电子设备及计算机可读存储介质 Pending CN117950991A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311572412.8A CN117950991A (zh) 2023-11-22 2023-11-22 程序测试方法、装置、电子设备及计算机可读存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311572412.8A CN117950991A (zh) 2023-11-22 2023-11-22 程序测试方法、装置、电子设备及计算机可读存储介质

Publications (1)

Publication Number Publication Date
CN117950991A true CN117950991A (zh) 2024-04-30

Family

ID=90791234

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311572412.8A Pending CN117950991A (zh) 2023-11-22 2023-11-22 程序测试方法、装置、电子设备及计算机可读存储介质

Country Status (1)

Country Link
CN (1) CN117950991A (zh)

Similar Documents

Publication Publication Date Title
CN109302522B (zh) 测试方法、装置以及计算机系统和介质
US6941546B2 (en) Method and apparatus for testing a software component using an abstraction matrix
CN110554965B (zh) 自动化模糊测试方法及相关设备、计算机可读存储介质
EP3353648A1 (en) Methods and systems for uploading a program based on a target network platform
JP4023803B2 (ja) ウェブアプリケーション開発支援装置、データ処理方法及びプログラム
US9940215B2 (en) Automatic correlation accelerator
US10705949B2 (en) Evaluation of library test suites using mutation testing
CN113868126A (zh) 应用调试方法、装置、设备的存储介质
CN103186463B (zh) 确定软件的测试范围的方法和系统
CN110879781A (zh) 程序调试方法、装置、电子设备及计算机可读存储介质
CN112540924A (zh) 接口自动化测试方法、装置、设备及存储介质
CN112433948A (zh) 一种基于网络数据分析的仿真测试系统及方法
CN112650688A (zh) 自动化回归测试方法、关联设备以及计算机程序产品
CN114328250A (zh) 软件系统自动自检方法、介质和装置
CN114116505A (zh) 代码测试方法及装置
CN112241370B (zh) 一种api接口类的校验方法、系统及装置
CN111666201A (zh) 回归测试方法、装置、介质及电子设备
CN115658452A (zh) 埋点校验方法、埋点校验装置、可读存储介质、电子设备
CN115470152A (zh) 测试代码生成方法、测试代码生成装置以及存储介质
CN117950991A (zh) 程序测试方法、装置、电子设备及计算机可读存储介质
CN114490337A (zh) 调测方法、调测平台、设备及存储介质
CN113485919A (zh) 测试方法、测试装置及计算机可读存储介质
JP2014519671A (ja) スクリプト依存関係をインライン化するためのシステムおよび方法
CN112783789A (zh) 一种适配测试方法、设备及计算机可读存储介质
CN112765040B (zh) 页面测试方法、系统、计算机设备和存储介质

Legal Events

Date Code Title Description
PB01 Publication
SE01 Entry into force of request for substantive examination