CN116541278A - 一种单元测试用例生成方法、装置、设备及存储介质 - Google Patents

一种单元测试用例生成方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN116541278A
CN116541278A CN202310498073.7A CN202310498073A CN116541278A CN 116541278 A CN116541278 A CN 116541278A CN 202310498073 A CN202310498073 A CN 202310498073A CN 116541278 A CN116541278 A CN 116541278A
Authority
CN
China
Prior art keywords
function
unit test
data
preset
target
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
CN202310498073.7A
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.)
Shanghai Weimeng Enterprise Development Co ltd
Original Assignee
Shanghai Weimeng Enterprise Development 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 Shanghai Weimeng Enterprise Development Co ltd filed Critical Shanghai Weimeng Enterprise Development Co ltd
Priority to CN202310498073.7A priority Critical patent/CN116541278A/zh
Publication of CN116541278A publication Critical patent/CN116541278A/zh
Pending legal-status Critical Current

Links

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
    • 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)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本申请公开了一种单元测试用例生成方法、装置、设备及存储介质,涉及软件测试领域,包括:接收流量采集请求,并加载函数识别规则判断是否修改流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集;从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口上传至Mysql数据库;利用预设工具包从Mysql数据库拉取目标函数的函数信息,并通过预设应用程序编程接口基于函数信息将目标数据转换为单元测试用例。通过采集真实的请求数据确定真实的函数调用场景更能保护函数代码被修改后的稳定性,并且通过修改字节码实现函数的增强,避免生成多个代理类的顺序影响,以及提高单元测试用例的生成效率。

Description

