CN116069650A - 一种测试用例的生成方法及装置 - Google Patents

一种测试用例的生成方法及装置 Download PDF

Info

Publication number
CN116069650A
CN116069650A CN202310103866.4A CN202310103866A CN116069650A CN 116069650 A CN116069650 A CN 116069650A CN 202310103866 A CN202310103866 A CN 202310103866A CN 116069650 A CN116069650 A CN 116069650A
Authority
CN
China
Prior art keywords
tested
case data
test
data
class
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
CN202310103866.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.)
Shenzhen Huawei Cloud Computing Technology Co ltd
Original Assignee
Shenzhen Huawei Cloud Computing 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 Shenzhen Huawei Cloud Computing Technology Co ltd filed Critical Shenzhen Huawei Cloud Computing Technology Co ltd
Priority to CN202310103866.4A priority Critical patent/CN116069650A/zh
Publication of CN116069650A publication Critical patent/CN116069650A/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/3676Test management for coverage analysis
    • 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

一种测试用例的生成方法及装置。该方法包括确定待测对象,待测对象包括程序模块;运行待测对象,并获取待测对象本次运行的运行数据;根据运行数据生成测试用例的候选用例数据,以此提高测试用例的生成效率以及准确性;根据待测对象本次运行对应的测试覆盖度,从候选用例数据中选取目标用例数据;根据待测对象对应的测试模板以及目标用例数据,生成待测对象的测试用例。以此降低测试用例生成的重复性,提高测试用例的有效性。

Description