一种单元测试用例生成方法、装置、设备及存储介质
技术领域
本发明涉及软件测试领域,特别涉及一种单元测试用例生成方法、装置、设备及存储介质。
背景技术
现有技术中,在单元测试用例的编写过程中,编写成本太高。首先是开发成本,在系统初期开发者可能需要话费大量时间编写新业务,而老系统又由于太过庞大,无法方便的进行更改等操作;其次是系统维护成本,每次修改相关的类,或者重构一次代码,就需要修改相应的单元测试用例。
一个单元测试用例的传统写法包括以下四个步骤:测试数据的准备,桩函数的编写,被测方法的调用,返回结果的断言。在这个过程中,测试数据的真实性如果不够,那么单元测试发挥不了太大的作用,而想要构造一份接近真实的测试数据,所需要花费的时间成本是非常高的,因此在现有技术背景下手动编写单元测试用例的方式是成本高回报低的。所以,如何根据真实的调用数据自动生成高质量的Java单元测试用例的,并解决传统的手动编写单元测试用例导致的成本高回报低的问题是本领域亟待解决的问题。
发明内容
有鉴于此,本发明的目的在于提供一种单元测试用例生成方法、装置、设备及存储介质,可以通过采集真实的请求数据确定真实的函数调用场景更能保护函数代码被修改后的稳定性,并且通过修改字节码实现函数的增强,避免生成多个代理类的顺序影响,以及提高单元测试用例的生成效率。其具体方案如下:
第一方面,本申请提供了一种单元测试用例生成方法,包括:
接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集;
根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;
利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。
可选的,所述基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,包括:
获取所述流量采集请求中的一次入口调用和若干次子调用,并将所述子调用作为所述入口调用的桩函数;
基于所述函数识别规则判断是否修改所述目标函数的函数字节码,若是,则通过软件开发工具包利用jvm沙箱机制修改所述入口函数和所述桩函数的函数字节码;其中,所述目标函数包括所述桩函数以及所述入口调用的入口函数。
可选的,所述根据判断结果进行流量采集,包括:
在所述目标函数被调用后,将用于采集请求参数的第一代码织入至所述目标函数,并根据所述第一代码记录所述目标函数的请求参数;
在所述目标函数返回结果后,将用于采集返回参数的第二代码织入至所述目标函数,并根据所述第二代码记录所述目标函数的返回结果。
可选的,所述根据所述预设配置文件从采集到的流量数据中筛选出目标数据,包括:
基于软件开发工具包扫描所述预设配置文件,根据所述预设配置文件中的预设规则确定出所述流量数据对应的具体场景,并筛选出目标场景,以将所述目标场景下的与单次流量采集请求对应的所述流量数据作为目标数据。
可选的,所述通过Java数据库连接接口将所述目标数据上传至Mysql数据库,包括:
通过Java数据库连接接口根据预设上传间隔时间和预设上传容量将所述目标数据定时批量上传至Mysql数据库。
可选的,所述利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息之前,还包括:
根据预设SQL代码在所述Mysql数据库中生成入口函数调用信息表和桩函数调用信息表;所述入口函数调用信息表和所述桩函数调用信息表用于存储所述目标数据。
可选的,所述通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例,包括:
加载所述预设配置文件中的数据填充规则,并根据所述数据填充规则将所述函数信息填充至预设单元测试用例模版的对应占位符,以根据所述预设单元测试用例模版将所述目标数据转换为单元测试用例。
第二方面,本申请提供了一种单元测试用例生成装置,包括:
流量采集模块,用于接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集;
数据筛选模块,用于根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;
数据转换模块,用于利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。
第三方面,本申请提供了一种电子设备,所述电子设备包括处理器和存储器;其中,所述存储器用于存储计算机程序,所述计算机程序由所述处理器加载并执行以实现前述的单元测试用例生成方法。
第四方面,本申请提供了一种计算机可读存储介质,用于保存计算机程序,所述计算机程序被处理器执行时实现前述的单元测试用例生成方法。
本申请中,接收流量采集请求后,加载通过预设配置文件配置的函数识别规则,基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,并根据判断结果进行流量采集;然后根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。通过上述技术方案,可以采集真实的请求数据确定真实的函数调用场景更能保护函数代码被修改后的稳定性,并且通过修改字节码实现函数的增强,避免通过生成目标类的代理类来实现函数的增强时,由于目标类的代理类在真实的场景下可能存在多个导致的多个代理类的顺序影响函数增强的问题,以及提高单元测试用例的生成效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请提供的一种单元测试用例生成方法流程图;
图2为本申请提供的一种单元测试用例生成方法总体架构图;
图3为本申请提供的一种字节码修改流程图;
图4为本申请提供的一种函数识别配置文件示例图;
图5为本申请提供的一种数据库连接信息配置文件示例图;
图6为本申请提供的一种函数调用信息表配置文件示例图;
图7为本申请提供的一种具体的单元测试用例生成方法流程图;
图8为本申请提供的一种流量采集流程图;
图9为本申请提供的一种数据筛选配置文件示例图;
图10为本申请提供的一种SPI机制扩展接口伪代码示例图;
图11为本申请提供的一种数据填充方法流程图;
图12为本申请提供的一种单元测试数据转换API伪代码示例图;
图13为本申请提供的一种单元测试用例模版示例图;
图14为本申请提供的一种单元测试用例模版示例图;
图15为本申请提供的一种严格模式和次严格模式伪代码示例图;
图16为本申请提供的一种自定义比较模式伪代码示例图;
图17为本申请提供的一种单元测试用例生成装置结构示意图;
图18为本申请提供的一种电子设备结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在单元测试用例的编写过程中,在系统初期开发者可能需要话费大量时间编写新业务,并且每次修改相关的类,或者重构一次代码,就需要修改相应的单元测试用例,导致需要花费的成本非常高,而本申请可以通过采集真实的请求数据确定真实的函数调用场景更能保护函数代码被修改后的稳定性,并且通过修改字节码实现函数的增强,提高单元测试用例的生成效率。
参见图1所示,本发明实施例公开了一种单元测试用例生成方法,包括:
步骤S11、接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集。
本实施例中,在进行单元测试用例生成之前,由于需要采集真实数据,因此可以首先接收流量采集请求,并且上述流量采集请求中包括需要采集的流量数据类型。本实施例中,流量采集由流量采集工具包(traffic-record-sdk)完成,如图2所示,流量采集工具包(traffic-record-sdk)由三个模块组成:流量采集模块,数据清洗模块和数据上传模块。通过接入流量采集工具包的应用即可实现采集真实数据,需要指出的是,上述真实数据是指调用某个具体函数的入参和出参。
本实施例中,在流量采集模块中,上述流量采集体系下,一次完整的请求由一次入口调用和若干个关联的子调用组成。入口调用(即入口函数,指流量的入口,在java中等同于方法,入口函数是单元测试的核心,本实施例中生成单元测试的目的就是为了测试入口函数的正确性)会作为单元测试的主体,也就是被测方法,关联的子调用(即子函数,入口函数间接调用的一些列函数)会作为被测方法的桩函数(即需要打桩的函数,通常是一些外部接口,中间件等,桩函数会mock掉不发起真实的调用)。因此,综上所述,本实施例中首先需要获取流量采集请求中的一次入口调用和若干次子调用,并将所述子调用作为所述入口调用的桩函数。如图3所示,在确定需要调用的函数之后,加载通过预设配置文件配置的函数识别规则,以基于函数识别规则判断是否修改流量采集请求对应的目标函数的函数字节码,若需要修改桩函数或入口函数的函数字节码,则通过SDK(Software Development Kit,软件开发工具包)利用开源工具jvm-sandbox(jvm沙箱机制,一种基于Instrumentation的动态编织类的面向切面编程框架,可以在不重启应用的情况下,在运行时完成目标方法的增强和替换)修改入口函数和桩函数的函数字节码。这样一来,通过借助开源工具jvm-sandbox修改字节码来实现jvm层面的AOP(Aspect Oriented Programming,面向切面编程),避免了常见的AOP(AspectJ和SpringAOP等)技术的切面顺序问题,由于AspectJ和SpringAOP都是通过生成目标类的代理类来实现函数的增强,而目标类的代理类在真实的场景下可能不止一个,因此多个代理类的顺序会影响函数的增强,而本实施例中字节码层面的增强则没有这个问题,实现了一种在不重启、不侵入目标JVM应用的AOP解决方案,可以改善单元测试生成的效果。
本实施例中借助修改入口函数和桩函数的字节码来实现流量采集,因此在目标函数被调用后,将用于采集请求参数的第一代码织入至目标函数,并根据第一代码记录目标函数的请求参数;并在目标函数返回结果后,将用于采集返回参数的第二代码织入至目标函数,并根据第二代码记录目标函数的返回结果。可以理解的是,在方法抛出异常后也可以织入采集异常信息的代码,以采集相应的异常信息。需要指出的是,本实施例中SDK提供了两套识别入口函数和桩函数的方案。在一种具体的实施例中,通过配置文件配置规则识别入口函数和桩函数,即在接入SDK的应用启动时,扫描配置文件。配置文件在应用的resource文件夹下,名称为“traffic-collect-config.properties”。这样一来,SDK通过识别配置文件配置的入口函数和桩函数识别表达式来确定函数是入口函数还是桩函数,配置文件的具体写法如图4所示。在另一种具体的实施例中,SDK提供注解来标识入口函数(@EntranceInvocation)和桩函数(@StubInvocation),即开发者根据实际情况,在应用代码的入口函数打上@EntranceInvocation标记,桩函数打上@StubInvocation标记,以进行函数识别。
步骤S12、根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库。
本实施例中,根据预设配置文件从采集到的流量数据中筛选出目标数据后,通过Java数据库连接接口(Java Database Connectivity,JDBC,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法)根据预设上传间隔时间和预设上传容量将内存中的目标数据定时批量上传至Mysql数据库(一个关系型数据库管理系统)。通过定时批量上传数据,可以最大限度地避免引入SDK应用的影响。
步骤S13、利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。
本实施例中,如图2所示,通过自动生成单元测试代码工具包的数据拉取模块,利用预设工具包通过JDBC从Mysql数据库拉取目标函数的函数信息,并通过预设应用程序编程接口(Application Programming Interface,API)基于所述函数信息将所述目标数据转换为单元测试用例。
需要指出的是,上述目标函数的函数信息存储在Mysql数据库的信息表中,因此在从Mysql数据库拉取目标函数的函数信息之前,需要根据预设SQL(Structured QueryLanguage,结构化查询语言,一种数据库查询和程序设计语言)代码在Mysql数据库中生成入口函数调用信息表和桩函数调用信息表;上述入口函数调用信息表和桩函数调用信息表用于存储目标数据。本实施例中,Mysql数据库由开发者提供,本实施例提供生成对应信息表的SQL代码,生成信息表时,数据库的连接信息需要写在resource文件夹下名称为“traffic-collect-config.properties”的配置文件里,配置的写法如图5所示。并且本实施例设计了两张信息表来存储流量采集工具包上传的函数数据,分别为traffic_entrance_invocation(入口函数调用信息表)和traffic_stub_invocation(桩函数调用信息表),其中入口函数和关联的桩函数通过trace_id来关联,上述信息表的结构如图6所示,开发者需要将图6中的SQL代码放到指定的数据库以生成对应的表。
综上所述,本实施例接收流量采集请求,加载通过预设配置文件配置的函数识别规则,基于函数识别规则判断是否修改对应的入口函数和桩函数的函数字节码,若需要,则通过SDK利用开源工具jvm-sandbox修改函数字节码。然后根据预设配置文件从采集到的流量数据中筛选出目标数据,并将目标数据定时批量上传至Mysql数据库的对应的信息表中。通过上述技术方案,本实施例利用预设工具包通过从Mysql数据库拉取目标函数的函数信息,并通过API基于所述函数信息将目标数据转换为单元测试用例。这样一来,通过借助开源工具jvm-sandbox修改字节码来实现jvm层面的AOP,避免了常见的AOP技术的切面顺序问题,避免因为多个代理类的顺序会影响函数的增强,实现了一种在不重启、不侵入目标JVM应用的AOP解决方案,可以改善单元测试生成的效果;并且通过定时批量上传数据,可以最大限度地避免引入SDK应用的影响。
基于上一实施例可知,本申请可以通过修改函数字节码的方式生成单元测试,但是需要指出的是,在生成单元测试时,仅需要某个具体场景下的一次请求数据,因此,接下来,本实施例中将对请求数据的筛选以及针对上述请求数据生成单元测试的过程进行详细地阐述。参见图7所示,本申请实施例公开了一种具体的单元测试用例生成方法,包括:
步骤S21、接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集。
步骤S22、基于软件开发工具包扫描所述预设配置文件,根据所述预设配置文件中的预设规则确定出采集到的流量数据对应的具体场景,并筛选出目标场景,以将所述目标场景下的与单次流量采集请求对应的所述流量数据作为目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库。
本实施例中,考虑到并不是所有采集到的流量都需要成为生成单元测试用例的数据源,事实上大部分请求都是某些特定场景下重复的请求,对于写单元测试来讲,只是需要某个具体场景下的一次请求数据就够了。因此,如图8所示,本实施例可以根据图2中的数据清洗模块,识别出具体的场景,然后筛选出对应的请求数据并上传至数据库。在一种具体的实施例中,基于软件开发工具包扫描所述预设配置文件(与上一实施例中的配置文件相同,即resource文件夹下名称为"traffic-collect-config.properties"的配置文件),根据所述预设配置文件中的预设规则确定出采集到的流量数据对应的具体场景,进行流量数据的分组和过滤(默认每个分组只保留一次请求的完整调用链信息),配置文件写法如图9所示,筛选出目标场景后,将目标场景下的与单次流量采集请求对应的流量数据作为目标数据。在另一种具体的实施例中,通过Java的SPI机制(Service Provider Interface,SPI机制是Java的一种服务发现机制,用于应用扩展。即在定义一个接口后,不提供实现,接口实现由其他系统应用实现,只需要提供一种可以找到其他系统提供的接口实现类)扩展指定接口,实现TrafficSceneGroupRule接口,在实现类上打上@MetaInfServices(TrafficSceneGroupRule.class)注解,或者在“META-INF/servic es/”增加配置文件,文件名称为TrafficSceneGroupRule接口的全类名,文件内容为TrafficSceneGroupRule实现类的全类名,TrafficSceneGroupRule接口伪代码如图10所示,通过图10中的接口伪代码筛选出目标场景,进一步确定目标数据。这样一来,通过将采集到的流量按场景分类,同一个场景下只保留一份真实请求数据,以便将多个场景的请求数据定时批量上传,减少了对应用正常服务的干扰,也提高了数据上传的效率。
步骤S23、利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,加载所述预设配置文件中的数据填充规则,并根据所述数据填充规则将所述函数信息填充至预设单元测试用例模版的对应占位符,以根据所述预设单元测试用例模版将所述目标数据转换为单元测试用例。
本实施例中,如图2所示,自动生成单元测试代码工具包(auto-generate-test-sdk)由三个模块组成,包括:数据拉取模块,模版填充模块,代码文件生成模块,需要指出的是,本实施例可以将应用的启动参数加入-javaagent:/流量采集工具包jar文件所在的路径/traffic-record-sdk.jar,通过maven引入auto-generate-test-sdk依赖。如图11所示,利用自动生成单元测试代码工具包确定场景key后,查找对应的请求链路,通过从Mysql数据库拉取目标函数的函数信息,加载所述预设配置文件中的数据填充规则,并根据数据填充规则将函数信息填充至预设单元测试用例模版的对应占位符,以根据预设单元测试用例模版将目标数据转换为单元测试用例,需要指出的是,上述数据填充规则包括参数比较和返回结果断言规则。本实施例中提供两套API将采集到的流量转换成可运行的单元测试用例,开发者可以调用接口来实现自动生成单元测试代码文件,API的伪代码如图12所示,分别可以根据场景名称和时间范围生成单元测试用例。
本实施例中,调用自动生成单元测试代码工具包提供的生成测试代码文件的API,传入场景key或者流量时间段,以及生成Java代码文件的路径利用图2中所示的模版填充模块将函数信息填充至预设单元测试用例模版的对应占位符,需要指出的是,在填充函数信息之前,需要生成单元测试用例模版,本实施例使用了Junit5(一个Java语言的单元测试框架)+Mockito(一个针对Java的mocking框架)的单元测试用例模版,模版中的可变部分(单用测试类名,单元测试方法名,桩函数方法名等)用占位符表示,上述拉取的入口函数以及关联的桩函数信息被填充到指定的占位符上,并且一个场景Key下的入口函数以及关联的桩函数会生成一份Junit5+Mockito的Java代码文件。可以理解的是,本实施例中的作为单元测试主体的入口函数的写法和作为桩函数的单元测试写法都是固定的,模版样式如图13和图14所示,图中“$xxx”即是占位符。需要指出的是,在将函数信息填充至预设单元测试用例模版的对应占位符的过程中,需要判断关于桩函数的实际入参和预期入参,实际的返回结果和预期的返回结果是否一致,具体地,SDK提供了三种比较模式,包括严格模式,次严格模式,自定义比较模式。其中次严格模式为缺省的模式。如图15所示,严格模式,用于对比实际的结果与预期的结果参数的名称,值,以及顺序是否一致;次严格模式,用于对比实际的结果与预期的结果的名称,值是否一致。如图16所示,自定义比较模式,由开发者自定义,SDK定义了比较器的SPI,由开发者通过Java的SPI机制扩展该接口的实现来完成参数的比较。经过模版填充后,就得到了一份单元测试用例代码,但是此时的单元测试用例代码文件存储在内存中,需要把代码文件输出到指定的磁盘位置。因此需要利用SDK通过IO流把内存中的代码写入到用户指定的(生成单元测试用例入口处传入的outputPath)路径下。综上所述,自动生成单元测试代码工具包提供自动生成Java测试代码文件的API使开发者可以利用一行代码(调用API的代码)就可以直接生成一份包括真实场景的单元测试用例代码,例如构造数据,编写桩函数,编写入口返回参数断言等重复工作所花费的时间全部被节省下来,提高了单元测试生成的效率。
其中,关于上述步骤S21更加具体的处理过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
通过上述技术方案,本实施例加载函数识别规则,判断是否修改函数字节码,根据判断结果进行流量采集。基于软件开发工具包扫描预设配置文件,根据预设配置文件中的预设规则确定出采集到的流量数据对应的具体场景,并筛选出目标场景,以将目标场景下的与单次流量采集请求对应的流量数据作为目标数据,并通过Java数据库连接接口将目标数据上传至Mysql数据库。利用预设工具包从Mysql数据库拉取目标函数的函数信息,加载预设配置文件中的数据填充规则,并根据数据填充规则将函数信息填充至预设单元测试用例模版的对应占位符,以根据预设单元测试用例模版将目标数据转换为单元测试用例。通过将采集到的流量按场景分类,同一个场景下只保留一份真实请求数据,以便将多个场景的请求数据定时批量上传,减少了对应用正常服务的干扰,也提高了数据上传的效率。并且自动生成单元测试代码工具包提供自动生成Java测试代码文件的API使开发者可以利用一行代码(调用API的代码)就可以直接生成一份包括真实场景的单元测试用例代码,例如构造数据,编写桩函数,编写入口返回参数断言等重复工作所花费的时间全部被节省下来,提高了单元测试生成的效率。
参见图17所示,本申请实施例还公开了一种单元测试用例生成装置,包括:
流量采集模块11,用于接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集;
数据筛选模块12,用于根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;
数据转换模块13,用于利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。
本实施例中,接收流量采集请求后,加载通过预设配置文件配置的函数识别规则,基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,并根据判断结果进行流量采集;然后根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。通过上述技术方案,可以采集真实的请求数据确定真实的函数调用场景更能保护函数代码被修改后的稳定性,并且通过修改字节码实现函数的增强,避免通过生成目标类的代理类来实现函数的增强时,由于目标类的代理类在真实的场景下可能存在多个导致的多个代理类的顺序影响函数增强的问题,以及提高单元测试用例的生成效率。
在一些具体实施例中,所述流量采集模块11,具体包括:
调用获取单元,用于获取所述流量采集请求中的一次入口调用和若干次子调用,并将所述子调用作为所述入口调用的桩函数;
字节码修改单元,用于基于所述函数识别规则判断是否修改所述目标函数的函数字节码,若是,则通过软件开发工具包利用jvm沙箱机制修改所述入口函数和所述桩函数的函数字节码;其中,所述目标函数包括所述桩函数以及所述入口调用的入口函数。
在一些具体实施例中,所述流量采集模块11,具体包括:
参数记录单元,用于在所述目标函数被调用后,将用于采集请求参数的第一代码织入至所述目标函数,并根据所述第一代码记录所述目标函数的请求参数;
结果记录单元,用于在所述目标函数返回结果后,将用于采集返回参数的第二代码织入至所述目标函数,并根据所述第二代码记录所述目标函数的返回结果。
在一些具体实施例中,所述数据筛选模块12,具体包括:
数据确定单元,用于基于软件开发工具包扫描所述预设配置文件,根据所述预设配置文件中的预设规则确定出所述流量数据对应的具体场景,并筛选出目标场景,以将所述目标场景下的与单次流量采集请求对应的所述流量数据作为目标数据。
在一些具体实施例中,所述数据转换模块13,具体包括:
数据上传单元,用于通过Java数据库连接接口根据预设上传间隔时间和预设上传容量将所述目标数据定时批量上传至Mysql数据库。
在一些具体实施例中,所述单元测试用例生成装置,还包括:
信息表生成单元,用于根据预设SQL代码在所述Mysql数据库中生成入口函数调用信息表和桩函数调用信息表;所述入口函数调用信息表和所述桩函数调用信息表用于存储所述目标数据。
在一些具体实施例中,所述数据转换模块13,具体包括:
数据转换单元,用于加载所述预设配置文件中的数据填充规则,并根据所述数据填充规则将所述函数信息填充至预设单元测试用例模版的对应占位符,以根据所述预设单元测试用例模版将所述目标数据转换为单元测试用例。
进一步的,本申请实施例还公开了一种电子设备,图18是根据一示例性实施例示出的电子设备20结构图,图中的内容不能认为是对本申请的使用范围的任何限制。
图18为本申请实施例提供的一种电子设备20的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、通信接口24、输入输出接口25和通信总线26。其中,所述存储器22用于存储计算机程序,所述计算机程序由所述处理器21加载并执行,以实现前述任一实施例公开的单元测试用例生成方法中的相关步骤。另外,本实施例中的电子设备20具体可以为电子计算机。
本实施例中,电源23用于为电子设备20上的各硬件设备提供工作电压;通信接口24能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本申请技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括操作系统221、计算机程序222等,存储方式可以是短暂存储或者永久存储。
其中,操作系统221用于管理与控制电子设备20上的各硬件设备以及计算机程序222,其可以是Windows Server、Netware、Unix、Linux等。计算机程序222除了包括能够用于完成前述任一实施例公开的由电子设备20执行的单元测试用例生成方法的计算机程序之外,还可以进一步包括能够用于完成其他特定工作的计算机程序。
进一步的,本申请还公开了一种计算机可读存储介质,用于存储计算机程序;其中,所述计算机程序被处理器执行时实现前述公开的单元测试用例生成方法。关于该方法的具体步骤可以参考前述实施例中公开的相应内容,在此不再进行赘述。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的技术方案进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。