一种测试用例的生成方法及装置
技术领域
本申请涉及IT(Internet Technology,互联网技术)技术领域,尤其涉及一种测试用例的生成方法及装置。
背景技术
在计算机编程中,通常会使用单元测试进行安全性检验的测试工作。其中,单元测试(Unit Testing,UT)又称为模块测试或称程序模块测试,所述模块(或称程序模块)指的是一段程序代码,通过测试用例对程序代码进行正确性检验测试。
随着软件***的规模不断扩大,复杂性不断增长,单元测试的工作量和难度越来越大。因此,如何提高测试用例的生成效率以及测试用例的准确性,是目前需要解决的问题。
发明内容
本申请实施例提供一种测试用例的生成方法及装置,用于提高测试用例的生成效率以及测试用例的准确性。
第一方面,本申请实施例提出了一种测试用例的生成方法,所述方法包括:确定待测对象,所述待测对象包括程序模块;运行所述待测对象,并获取所述待测对象本次运行的运行数据;根据所述运行数据生成测试用例的候选用例数据;根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据;根据所述待测对象对应的测试模板以及所述目标用例数据,生成所述待测对象的测试用例。
基于上述方案,上述方案中通过获取待测对象运行的运行数据,从运行数据中确定测试用例,以此提高测试用例的生成效率以及准确性。根据待测对象运行对应的测试覆盖度,从候选用例数据中选取目标用例数据,以此对测试用例进行筛选,还可以进一步降低相同作用的测试用例的重复性。
在一些实施例中,所述确定待测对象,包括:获取所述待测对象所属的应用程序的源代码中的用户配置信息,所述用户配置信息包括所述待测对象对类的依赖信息;所述其他对象与所述待测对象的程序模块不一致;根据所述用户配置信息确定待测对象列表,所述待测对象列表中包括所述待测对象的信息,所述待测对象的信息包括所述待测对象的名称、所述待测对象所属的类的信息、所述类的状态变量、所述待测对象对类的依赖信息;所述获取所述待测对象本次运行的运行数据,包括:根据所述待测对象列表,获取所述待测对象本次运行中的运行数据。
基于上述方案,上述方案中待测对象所属的应用程序可以为待测服务,待测服务中预设有用户配置信息,该配置信息包括待测对象对类的依赖信息;待测对象对类的依赖信息可以为待测对象对待测对象所属的类的依赖信息,也可以为待测对象对其他类的依赖信息。
该依赖信息表示待测对象需要调用的类中的对象,以此得到类中的对象信息,如mock点信息等,mock点信息可以包括Mock方法的出参、入参数据。以此提高待测对象运行时运行数据的准确性,进而提高生成测试用例的准确性。
在一些实施例中,所述待测对象本次运行的运行数据包括所述待测对象运行前的类的状态变量和入参、所述待测对象运行后的类的状态变量和出参、下层调用参数以及所述待测对象本次运行对应的测试覆盖度。
基于上述方案,上述方案中待测对象的运行数据包括运行前的数据和运行后的数据,其中,运行前的类的状态变量和入参、运行后的类的状态变量和出参、下层调用参数用于生成用例数据,待测对象运行对应的测试覆盖度用于对用例数据进行筛选,以此降低相同作用的测试用例的重复性。
在一些实施例中,根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据,包括:根据所述测试覆盖度和所述待测对象对应的已有用例数据对所述候选用例数据去重,得到所述目标用例数据。
基于上述方案,通过去重的方式,减少执行待测对象中相同程序代码的用例数据,避免测试用例重复测试待测对象中相同的程序代码,进而减少作用相同的测试用例的重复性。
在一些实施例中,根据所述测试覆盖度和所述待测对象对应的已有测试用例数据对所述候选用例数据去重,包括:针对所述候选用例数据中的任一候选用例数据,执行以下操作:
计算所述任一候选用例数据对应的待测对象所属类的名称、所述待测对象的名称和所述测试覆盖度的哈希值;
若所述哈希值与有效用例数据集合中的任一用例数据的哈希值不相同,则确定所述任一候选用例数据为目标用例数据,并将所述目标用例数据添加到所述有效用例数据集合中,所述有效用例数据集合用于存储所述待测对象对应的用例数据。
基于上述方案,若任意两个用例数据的对应的待测对象一致,且在该待测对象运行时所执行的程序代码一致,则表示这两个用例数据所测试的程序代码一致,即这两个用例数据的作用相同,因此对这两个用例数据进行去重操作,进而减少作用相同的测试用例的重复性。
第二方面,本申请实施例提出了一种装置,所述装置包括:确定模块,用于确定待测对象,所述待测对象包括程序模块;运行模块,用于运行所述待测对象,并获取所述待测对象本次运行的运行数据;处理模块,用于根据所述运行数据生成测试用例的候选用例数据;根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据;根据所述待测对象对应的测试模板以及所述目标用例数据,生成所述待测对象的测试用例。
在一些实施例中,所述确定模块具体用于:获取所述待测对象所属的应用程序的源代码中的用户配置信息,所述用户配置信息包括所述待测对象对类的依赖信息;根据所述用户配置信息确定待测对象列表,所述待测对象列表中包括所述待测对象的信息,所述待测对象的信息包括所述待测对象的名称、所述待测对象所属的类的信息、所述类的状态变量、所述待测对象对类的依赖信息;
所述运行模块具体用于:根据所述待测对象列表,获取所述待测对象本次运行中的运行数据。
在一些实施例中,所述待测对象本次运行的运行数据包括所述待测对象运行前的类的状态变量和入参、所述待测对象运行后的类的状态变量和出参、下层调用参数以及所述待测对象本次运行对应的测试覆盖度。
在一些实施例中,所述处理模块具体用于:根据所述测试覆盖度和所述待测对象对应的已有用例数据对所述候选用例数据去重,得到所述目标用例数据。
在一些实施例中,所述处理模块具体用于:针对所述候选用例数据中的任一候选用例数据,执行以下操作:
计算所述任一候选用例数据对应的待测对象所属类的名称、所述待测对象的名称和所述测试覆盖度的哈希值;
若所述哈希值与有效用例数据集合中的任一用例数据的哈希值不相同,则确定所述任一候选用例数据为目标用例数据,并将所述目标用例数据添加到所述有效用例数据集合中,所述有效用例数据集合用于存储所述待测对象对应的用例数据。
第三方面,本申请实施例提供了一种可读存储介质,所述可读存储介质存储包括程序,当所述程序代码在设备上运行时,使得所述设备执行上述第一方面所述的方法。
第四方面,本申请实施例提供了一种装置,包括:一个或多个处理器;其中,当一个或多个计算机程序的指令被所述一个或多个处理器执行时,使得所述装置执行如上第一方面所述的方法。
第五方面,本申请实施例提供了一种芯片***,包括至少一个芯片和存储器,所述至少一个芯片与所述存储器耦合,用于读取并执行所述存储器中存储的程序指令,以实现上述第一方面所述的方法。
第六方面,本申请实施例提供了一种计算机程序产品,当所述计算机程序产品在计算机上运行时,使得所述计算机执行上述第一方面所述的方法。
本申请实施例在上述各方面提供的实现的基础上,还可以进行进一步组合以提供更多实现。
上述第二方面至第六方面中任一方面中可以达到的技术效果,可以相应参照上述第一方面中可以达到的技术效果描述,重复之处不予论述。
附图说明
图1为本申请实施例提供的一种***架构示意图;
图2为本申请实施例提供的一种测试用例的生成方法的流程示意图;
图3为本申请实施例提供的一种确定待测对象的流程示意图;
图4为本申请实施例提供的一种获取运行数据的流程示意图;
图5为本申请实施例提供的一种确定目标用例数据的流程示意图;
图6为本申请实施例提供的一种测试用例的生成方法的流程示意图;
图7为本申请实施例提供的一种测试用例的生成装置的结构示意图;
图8为本申请实施例提供的一种测试用例的生成装置的示意图。
具体实施方式
下面将结合发端本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。以下实施例中所使用的术语只是为了描述特定实施例的目的,而并非旨在作为对本申请的限制。如在本申请的说明书和所附权利要求书中所使用的那样,单数表达形式“一个”、“一种”、“所述”、“上述”、“该”和“这”旨在也包括例如“一个或多个”这种表达形式,除非其上下文中明确地有相反指示。还应当理解,在本申请实施例中,“一个或多个”是指一个、两个或两个以上;“和/或”,描述关联对象的关联关系,表示可以存在三种关系;例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B的情况,其中A、B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。
在本说明书中描述的参考“一个实施例”或“一些实施例”等意味着在本申请的一个或多个实施例中包括结合该实施例描述的特定特征、结构或特点。由此,在本说明书中的不同之处出现的语句“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
本申请实施例涉及的多个,是指大于或等于两个。需要说明的是,在本申请实施例的描述中,“第一”、“第二”等词汇,仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。
在计算机编程中,通常会使用单元测试方式进行安全性检验的测试工作。在采用单元测试方式对程序模块进行测试时,可以根据用例数据运行待测试的程序模块,检验某些假设的正确性。若假设正确,则单元测试成功;若假设错误,则单元测试失败。本申请实施例中,将待进行测试的程序模块称为待测对象,待测对象为类中的一个方法或函数,如待测对象为math类中的abs方法。
进一步的,以待测对象为绝对值函数“abs()”为例,单元测试过程可以包括:
输入正数,执行该待测对象,得到返回值,判断该返回值与输入值是否相同;
输入负数,执行该待测对象,得到返回值,判断该返回值与输入值是否相反;
输入0,执行该待测对象,得到返回值,判断该返回值是否为0;
输入非数值类型数据(如/、{}等符号),执行该待测对象,得到返回值,判断该返回值是否为错误typeerro类型;
其中,绝对值函数“abs()”也可以表示为求绝对值方法(即abs方法),输入值为测试数据(即用例数据)。
为了实现单元测试,需要生成测试用例。其中,测试用例是指对待测对象进行测试任务的描述,包括用例数据和测试代码。用例数据用于作为待测对象运行时的输入参数,测试代码用于作为待测对象运行时的执行条件,确定运行结果正确或错误。在本申请实施例中,测试代码可以称为测试脚本。
在相关技术中,生成测试用例一般包括两种方式:第一种方式是基于模板技术,根据测试模板框架的规范,对指定的类或方法生成单元测试框架代码,然后由开发人员基于单元测试框架编写测试代码和用例数据,进而得到测试用例。
一种可实施的方式中,根据JUnitGenerator等单元测试框架(下文简称Junit框架),通过定义Junit框架的单元测试代码结构的规范,根据用户选择的待测类(如math类等)生成该待测类的测试框架;该待测类的测试框架包括待测类的名称、before/after方法和test XxxMethod方法签名。然后由人工编写和/或填充用例数据和测试代码。
第二种方式是基于程序分析、搜索和符号执行等技术,分析源代码生成单元测试的测试代码,然后基于搜索算法生成单元测试的测试用例。
一种可实施的方式中,基于Evosuite等方法,通过遗传搜索算法生成一组可以最大程度覆盖代码的测试用例,从一组随机测试用例的测试套件开始,迭代地应用搜索运算符(例如选择,变异和交叉),基于覆盖标准的适应度函数进化测试用例,默认情况下是分支覆盖。搜索结束后,具有最高代码覆盖率的测试套件将被最小化,并添加回归测试断言。
但是,第一种方式的效率低、开发人员的工作量较大;第二种方式需要大量的分析、搜索等计算,存在随机因素,导致测试用例的生成效率低,生成的测试用例重复性大、准确性低。
随着软件***的规模不断扩大,单元测试的复杂性也不断增长,导致单元测试的工作量和难度越来越大。第一种方式,需要人为编写测试用例的用例数据和测试代码、mock和断言等,导致单元测试的效率低,工作量大,且因为***、***性功能文档不足等因素,人为编写测试用例的准确性无法保证。即通过人为编写的测试用例,难以保证测试用例的生成效率和准确性。
第二种方式,需要大量的分析、搜索等计算,测试用例的生成效率低。且存在随机因素,导致生成的测试用例重复性大、准确性低。另外,对于常见的I/O操作等,无法进行分析和Mock,导致生成的测试用例也主要以异常用例为主,不能覆盖所有的业务场景,普适性差。其中,Mock是指在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
因此,现亟需一种测试用例的生成方法,来提高测试用例的生成效率以及准确性,进一步的,还可以降低生成的测试用例的重复性。
参见图1所示,为本申请实施例提供的一种***架构示意图。包括管理平台110、录制模块120、筛选模块130和用例模块140。其中,管理平台110中包括源代码管理模块、分析模块、配置信息模块和测试用例管理模块。
源代码管理模块,用于对待测服务的源代码以及测试代码的源码进行同步管理。其中,待测服务也可以称为待测应用程序,待测应用程序的源代码包括一个或多个程序模块。
分析模块,用于基于待测服务的源代码和用户配置信息,生成待测对象列表。其中,待测对象列表中的每个待测对象包含待测对象所属的类的信息、待测对象所属的类的状态变量以及待测对象对类的依赖信息。可选的,所述待测对象对类的依赖信息可以包括待测对象对其他类、其他类中的对象和/或待测对象对所属的类中的其他对象的依赖信息。
配置信息管理模块,用于管理用户自定义设置的用户配置信息。可选的,用户配置信息包括待测范围、待测对象对类的依赖信息等。其中,待测范围表示需要进行单元测试的程序范围,如待测范围为待测包(package,功能目录)范围,表示待测应用程序中需要进行单元测试的功能目录。功能目录中包括实现一个或多个功能(如求和功能等)的程序模块。待测对象对类的依赖信息表示待测对象在运行时所需要的下层调用参数,如Mock包范围(具有mock的package),表示待测对象在运行时所需要调用的具有mock的程序模块,以此在运行时获取mock点信息。示例性的,用户配置信息还包括录制采样率等信息。录制采样率表示获取运行数据的数量,如待测对象在线上生产环境中的运行数据为10条,1,根据录制采样率获取其中的5条运行数据。
测试用例管理模块,用于对生成的测试用例进行版本管理和元信息管理,并对测试用例持续录制与演进。
录制模块120,用于获取待测对象的运行数据。可选的,运行数据可以包括待测对象运行前的类的状态变量和入参、待测对象运行后的类的状态变量和出参、下层调用参数以及待测对象本次运行对应的测试覆盖度。其中,下层调用参数包括下层调用入参和下层调用出参,表示待测对象在运行时所调用的其他对象;在本申请实施例中,其他对象可以是待测对象所属的类中除待测对象外的任一程序模块,或其他类中的任一程序模块。本次运行对应的测试覆盖度表示待测对象本次运行时所执行代码,在本申请实施例中,测试覆盖度可以称为方法覆盖数据。
录制模块120还用于对待测对象所属类的状态变量进行插桩记录,对待测对象的运行数据进行序列化存储。
筛选模块130,用于根据测试覆盖度和待测对象对应的已有用例数据去重,得到目标用例数据。
用例模块140,用于根据待测对象对应的测试模板以及目标用例数据,生成待测对象的测试用例用。示例性的,可以根据预置的测试模板,结合目标用例数据,利用模板引擎渲染测试模板的代码。其中,测试模板的代码执行以下操作:待测对象反序列化及待测对象所属的类的状态变量快照还原;根据下层调用参数生成的mock规则;通过反射调用待测对象,基于运行数据执行待测方法;逐个字段对比调用结果和待测对象所属的类的状态变量,得到校验结果。
在本申请实施例中,上述图1所示的结构仅是一种示例,本申请实施例对此不做限定。
基于上述描述,图2示例性的示出了本申请实施例提供的一种测试用例的生成方法的流程示意图,该流程可由测试用例的生成装置执行。
如图2所示,该流程具体包括:
步骤210,确定待测对象。
一种可能的实现方式中,可以基于用户配置信息从待测服务的源代码中获取待测对象(比如待测程序模块)。
步骤220,运行所述待测对象,并获取所述待测对象本次运行的运行数据。
一种可能的实现方式中,待测对象的运行数据包括运行前的入参、运行前待测对象所属的类的状态变量、运行后的出参、运行后待测对象所属的类的状态变量以及运行时的下层调用参数和测试覆盖度(本申请实施例中称为运行时所执行代码或方法覆盖数据)。
步骤230,根据所述运行数据生成测试用例的候选用例数据。
可选的,通过对待测对象的运行数据进行序列化操作,生成候选用例数据。
步骤240,根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据。
一种可能的实现方式中,可以根据候选用例数据对应的待测对象所属的类的名称、该待测对象的名称和基于该候选用例运行时的方法覆盖数据,计算哈希值,进而通过哈希值对候选用例数据去重,得到目标用例数据。示例性的,哈希值表示候选用例数据对应的待测对象、待测对象所属的类以及待测对象基于候选用例运行时的方法覆盖数据。
步骤250,根据所述待测对象对应的测试模板以及所述目标用例数据,生成所述待测对象的测试用例。
一种可能的实现方式中,可以根据下层调用参数和待测对象对类的依赖信息生成when-then结构的Mock代码;基于待测对象对应的测试模板,根据待测对象运行前的所属类的状态变量和入参,以及Mock代码调用待测对象,得到调用结果以及待测对象调用后的所属类的状态变量,在确定调用结果以及待测程序模块调用后所属的类的状态变量与待测对象运行后的出参以及所属的类的状态变量一致时,根据待测对象运行前的所属类的状态变量和入参、Mock代码、调用结果以及待测对象调用后的所属类的状态变量生成测试用例。其中,待测对象对类的依赖信息包括Mock点信息。
在步骤210中,待测对象所属的应用程序的源代码中预设有用户配置信息。该配置信息包括待测范围、录制采样率等信息;其中,待测范围包括待测包(package,功能目录)范围和Mock包范围(具有mock的package),Mock包范围可以表示出待测对象对类的依赖信息。
在本申请实施例中,根据用户配置信息对源代码进行静态分析,生成待测对象列表。
进一步的,获取待测对象所属的应用程序的源代码中的用户配置信息,用户配置信息包括待测对象对类的依赖信息;根据用户配置信息确定待测对象列表,待测对象列表中包括待测对象的信息,待测对象的信息包括待测对象的名称、待测对象所属的类的信息、类的状态变量、待测对象对类的依赖信息。
其中,待测对象所属的类的信息包括待测对象所属的类的名称、功能等信息,待测对象对类的依赖信息包括待测对象对类的依赖的Mock点信息。
为了更好的阐述上述步骤210的技术方案,图3为本申请实施例示例性示出的一种确定待测对象的流程示意图。如图3所示,包括:
步骤310,获取源代码。
拉取待测应用程序的源代码。其中,待测应用程序可以表示为待测服务,如搜索功能、查询功能、购物功能、社交功能等应用程序或服务。
步骤320,获取用户配置信息。
用户配置信息预先由用户配置在源代码中,在此不对用户配置信息进行赘述。
步骤330,分析源代码。
对源代码进行扫描,获取源代码中的所有类,生成类列表。
步骤340,输出待测对象。
根据用户配置信息中的待测范围,从上述步骤330中的类列表中确定待测类。对待测类进行解析和依赖分析,解析出待测类的方法列表(即待测对象列表)、待测类的状态变量列表,待测对象所依赖的类和/或方法(即其他对象)。
根据待测对象列表输出每个待测对象,任一待测对象的信息包括该待测对象的名称、该待测对象所属的类的名称、该待测对象所属的类的状态变量以及该待测对象对其他对象的依赖信息,该依赖信息包括Mock点信息。
在步骤220中,根据待测对象列表,获取待测对象本次运行中的运行数据。进一步的,根据插桩技术对待测对象列表每个待测对象进行前置处理和后置处理;基于前置处理录制待测对象运行前的入参和待测对象所属的类的状态变量,并重置待测对象上次运行的测试覆盖度;基于后置处理录制待测对象运行后的出参和待测对象所属的类的状态变量,并获取待测对象的下层调用参数以及待测对象本次运行的方法覆盖数据。其中,下层调用参数包括下层调用入参和下层调用出参。
为了更好的阐述上述步骤220的技术方案,图4为本申请实施例示例性示出的一种获取运行数据的流程示意图。如图4所示,包括:
步骤410,前置处理。
采用Java字节码技术,对待测对象进行AOP插桩,实现前置处理。前置处理包括录制入参、录制运行前的类的状态变量以及重置方法覆盖数据(即待测对象的测试覆盖度)。
以待测对象为sum方法为例(sum方法表示求和方法),入参为1,运行前的类的状态变量为当前求和结果,如为5。假设sum方法中包括两个分支的代码,分别为a分支代码和b分支代码;其中,a分支代码表示对正数的入参进行求和计算,a分支代码表示对负数的入参进行求和计算。
重置方法覆盖数据表示清除上次运行的方法覆盖数据。例如,待测对象在上次运行时的入参为-1,则表示上次运行的方法覆盖数据为b分支代码。在本次运行时,需要清除上次运行的方法覆盖数据,以记录本次运行的方法覆盖数据。
步骤420,运行待测对象。
根据本次运行的入参、类的状态变量运行待测对象,记录本次运行的方法覆盖数据。基于上述描述进行举例,本次运行的入参为1,因此本次运行的方法覆盖数据为a分支代码。
步骤430,后置处理。
采用前置处理的插桩方法,实现后置处理,在此不做赘述。后置处理包括录制出参、录制运行后的类的状态变量、获取下层调用参数、获取方法覆盖数据以及序列化。
基于上述描述进行举例,出参为6,运行后的类的状态变量为6,下层调用参数不作具体限定,方法覆盖数据为a分支代码。
对录制的入参、运行前的类的状态变量、出参、运行后的类的状态变量、下层调用参数、本次运行的方法覆盖数据进行序列化操作,生成候选用例数据。
在本申请实施例中,还可以采用Python、Go、C/C++等技术,在此不做限定。插桩技术可以为Java Agent、AspectJ或其他可以实现对源代码录制功能的编译器插桩技术在此不做限定。
在步骤240中,根据测试覆盖度和待测对象对应的已有用例数据对候选用例数据去重,得到目标用例数据。
一种可实施的方式中,针对候选用例数据中的任一候选用例数据,执行以下操作:
计算任一候选用例数据对应的待测对象所属类的名称、待测对象的名称和测试覆盖度的哈希值;若哈希值与有效用例数据集合中的任一用例数据的哈希值不相同,则确定任一候选用例数据为目标用例数据,并将目标用例数据添加到有效用例数据集合中,有效用例数据集合用于存储待测对象对应的用例数据。
在本申请实施例中,哈希值表示候选用例数据对应的待测对象、该待测对象所属的类以及该待测对象基于该候选用例数据运行的方法覆盖数据。
在计算出之后,判断该哈希值是否记录在有效用例数据集合中;若否,则表示该待测对象基于该候选用例数据运行的方法覆盖数据不重复(表示哈希值不相同的候选用例数据的作用不相同,即该候选用例数据与其他候选用例数据的作用不同),将该候选用例数据确定为目标用例数据;若是,则表示该待测对象基于该候选用例数据运行的方法覆盖数据重复(表示哈希值相同的候选用例数据的作用相同),处理下一候选用例数据。
基于上述描述,图5示例性的示出了一种确定目标用例数据的流程示意图。如图5所示,包括:
步骤510,计算哈希值。
基于上述描述进行举例,候选用例数据为y1,候选用例数据对应的测试对象的名称为z1,测试对象z1所属的类的名称为L1,测试对象基于候选用例数据y1运行的方法覆盖数据为a分支代码,则对z1、L1和a分支代码进行哈希运算,得到哈希值h1。
步骤520,判断是否重复。
判断哈希值h1在有效用例数据集合中是否重复;其中,有效用例数据集合中记录有目标用例数据的哈希值,目标用例数据的哈希值计算与候选用例数据的哈希值计算一致,在此不做赘述。
若是,则执行步骤530,否则执行步骤540。
步骤530,丢弃候选用例数据。
表示待测对象基于该候选用例数据运行的方法覆盖数据重复,该候选用例数据不能作为目标用例数据。
步骤540,确定目标用例数据。
表示待测对象基于该候选用例数据运行的方法覆盖数据不重复,将该候选用例数据确定为目标用例数据。
步骤550,更新有效用例数据集合。
在确定出目标用例数据之后,将目标用例数据的哈希值以及目标用例数据添加至有效用例数据集合。
在本申请实施例中,还可以使用其他方式对候选用例数据去重,如满足对相同或类似用例数据的判断的聚类方式等,在此不做限定。
在步骤250中,根据预置的待测对象对应的测试模板,结合目标用例数据,利用模板引擎渲染测试模板的代码;其中,测试模板的代码执行以下操作:
根据目标用例数据,反序列化待测对象的入参、出参、下层调用入参、下层调用出参和测试对象运行前后的所属类的状态变量快照还原。
根据下层调用入参、下层调用出参,生成when-then结构的Mock代码。
根据测试对象的入参和运行前的所属类的状态变量调用待测对象,得到调用结果和调用后的待测对象所属的类的状态变量。
按照字段为单位,逐一对比待测对象的出参和调用结果、待测对象的线上运行后的所属类的状态变量和上述调用后的待测对象所属的类的状态变量生成校验结果。
在确定验证结果满足验证条件时,根据待测对象运行前的所属类的状态变量和入参、Mock代码、调用结果以及待测对象调用后的所属类的状态变量生成测试用例。其中,验证条件可以为字段一致,字段相似性满足相似阈值,字段误差小于误差阈值等,在此不作具体限定。
在本申请实施例中,通过静态分析,输出待测对象列表,待测对象包含待测对象所属的类的信息、待测对象的信息、类的状态变量以及对类的依赖的Mock点信息。通过JavaAgent字节码等技术,对待测对象运行时进行插桩,录制待测对象的入参和出参、类执行前后的状态变量、Mock方法的出参和入参、待测对象的方法覆盖数据,进而得到目标用例数据,以此提高测试用例的生成效率以及准确性。
通过基于方法覆盖数据筛选用例数据,对作用相同(相当于测试待测对象中相同分支代码)的用例数据进行去重筛选,输出有效用例数据,进而降低测试用例生成的重复性,提高测试用例的有效性。
通过模板技术,基于筛选出的目标用例数据,生成单元测试的测试用例,提高测试用例的生成效率。
为了更好的阐述本申请的技术方案,图6为本申请实施例示例性示出的一种测试用例的生成方法的流程示意图。如图6所示,包括:
步骤610,设置用户配置信息。
用户预先在应用程序的源代码中设置用户配置信息。用户配置信息用于从源代码中确定待测对象,具体确定待测对象如上述图3所述的技术方案,在此不进行赘述。
步骤620,安装Agent录制。
用户在集成测试环境和/或线上生产环境安装录制Agent探针。
步骤630,集成测试环境录制。
步骤640,线上生产环境录制。
本申请实施例中,用户使用的场景是核心的场景用例库(如社交、购物应用程序等)。通过两种录制待测对象的运行数据的方式,录制线上生产环境的数据和/或集成测试环境的数据作为用例数据,进而生成单元测试的测试用例以及测试代码,以提高单元测试的覆盖率和准确性。
在一种可实施的方式中,还可以基于录制的用例数据生成新的用例数据。例如,录制的数据均为正数,基于录制的数据申城的新的用例数据为负数,以此增加用例数据的覆盖度,提高单元测试的准确性。
步骤650,筛选用例数据。
本申请实施例中,通过基于方法覆盖数据筛选用例数据,对作用相同的用例数据进行去重筛选,输出有效用例数据,进而降低测试用例生成的重复性,提高测试用例的有效性。具体确定筛选方法如上述图5所述的技术方案,在此不进行赘述。
步骤660,生成测试用例。
本申请实施例中,通过模板技术,基于筛选出的目标用例数据,生成单元测试的测试用例,提高测试用例的生成效率和准确性。具体生成测试用例方法如上述步骤250所述的技术方案,在此不进行赘述。
步骤670,同步测试代码。
本申请实施例中,通过同步测试代码避免针对相同或相似的待测对象重复生成测试用例。
本申请实施例还提出了一种测试用例的生成装置,用于执行上述方法中的各个步骤,相关特征可以参见上述实施例中的介绍,在此不再赘述。图7为本申请实施例示例性示出的一种测试用例的生成装置的结构示意图,参见图7,该装置包括:确定模块710,用于确定待测对象,所述待测对象包括程序模块;运行模块720,用于运行所述待测对象,并获取所述待测对象本次运行的运行数据;处理模块730,用于根据所述运行数据生成测试用例的候选用例数据;根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据;根据所述待测对象对应的测试模板以及所述目标用例数据,生成所述待测对象的测试用例。
在一些实施例中,所述确定模块710具体用于:获取所述待测对象所属的应用程序的源代码中的用户配置信息,所述用户配置信息包括所述待测对象对类的依赖信息;根据所述用户配置信息确定待测对象列表,所述待测对象列表中包括所述待测对象的信息,所述待测对象的信息包括所述待测对象的名称、所述待测对象所属的类的信息、所述类的状态变量、所述待测对象对类的依赖信息;
所述运行模块720具体用于:根据所述待测对象列表,获取所述待测对象本次运行中的运行数据。
在一些实施例中,所述待测对象本次运行的运行数据包括所述待测对象运行前的类的状态变量和入参、所述待测对象运行后的类的状态变量和出参、下层调用参数以及所述待测对象本次运行对应的测试覆盖度。
在一些实施例中,所述处理模块730具体用于:根据所述测试覆盖度和所述待测对象对应的已有用例数据对所述候选用例数据去重,得到所述目标用例数据。
在一些实施例中,所述处理模块730具体用于:针对所述候选用例数据中的任一候选用例数据,执行以下操作:
计算所述任一候选用例数据对应的待测对象所属类的名称、所述待测对象的名称和所述测试覆盖度的哈希值;
若所述哈希值与有效用例数据集合中的任一用例数据的哈希值不相同,则确定所述任一候选用例数据为目标用例数据,并将所述目标用例数据添加到所述有效用例数据集合中,所述有效用例数据集合用于存储所述待测对象对应的用例数据。
在一个简单的实施例中,本领域的技术人员可以想到上述实施例中网络数据流量的处理装置可采用图8所示的形式。
如图8所示的装置800,包括至少一个处理器810、存储器820,可选的,还可以包括通信接口830。
本申请实施例中不限定上述处理器810及存储器820之间的具体连接介质。在如图8的装置中,还包括通信接口830,处理器810在与其他设备进行通信时,可以通过通信接口830进行数据传输。
应明白,本申请的实施例可提供为方法、***、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本申请实施例进行各种改动和变型而不脱离本申请实施例范围。这样,倘若本申请实施例的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (14)