Claims (10)

1.一种单元测试用例生成方法,其特征在于,包括:
接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集;
根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;
利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。
2.根据权利要求1所述的单元测试用例方法,其特征在于,所述基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,包括:
获取所述流量采集请求中的一次入口调用和若干次子调用,并将所述子调用作为所述入口调用的桩函数;
基于所述函数识别规则判断是否修改所述目标函数的函数字节码,若是,则通过软件开发工具包利用jvm沙箱机制修改所述入口函数和所述桩函数的函数字节码;其中,所述目标函数包括所述桩函数以及所述入口调用的入口函数。
3.根据权利要求1所述的单元测试用例生成方法,其特征在于,所述根据判断结果进行流量采集,包括:
在所述目标函数被调用后,将用于采集请求参数的第一代码织入至所述目标函数,并根据所述第一代码记录所述目标函数的请求参数;
在所述目标函数返回结果后,将用于采集返回参数的第二代码织入至所述目标函数,并根据所述第二代码记录所述目标函数的返回结果。
4.根据权利要求1所述的单元测试用例生成方法,其特征在于,所述根据所述预设配置文件从采集到的流量数据中筛选出目标数据,包括:
基于软件开发工具包扫描所述预设配置文件,根据所述预设配置文件中的预设规则确定出所述流量数据对应的具体场景,并筛选出目标场景,以将所述目标场景下的与单次流量采集请求对应的所述流量数据作为目标数据。
5.根据权利要求1所述的单元测试用例生成方法,其特征在于,所述通过Java数据库连接接口将所述目标数据上传至Mysql数据库,包括:
通过Java数据库连接接口根据预设上传间隔时间和预设上传容量将所述目标数据定时批量上传至Mysql数据库。
6.根据权利要求1所述的单元测试用例生成方法,其特征在于,所述利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息之前,还包括:
根据预设SQL代码在所述Mysql数据库中生成入口函数调用信息表和桩函数调用信息表;所述入口函数调用信息表和所述桩函数调用信息表用于存储所述目标数据。
7.根据权利要求1至6任一项所述的单元测试用例生成方法,其特征在于,所述通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例,包括:
加载所述预设配置文件中的数据填充规则,并根据所述数据填充规则将所述函数信息填充至预设单元测试用例模版的对应占位符,以根据所述预设单元测试用例模版将所述目标数据转换为单元测试用例。
8.一种单元测试用例生成装置,其特征在于,包括:
流量采集模块,用于接收流量采集请求,并加载通过预设配置文件配置的函数识别规则,以基于所述函数识别规则判断是否修改所述流量采集请求对应的目标函数的函数字节码,以及根据判断结果进行流量采集;
数据筛选模块,用于根据所述预设配置文件从采集到的流量数据中筛选出目标数据,并通过Java数据库连接接口将所述目标数据上传至Mysql数据库;
数据转换模块,用于利用预设工具包通过所述Java数据库连接接口从所述Mysql数据库拉取所述目标函数的函数信息,并通过预设应用程序编程接口基于所述函数信息将所述目标数据转换为单元测试用例。
9.一种电子设备,其特征在于,所述电子设备包括处理器和存储器;其中,所述存储器用于存储计算机程序,所述计算机程序由所述处理器加载并执行以实现如权利要求1至7任一项所述的单元测试用例生成方法。
10.一种计算机可读存储介质,其特征在于,用于保存计算机程序,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述的单元测试用例生成方法。
CN202310498073.7A 2023-05-05 2023-05-05 一种单元测试用例生成方法、装置、设备及存储介质 Pending CN116541278A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310498073.7A CN116541278A (zh) 2023-05-05 2023-05-05 一种单元测试用例生成方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310498073.7A CN116541278A (zh) 2023-05-05 2023-05-05 一种单元测试用例生成方法、装置、设备及存储介质