1.一种测试用例的生成方法,其特征在于,所述方法包括:
确定待测对象,所述待测对象包括程序模块;
运行所述待测对象,并获取所述待测对象本次运行的运行数据;
根据所述运行数据生成测试用例的候选用例数据;
根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据;
根据所述待测对象对应的测试模板以及所述目标用例数据,生成所述待测对象的测试用例。
2.根据权利要求1所述的方法,其特征在于,所述确定待测对象,包括:
获取所述待测对象所属的应用程序的源代码中的用户配置信息,所述用户配置信息包括所述待测对象对类的依赖信息;
根据所述用户配置信息确定待测对象列表,所述待测对象列表中包括所述待测对象的信息,所述待测对象的信息包括所述待测对象的名称、所述待测对象所属的类的信息、所述类的状态变量、所述待测对象对类的依赖信息;
所述获取所述待测对象本次运行的运行数据,包括:
根据所述待测对象列表,获取所述待测对象本次运行中的运行数据。
3.根据权利要求1或2所述的方法,其特征在于,所述待测对象本次运行的运行数据,包括:所述待测对象运行前的类的状态变量和入参、所述待测对象运行后的类的状态变量和出参、下层调用参数以及所述待测对象本次运行对应的测试覆盖度。
4.根据权利要求1至3任一项所述的方法,其特征在于,根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据,包括:
根据所述测试覆盖度和所述待测对象对应的已有用例数据对所述候选用例数据去重,得到所述目标用例数据。
5.根据权利要求4所述的方法,其特征在于,根据所述测试覆盖度和所述待测对象对应的已有测试用例数据对所述候选用例数据去重,包括:
针对所述候选用例数据中的任一候选用例数据,执行以下操作:
计算所述任一候选用例数据对应的待测对象所属类的名称、所述待测对象的名称和所述测试覆盖度的哈希值;
若所述哈希值与有效用例数据集合中的任一用例数据的哈希值不相同,则确定所述任一候选用例数据为目标用例数据,并将所述目标用例数据添加到所述有效用例数据集合中,所述有效用例数据集合用于存储所述待测对象对应的用例数据。
6.一种装置,其特征在于,包括:
确定模块,用于确定待测对象,所述待测对象包括程序模块;
运行模块,用于运行所述待测对象,并获取所述待测对象本次运行的运行数据;
处理模块,用于根据所述运行数据生成测试用例的候选用例数据;
根据所述待测对象本次运行对应的测试覆盖度,从所述候选用例数据中选取目标用例数据;
根据所述待测对象对应的测试模板以及所述目标用例数据,生成所述待测对象的测试用例。
7.根据权利要求6所述的装置,其特征在于,所述确定模块具体用于:
获取所述待测对象所属的应用程序的源代码中的用户配置信息,所述用户配置信息包括所述待测对象对类的依赖信息;
根据所述用户配置信息确定待测对象列表,所述待测对象列表中包括所述待测对象的信息,所述待测对象的信息包括所述待测对象的名称、所述待测对象所属的类的信息、所述类的状态变量、所述待测对象对类的依赖信息;
所述运行模块具体用于:
根据所述待测对象列表,获取所述待测对象本次运行中的运行数据。
8.根据权利要求6或7所述的装置,其特征在于,所述待测对象本次运行的运行数据包括所述待测对象运行前的类的状态变量和入参、所述待测对象运行后的类的状态变量和出参、下层调用参数以及所述待测对象本次运行对应的测试覆盖度。
9.根据权利要求6至8任一项所述的装置,其特征在于,所述处理模块具体用于:
根据所述测试覆盖度和所述待测对象对应的已有用例数据对所述候选用例数据去重,得到所述目标用例数据。
10.根据权利要求9所述的装置,其特征在于,所述处理模块具体用于:
针对所述候选用例数据中的任一候选用例数据,执行以下操作:
计算所述任一候选用例数据对应的待测对象所属类的名称、所述待测对象的名称和所述测试覆盖度的哈希值;
若所述哈希值与有效用例数据集合中的任一用例数据的哈希值不相同,则确定所述任一候选用例数据为目标用例数据,并将所述目标用例数据添加到所述有效用例数据集合中,所述有效用例数据集合用于存储所述待测对象对应的用例数据。
11.一种可读存储介质,其特征在于,所述可读存储介质包括程序,当所述程序在设备上运行时,使得所述设备执行如权利要求1至5中任一所述的方法。
12.一种装置,其特征在于,包括:一个或多个处理器;其中,当一个或多个计算机程序的指令被所述一个或多个处理器执行时,使得所述装置执行如权利要求1至5中任一项所述的方法。
13.一种芯片***,其特征在于,包括至少一个芯片和存储器,所述至少一个芯片与所述存储器耦合,用于读取并执行所述存储器中存储的程序指令,以实现如权利要求1至5中任一项所述的方法。
14.一种计算机程序产品,其特征在于,所述计算机程序产品在被计算机调用时,使得所述计算机执行如权利要求1至5中任一项所述的方法。
CN202310103866.4A 2023-01-19 2023-01-19 一种测试用例的生成方法及装置 Pending CN116069650A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310103866.4A CN116069650A (zh) 2023-01-19 2023-01-19 一种测试用例的生成方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310103866.4A CN116069650A (zh) 2023-01-19 2023-01-19 一种测试用例的生成方法及装置