Publications (1)

Publication Number Publication Date
CN116541278A true CN116541278A (zh) 2023-08-04

Family

ID=87457159

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310498073.7A Pending CN116541278A (zh) 2023-05-05 2023-05-05 一种单元测试用例生成方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN116541278A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117331849A (zh) * 2023-12-01 2024-01-02 杭银消费金融股份有限公司 一种基于代码精准分析的测试方法及系统

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN117331849A (zh) * 2023-12-01 2024-01-02 杭银消费金融股份有限公司 一种基于代码精准分析的测试方法及系统
CN117331849B (zh) * 2023-12-01 2024-02-27 杭银消费金融股份有限公司 一种基于代码精准分析的测试方法及系统

Similar Documents

Publication Publication Date Title
US7707553B2 (en) Computer method and system for automatically creating tests for checking software
US7047524B1 (en) Object oriented ADN and method of converting a non-object oriented computer language to an object oriented computer language
CN110147225A (zh) 一种代码生成方法、装置及计算机设备、存储介质
CN106325870B (zh) 一种动态表单api接口的实现方法及装置
CN116541278A (zh) 一种单元测试用例生成方法、装置、设备及存储介质
US20210026756A1 (en) Deriving software application dependency trees for white-box testing
JP2022545489A (ja) スマートコントラクトのクライアントプログラムの生成方法、システム、機器、及び媒体
CN112559525B (zh) 数据检查系统、方法、装置和服务器
CN110968296B (zh) 一种数据获取方法、装置、设备及可读存储介质
CN115934199A (zh) 服务性能监控工具、方法、设备及介质
CN113568604B (zh) 风控策略的更新方法、装置及计算机可读存储介质
CN112783791B (zh) 接口测试案例的生成方法及装置
CN114416547A (zh) 基于测试用例的测试方法
CN117724983A (zh) 接口测试方法、装置、存储介质及电子设备
CN112748927A (zh) 一种项目接口解析方法及相关装置
CN110134434B (zh) 一种应用生成处理方法及系统、应用生成系统
CN111722881A (zh) 一种容器云平台的资源扩展方法、系统及装置
CN108243238A (zh) 一种性能数据的采集方法及装置
CN114218073A (zh) 一种接口测试方法、装置、服务器及介质
CN113467761A (zh) 一种基于Java反射原理的接口测试模板生成方法
CN117472367B (zh) 异构资源智能识别及接入方法、装置、设备以及存储介质
CN114661256B (zh) 一种数据采集方法、装置、设备及存储介质
CN112582014B (zh) 一种固态硬盘批量生产方法、装置、设备及介质
CN117093186B (zh) 一种高复用性标准化批导方法及系统
CN118331892A (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