Publications (1)

Publication Number Publication Date
CN116069650A true CN116069650A (zh) 2023-05-05

Family

ID=86169657

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310103866.4A Pending CN116069650A (zh) 2023-01-19 2023-01-19 一种测试用例的生成方法及装置

Country Status (1)

Country Link
CN (1) CN116069650A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116303101A (zh) * 2023-05-19 2023-06-23 建信金融科技有限责任公司 测试案例生成方法、装置和设备

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116303101A (zh) * 2023-05-19 2023-06-23 建信金融科技有限责任公司 测试案例生成方法、装置和设备
CN116303101B (zh) * 2023-05-19 2023-08-15 建信金融科技有限责任公司 测试案例生成方法、装置和设备

Similar Documents

Publication Publication Date Title
US9454467B2 (en) Method and apparatus for mining test coverage data
CN108459964B (zh) 测试用例选择方法、装置、设备以及计算机可读存储介质
CN113227971A (zh) 实时应用错误识别和缓解
CN102402479B (zh) 用于静态分析的中间表示结构
US9396095B2 (en) Software verification
US20150089296A1 (en) Derivation of generalized test cases
CN113468525A (zh) 针对二进制程序的相似漏洞检测方法及装置
CN111782207B (zh) 任务流代码生成方法、装置、设备及存储介质
CN114626069A (zh) 威胁建模方法及装置
CN112328499A (zh) 一种测试数据生成方法、装置、设备及介质
CN110688111A (zh) 业务流程的配置方法、装置、服务器和存储介质
CN113590454A (zh) 测试方法、装置、计算机设备和存储介质
CN112799939A (zh) 增量代码覆盖率测试方法及装置、存储介质、电子设备
CN116069650A (zh) 一种测试用例的生成方法及装置
Phung et al. Error-type—A novel set of software metrics for software fault prediction
CN116501378B (zh) 一种逆向工程还原源代码的实现方法、装置和电子设备
US9396239B2 (en) Compiling method, storage medium and compiling apparatus
CN110737438A (zh) 一种数据处理方法和装置
US20220164277A1 (en) Analysis and Testing of Embedded Code
CN111737122B (zh) 一种大型机程序调用层级的检查方法及***
JP2019144873A (ja) ブロック線図解析装置
CN116661758B (zh) 一种优化日志框架配置的方法、装置、电子设备及介质
JP7302223B2 (ja) スクリプト検出装置、方法及びプログラム
CN118194293A (zh) 机器学习框架的模糊测试方法及相关设备
CN113190453A (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