CN112579440A - 一种虚拟测试依赖对象的确定方法及装置 - Google Patents

一种虚拟测试依赖对象的确定方法及装置 Download PDF

Info

Publication number
CN112579440A
CN112579440A CN202011402637.5A CN202011402637A CN112579440A CN 112579440 A CN112579440 A CN 112579440A CN 202011402637 A CN202011402637 A CN 202011402637A CN 112579440 A CN112579440 A CN 112579440A
Authority
CN
China
Prior art keywords
test
dependent object
determining
type
information
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
CN202011402637.5A
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.)
WeBank Co Ltd
Hong Kong University of Science and Technology HKUST
Original Assignee
WeBank Co Ltd
Hong Kong University of Science and Technology HKUST
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 WeBank Co Ltd, Hong Kong University of Science and Technology HKUST filed Critical WeBank Co Ltd
Priority to CN202011402637.5A priority Critical patent/CN112579440A/zh
Publication of CN112579440A publication Critical patent/CN112579440A/zh
Priority to PCT/CN2021/135084 priority patent/WO2022117038A1/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
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Artificial Intelligence (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Quality & Reliability (AREA)
  • Evolutionary Computation (AREA)
  • Medical Informatics (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明实施例提供一种确定虚拟测试依赖对象的方法及装置,该方法包括:采集测试代码在测试运行过程中产生的第一测试信息;根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。上述方法,可以极大地提升了确定虚拟测试依赖对象的准确率,节约人力物力,缩短确定虚拟测试依赖对象的周期。

Description

一种虚拟测试依赖对象的确定方法及装置
技术领域
本申请涉及网络技术领域,尤其涉及一种虚拟测试依赖对象的确定方法及装置。
背景技术
mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法;这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品。换句话说,由于真实对象在调试期间对生产环境的依赖,导致该测试的专注点并不完全集中在代码功能上;反而因为真实对象依赖生产环境而产生不必要且更复杂的测试流程。为了消除这种依赖,采用mock对象替代真实对象进行测试。
当前可以通过已知的mock对象类型来确定mock对象;因此,mock对象类型的确定就变得尤其重要。在现有技术中,mock对象类型主要通过人工分析大量开源项目,以发现开源项目中被mock的测试依赖对象类型,进一步指导开发者决定是否需要mock一个测试依赖对象。例如,Mostafa等人在2014年通过分析了5000多个开源项目中四大mocking库的使用情况,总结出了一些mocking技术在开源项目中的使用规律。该使用规律中包含:只有少数测试依赖对象类型需要被mock,JDK中的测试依赖对象类型通常不会被mock。又例如,2019年,Spadini等人从三个开源项目和一个商业项目中总结了mocking技术的使用规律。他们发现开发者通常被mock的测试依赖对象类型,是那些影响单元测试执行效率的测试依赖对象类型。由此可知,以上人工分析获得的使用规律都集中在被mock的测试依赖对象类型上。而仅根据被mock的测试依赖对象类型这一因素,并不能准确判断一个测试依赖对象类型是否需要被mock,且完全通过人工分析来判断,耗费大量人力物力,分析周期长。
因此,现在亟需一种虚拟测试依赖对象类型的确定方法及装置,用以提高确定虚拟测试依赖对象类型的准确率,以及节约人力物力,缩短确定虚拟测试依赖对象类型的周期。
发明内容
本发明实施例提供一种确定虚拟测试依赖对象的方法及装置,用以提高确定虚拟测试依赖对象类型的准确率,以及节约人力物力,缩短确定虚拟测试依赖对象类型的周期。
第一方面,本发明实施例提供一种确定虚拟测试依赖对象的方法,该方法包括:
采集测试代码在测试运行过程中产生的第一测试信息;根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。
上述方法中,通过获取测试代码,运行测试代码,并采集该测试代码的第一测试信息;进一步获取第一测试依赖对象的第一使用信息,使得训练后的机器学习模型可以根据该第一使用信息确定该测试代码的虚拟测试依赖对象。如此,相比于现有技术中通过人工分析获取被mock的测试依赖对象类型,以及仅根据被mock的测试依赖对象类型这一因素,判断一个测试依赖对象类型是否需要被mock来说,本申请可以通过运行程序自动获取第一测试依赖对象的使用信息,并通过训练后的机器学习模型分析该第一使用信息来确定测试依赖对象类型是否需要被虚拟的测试依赖对象(也可以是被mock的测试依赖对象,mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法)。如此,极大地提升了确定虚拟测试依赖对象的准确率,节约人力物力,缩短确定虚拟测试依赖对象的周期。
可选的,所述第一测试依赖对象在所述第一被测对象中的第一使用信息包括以下至少一项:所述第一测试依赖对象在所述第一被测对象中接口使用情况、所述第一测试依赖对象在所述第一被测对象中的上下文信息、所述第一测试依赖对象在所述第一被测对象中的基本属性、所述第一测试依赖对象在所述第一被测对象中的类引用情况。
上述方法中,所述第一使用信息中包含第一测试依赖对象的上下文信息,可以考虑到第一测试依赖对象的应用情况;包含第一测试依赖对象引用接口数量,考虑到第一测试依赖对象的行为信息;包含第一测试依赖对象的基本属性,可以考虑到第一测试依赖对象的属性维度;包含第一测试依赖对象的引用类数量,可以考虑到第一测试依赖对象类型的复杂性(一般来说,复杂度较高的测试依赖对象类型容易被虚拟测试)。如此,可以大大提升确定虚拟测试依赖对象的准确率。
可选的,所述第一测试依赖对象在所述第一被测对象中接口使用情况通过以下任一方式确定,包括:从所述第一测试信息中统计所述第一测试依赖对象对预设接口记录中的各接口的直接引用数量;或/和确定以所述第一测试依赖对象为起点,在所述测试代码的方法调用图中间接调用所述预设接口记录中的各接口的间接引用数量;或/和确定所述第一测试依赖对象是否实现了所述预设接口记录中的任一接口;或/和确定所述第一测试依赖对象对synchronized方法的调用数量。
上述方法中,统计所述第一测试依赖对象对预设接口记录中的各接口的直接引用数量、间接引用数量、引用接口的实现情况和synchronized(synchronized关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行)方法的调用数量,使得获取的第一测试依赖对象的行为信息更加细致,增加行为信息的准确性。
可选的,所述第一测试依赖对象在所述第一被测对象中上下文信息通过以下任一方式确定,包括:确定所述第一被测对象中对所述第一测试依赖对象方法调用的第一数量;或/和确定在所述第一被测对象中所述第一测试依赖对象的返回值作为分支条件的使用次数;或/和确定在所述第一被测对象的条件分支中所述第一测试依赖对象方法调用的第二数量;或/和确定在所述第一被测对象中所述第一测试依赖对象作为异常被捕获的捕获次数;或/和确定所述第一测试依赖对象的参数与所述第一被测对象的参数存在依赖关系时的方法调用的第三数量。
上述方法中,获取方法调用的第一数量、方法调用的第二数量、方法调用的第三数量,以及在所述第一被测对象中所述第一测试依赖对象的返回值作为分支条件的使用次数、在所述第一被测对象中所述第一测试依赖对象作为异常被捕获的捕获次数。使得获取的第一测试依赖对象的应用情况更加细致,增加应用情况的准确性。
可选的,根据所述第一测试信息确定所述第一测试代码中的第一被测对象的类型,包括:根据所述第一测试信息中的测试用例命名规则确定所述第一被测试对象的类型。
上述方法中,通过测试用例命名规则确定第一被测试对象的类型,可以简便、快速、准确的确定第一被测试对象的类型。
可选的,根据所述第一测试信息确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型,包括:根据所述第一测试信息中的第一测试依赖对象,通过正则匹配方法确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型。
上述方法中,通过正则匹配方法确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型,可以简便、快速、准确的确定第一测试依赖对象的类型。
可选的,所述机器学习模型是通过如下方式获得的,包括:采集样本代码在测试运行过程中产生的第二测试信息;根据所述第二测试信息确定所述样本代码的样本信息,所述样本信息包括第二被测对象的类型、第二被测对象中包括的第二测试依赖对象的类型,所述第二测试依赖对象是否为虚拟测试依赖对象及所述第二测试依赖对象在所述第二被测对象中的第二使用信息;将所述样本信息输入初始的机器学习模型进行训练,得到所述机器学习模型。
上述方法中,通过采集样本代码,运行样本代码,并获取该样本代码的第二测试信息;进一步获取第二测试依赖对象的包含虚拟测试信息的第二使用信息,使得机器学习模型可以学习到发生过虚拟测试的第二测试依赖对象的特征,以及未发生过虚拟第二测试依赖对象的特征;增加训练后的机器学习模型,在应用时获得的虚拟测试依赖对象的准确性。
可选的,所述第二测试依赖对象是否为虚拟测试依赖对象是通过如下方式确定的:通过正则匹配方法根据所述第二测试依赖对象的类型,确定所述第二测试依赖对象是否为虚拟测试依赖对象。
上述方法中,通过正则匹配方法确定所述样本代码中第二被测对象中包括的第二测试依赖对象的类型,可以简便、快速、准确的确定第二测试依赖对象的类型。
第二方面,本发明实施例提供一种确定虚拟测试依赖对象的装置,该装置包括:
采集模块,用于采集测试代码在测试运行过程中产生的第一测试信息;
确定模块,用于根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;
所述确定模块还用于,将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;
所述确定模块还用于,通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。
第三方面,本申请实施例还提供一种计算设备,包括:存储器,用于存储程序;处理器,用于调用所述存储器中存储的程序,按照获得的程序执行如第一方面的各种可能的设计中所述的方法。
第四方面,本申请实施例还提供一种计算机可读非易失性存储介质,包括计算机可读程序,当计算机读取并执行所述计算机可读程序时,使得计算机执行如第一方面的各种可能的设计中所述的方法。
本申请的这些实现方式或其他实现方式在以下实施例的描述中会更加简明易懂。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种确定虚拟测试依赖对象架构示意图;
图2为本发明实施例提供的一种确定虚拟测试依赖对象的流程示意图;
图3为本发明实施例提供的一种确定虚拟测试依赖对象的流程示意图;
图4为本发明实施例提供的一种确定虚拟测试依赖对象装置示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
本发明实施例提供的一种确定虚拟测试依赖对象的系统架构,如图1所示,确定虚拟测试依赖对象的系统架构100中包含:测试代码101、第一采集单元102、机器学习模型103、第二采集单元104、样本代码库105;从样本代码库105中获取样本代码,该样本代码可以是开源项目,第二采集单元104根据开源项目的源代码构建二进制文件,在该生成的二进制文件对应的每一个方法调用之前进行程序插桩,使得该插桩代码记录下包含第二测试依赖对象和对应的测试用例的第二测试信息;并根据测试用例命名规则和第二测试信息中的测试用例确定第二被测对象的类型,根据第二测试信息中的第二测试依赖对象,通过正则匹配方法确定第二测试依赖对象的类型,以及第二测试依赖对象是否为虚拟测试依赖对象,并分析获得第二测试依赖对象的第二使用信息。将第二采集单元104获得的第二被测对象的类型、第二测试依赖对象的类型、第二测试依赖对象是否为虚拟测试依赖对象的结果,及第二使用信息输入包含初始的机器学习模型的机器学习模型103,以使得机器学习模型103中的机器学习模型学习到发生过虚拟测试的第二测试依赖对象类型的特征,和未发生过虚拟测试的第二测试依赖对象类型的特征。获得机器学习模型103中的训练后的机器学习模型。如此,在获取测试代码101后,第一采集单元102根据测试代码的源代码构建二进制文件,在该生成的二进制文件对应的每一个方法调用之前进行程序插桩,使得该插桩代码记录下包含第一测试依赖对象和对应的测试用例的第一测试信息;并根据测试用例命名规则和第一测试信息中的测试用例确定第一被测对象的类型,根据第一测试信息中的第一测试依赖对象,通过正则匹配方法确定第一测试依赖对象的类型,并分析获得第一测试依赖对象的第一使用信息。将第一采集单元102获得的第一被测对象的类型、第一测试依赖对象的类型及第一使用信息输入包含训练后的机器学习模型的机器学习模型103确定第一测试依赖对象是否为虚拟测试依赖对象。如此,可以通过上述系统架构,可以自动准确获取虚拟测试依赖对象,节约人力物力,缩短确定虚拟测试依赖对象的周期。
基于此,本申请实施例提供了一种确定虚拟测试依赖对象的方法流程,如图2所示,包括:
步骤201、采集测试代码在测试运行过程中产生的第一测试信息;
步骤202、根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;
步骤203、将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;
步骤204、通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。
上述方法中,通过获取测试代码,运行测试代码,并采集该测试代码的第一测试信息;进一步获取第一测试依赖对象的第一使用信息,使得训练后的机器学习模型可以根据该第一使用信息确定该测试代码的虚拟测试依赖对象。如此,相比于现有技术中通过人工分析获取被mock的测试依赖对象类型,以及仅根据被mock的测试依赖对象类型这一因素,判断一个测试依赖对象类型是否需要被mock来说,本申请可以通过运行程序自动获取第一测试依赖对象的使用信息,并通过训练后的机器学习模型分析该第一使用信息来确定测试依赖对象类型是否需要被虚拟的测试依赖对象(也可以是被mock的测试依赖对象,mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法)。如此,极大地提升了确定虚拟测试依赖对象的准确率,节约人力物力,缩短确定虚拟测试依赖对象的周期。
本申请实施例提供了一种第一使用信息,所述第一测试依赖对象在所述第一被测对象中的第一使用信息包括以下至少一项:所述第一测试依赖对象在所述第一被测对象中接口使用情况、所述第一测试依赖对象在所述第一被测对象中的上下文信息、所述第一测试依赖对象在所述第一被测对象中的基本属性、所述第一测试依赖对象在所述第一被测对象中的类引用情况。此处,因为训练后的机器学习模型中,包含发生过虚拟测试的测试依赖对象对应类型的特征,与未发生过虚拟测试的测试依赖对象对应类型的特征。也就是说,训练后的机器学习模型可以根据第一测试依赖对象的上下文信息,确定第一测试依赖对象对应类型的上下文信息;可以根据第一测试依赖对象引用接口数量,确定第一测试依赖对象对应类型引用接口数量;可以根据第一测试依赖对象的基本属性,确定第一测试依赖对象对应类型的基本属性;可以根据第一测试依赖对象的引用类数量,确定第一测试依赖对象对应类型的引用类数量。如此,训练后的机器学习模型可以根据第一测试依赖对象对应类型的上述特征,确定第一测试依赖对象是否为虚拟测试依赖对象。
本申请实施例提供了一种第一测试依赖对象在所述第一被测对象中接口使用情况的确定方法,所述第一测试依赖对象在所述第一被测对象中接口使用情况通过以下任一方式确定,包括:从所述第一测试信息中统计所述第一测试依赖对象对预设接口记录中的各接口的直接引用数量;或/和确定以所述第一测试依赖对象为起点,在所述测试代码的方法调用图中间接调用所述预设接口记录中的各接口的间接引用数量;或/和确定所述第一测试依赖对象是否实现了所述预设接口记录中的任一接口;或/和确定所述第一测试依赖对象对synchronized方法的调用数量。
其中,从第一测试信息中统计第一测试依赖对象对预设接口记录中的各接口的直接引用数量;预设接口记录可以为环境/并发相关API记录;则为从第一测试信息中统计第一测试依赖对象对环境/并发相关API的直接引用数量。例如,可以通过遍历第一测试依赖对象中出现的所有变量,对其中的环境/并发相关的API进行计数。其中,确定以第一测试依赖对象为起点,在测试代码的方法调用图中间接调用预设接口记录中的各接口的间接引用数量;预设接口记录为环境/并发相关API记录;则以第一测试依赖对象为起点,在测试代码的方法调用图中间接调用对环境/并发相关API的间接引用数量。
例如,在方法调用图(call graph)上,以第一测试依赖对象的方法作为起点进行搜索,遍历第一测试依赖对象中出现的所有变量,计算搜索过程中所经过的方法及其所在类对环境/并发API的引用数目求和。其中,确定第一测试依赖对象是否实现了预设接口记录中的任一接口;预设接口记录为环境/并发接口记录;则所述测试依赖对象类型是否实现环境/并发接口记录中的任意一个接口。其中,确定第一测试依赖对象对synchronized方法的调用数量;例如,遍历第一测试依赖对象中的方法调用,对调用标记synchronized的调用点进行计数。
且,因为训练后的机器学习模型中,包含发生过虚拟测试的测试依赖对象对应类型的特征,与未发生过虚拟测试的测试依赖对象对应类型的特征。则可以根据从第一测试信息中统计第一测试依赖对象对预设接口记录中的各接口的直接引用数量;获得第一测试信息中统计第一测试依赖对象类型对预设接口记录中的各接口的直接引用数量的特征。可以根据以第一测试依赖对象为起点,在测试代码的方法调用图中间接调用预设接口记录中的各接口的间接引用数量;获得以第一测试依赖对象对应类型为起点,在测试代码的方法调用图中间接调用预设接口记录中的各接口的间接引用数量的特征。可以根据第一测试依赖对象是否实现了预设接口记录中的任一接口;获得第一测试依赖对象对应类型是否实现了预设接口记录中的任一接口的特征。可以根据第一测试依赖对象对synchronized方法的调用数量;获得第一测试依赖对象对应类型对synchronized方法的调用数量的特征。如此,使得练后的机器学习模型可以根据以上获得的测试代码的第一测试依赖对象对应类型的特征,确定第一测试依赖对象是否需要被虚拟。
这里提供了一种环境/并发相关的API记录的一种示例如下:
Figure BDA0002812952620000101
Figure BDA0002812952620000111
这里还提供了环境/并发相关接口记录的一种示例如下:
java.lang.AutoClosable.*
java.io.Closable.*
java.sql.*
javax.servlet.*
java.io.Flushable.*
java.net.*
javax.naming.*
javax.security.*
本申请实施例提供了一种第一测试依赖对象在所述第一被测对象中上下文信息的确定情况,所述第一测试依赖对象在所述第一被测对象中上下文信息通过以下任一方式确定,包括:确定所述第一被测对象中对所述第一测试依赖对象方法调用的第一数量;或/和确定在所述第一被测对象中所述第一测试依赖对象的返回值作为分支条件的使用次数;或/和确定在所述第一被测对象的条件分支中所述第一测试依赖对象方法调用的第二数量;或/和确定在所述第一被测对象中所述第一测试依赖对象作为异常被捕获的捕获次数;或/和确定所述第一测试依赖对象的参数与所述第一被测对象的参数存在依赖关系时的方法调用的第三数量。其中,确定第一被测对象中对第一测试依赖对象方法调用的第一数量;在一种示例中,对第一被测对象中对第一测试依赖对象的方法调用进行计数获得方法调用的第一数量。其中,确定在第一被测对象中第一测试依赖对象的返回值作为分支条件的使用次数;在一种示例中,可以为遍历第一被测对象中对第一测试依赖对象的所有方法调用,对返回值在第一被测对象中被用作分支条件的情况进行计数。例如,对dep的process方法调用的返回值被用作if语句的条件。其中,确定在第一被测对象的条件分支中第一测试依赖对象方法调用的第二数量;在一种示例中,可以为遍历第一被测对象中对第一测试依赖对象的所有方法调用,对处于某个条件分支中的调用点进行计数。例如,对dep的process处于if语句的某个分支中的调用点进行计数。其中,确定在所述第一被测对象中所述第一测试依赖对象作为异常被捕获的捕获次数;在一种示例中,可以为遍历第一被测对象中对第一测试依赖对象的所有方法调用,对被try…catch语句包裹的调用点进行计数。例如,对dep的process方法调用被try…catch包裹的调用点进行计数。其中,确定第一测试依赖对象的参数与第一被测对象的参数存在依赖关系时的方法调用的第三数量。在一种示例中,遍历第一被测对象中对第一测试依赖对象的所有方法调用,对参数受第一被测对象方法参数影响的调用点进行计数。例如,对dep的process调用的参数count+1受被测类方法run的count参数的影响。
同样的,因为训练后的机器学习模型中,包含发生过虚拟测试的测试依赖对象对应类型的特征,与未发生过虚拟测试的测试依赖对象对应类型的特征。训练后的机器学习模型可以根据第一被测对象中对第一测试依赖对象方法调用的第一数量;获得第一被测对象对应类型中对第一测试依赖对象对应类型方法调用的第一数量的特征。可以根据在第一被测对象中第一测试依赖对象的返回值作为分支条件的使用次数;获得在第一被测对象对应类型中第一测试依赖对象对应类型的返回值作为分支条件的使用次数的特征。可以根据在第一被测对象的条件分支中第一测试依赖对象方法调用的第二数量;获得在第一被测对象对应类型的条件分支中第一测试依赖对象对应类型方法调用的第二数量的特征。可以根据在第一被测对象中第一测试依赖对象作为异常被捕获的捕获次数;获得在第一被测对象对应类型中第一测试依赖对象对应类型作为异常被捕获的捕获次数的特征。可以根据第一测试依赖对象的参数与第一被测对象的参数存在依赖关系时的方法调用的第三数量;获得第一测试依赖对象对应类型的参数与第一被测对象对应类型的参数存在依赖关系时的方法调用的第三数量的特征。如此,使得练后的机器学习模型可以根据以上获得的测试代码的第一测试依赖对象对应类型的特征,确定第一测试依赖对象是否需要被虚拟。
本申请实施例提供了一种确定第一被测对象的类型的方法,根据所述第一测试信息确定所述第一测试代码中的第一被测对象的类型,包括:根据所述第一测试信息中的测试用例命名规则确定所述第一被测试对象的类型。此处,开发者在构建单元测试时,通常遵循一定的命名规律:测试用例所在的类型的名称,会包含第一被测对象的名称。例如,针对MyClass的测试代码会放在TestMyClass中。我们遵循这样的命名规律,根据测试用例所在类的名称推断第一被测对象的类型。又例如,通过测试用例名称:TestCachingKeyProvider.testKeyVersion,可以确定第一被测对象的类型为CachingKeyProvider。
本申请实施例提供了一种确定第一测试依赖对象的类型的方法,根据所述第一测试信息确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型,包括:根据所述第一测试信息中的第一测试依赖对象,通过正则匹配方法确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型。也就是说,可以根据第一被测对象与第一测试依赖对象的类型的固定格式,通过第一被测对象正则匹配测试代码,获得第一测试依赖对象的类型。
本申请实施例提供了一种机器学习模型训练方法,所述机器学习模型是通过如下方式获得的,包括:采集样本代码在测试运行过程中产生的第二测试信息;根据所述第二测试信息确定所述样本代码的样本信息,所述样本信息包括第二被测对象的类型、第二被测对象中包括的第二测试依赖对象的类型,所述第二测试依赖对象是否为虚拟测试依赖对象及所述第二测试依赖对象在所述第二被测对象中的第二使用信息;将所述样本信息输入初始的机器学习模型进行训练,得到所述机器学习模型。
此处,采集的样本代码最好为处于活跃的开发过程中,同时有着完善的项目管理流程的开源项目。其中,处于活跃的开发过程中的代码为当前最新的样本代码,可以紧跟生产的应用情况,具有良好的时效性。以有着完善的项目管理流程的开源项目作为样本代码,可以使得样本代码完整性高、质量普遍较好。例如,样本代码可以从以下10个大规模开源项目中抽取数据用于样本代码库,以使得可以通过样本代码库中的Hadoop等开源项目,获取发生过虚拟测试或未发生过虚拟测试的第二测试依赖对象的相关特征。
Figure BDA0002812952620000141
其中,第二使用信息中包含第二测试依赖对象的上下文信息,如此,使得训练后的机器学习模型中可以考虑到第二测试依赖对象对应类型的应用情况的特征。包含第二测试依赖对象引用接口数量;如此,使得训练后的机器学习模型中可以考虑到第二测试依赖对象对应类型的行为信息的特征。包含第二测试依赖对象的基本属性。如此,使得训练后的机器学习模型中可以考虑到第二测试依赖对象对应类型的属性维度的特征。包含第二测试依赖对象的引用类数量;如此,使得训练后的机器学习模型中可以考虑到第二测试依赖对象对应类型的复杂性(一般来说,复杂度较高的测试依赖对象类型容易被虚拟测试)。通过第二使用信息训练机器学习模型,使得训练后的机器学习模型判断测试代码的虚拟测试依赖对象时,可以大大提升确定虚拟测试依赖对象的准确率。
本申请实施例提供了一种确定虚拟测试依赖对象的方法,所述第二测试依赖对象是否为虚拟测试依赖对象是通过如下方式确定的:通过正则匹配方法根据所述第二测试依赖对象的类型,确定所述第二测试依赖对象是否为虚拟测试依赖对象。此处,被虚拟过的测试依赖对象一般有固定命名格式,在一种实施例中,可以通过三种方式确定:其中,第一种、常见的mocking框架创建出来的mocked object的类型名非常特殊,例如,使用Mockito创建针对Foo类的虚拟测试依赖对象,会得到一个类型为Foo$MockitoMock$xxx的对象。这个名称的由三部分构成:第一部分(即Foo)是原本类的名称,第二部分(即$MockitoMock$)是一个固定的字符串,第三部分(即xxx,虚拟测试依赖对象)是一个哈希字符串,长度一般是6-8个字符。第二种、其他的mocking框架创建出来的虚拟测试依赖对象也存在一定的规律,因此,我们使用正则表达式去匹配类名,如果匹配成功的话,则代表这是一个虚拟测试依赖对象。例如,用于匹配Mockito创建的虚拟测试依赖对象的正则表达式为“\w+\$MockitoMock\$\w+”。第三种、检测开发者手工构建的虚拟测试依赖对象。这类虚拟测试依赖对象是定义在测试代码中,专门用于测试用途的类。若这个类符合在测试代码中,并且承自一个在生产代码中的类,又并且不是一个函数接口(functional interface),则认为它是开发者手工构建的虚拟测试依赖对象。
另外,上述各方法中的第一或第二测试依赖对象类型的基本属性可以包括以下至少一项:测试依赖对象是否是抽象类、测试依赖对象是否是接口、测试依赖对象是否在当前的生产代码库中,该生成代码为非测试代码、测试依赖对象是否是JAVA开发工具包的类。如此,使得第二使用信息中包含虚拟测试过,或未虚拟测试过的第二测试依赖对象的上述属性信息,机器学习模型可以学习到虚拟测试过,或未虚拟测试过的第二测试依赖对象对应类型的上述属性特征。训练后的机器学习模型可以根据第一使用信息中包含第一测试依赖对象的上述属性信息,确定第一测试依赖对象对应类型的属性特征,进而确定第一测试依赖对象是否是虚拟测试依赖对象。
上述各方法中的第一或第二测试依赖对象类型的类引用情况可以包括以下至少一项:测试依赖对象类型对其他类的直接引用数量、测试依赖对象类型对其他类的间接引用数量、测试依赖对象类型的字段数量。如此,使得第二使用信息中包含虚拟测试过,或未虚拟测试过的第二测试依赖对象的上述类引用信息,机器学习模型可以学习到虚拟测试过,或未虚拟测试过的第二测试依赖对象对应类型的上述类引用特征。训练后的机器学习模型可以根据第一使用信息中包含第一测试依赖对象的上述类引用信息,确定第一测试依赖对象对应类型的类引用特征,进而确定第一测试依赖对象是否是虚拟测试依赖对象。
上述各方法中的第二测试依赖对象类型的接口使用情况可以通过以下任一方式确定,包括:从第二测试信息中统计第二测试依赖对象对预设接口记录中的各接口的直接引用数量;或/和确定以第二测试依赖对象为起点,在测试代码的方法调用图中间接调用预设接口记录中的各接口的间接引用数量;或/和确定第二测试依赖对象是否实现了预设接口记录中的任一接口;或/和确定第二测试依赖对象对synchronized方法的调用数量。
上述各方法中的第二测试依赖对象类型的上下文信息可以通过以下任一方式确定,包括:确定第二被测对象中对第二测试依赖对象方法调用的第一数量;或/和确定在第二被测对象中第二测试依赖对象的返回值作为分支条件的使用次数;或/和确定在第二被测对象的条件分支中第二测试依赖对象方法调用的第二数量;或/和确定在第二被测对象中第二测试依赖对象作为异常被捕获的捕获次数;或/和确定第二测试依赖对象的参数与第二被测对象的参数存在依赖关系时的方法调用的第三数量。
基于上述方法流程,本申请实施例提供了一种确定虚拟测试依赖对象的方法流程,如图3所示,包括:
步骤301、获取样本代码;
步骤302、将样本代码的源代码转换为二进制文件;
步骤303、对二进制文件进行程序插桩,即,在二进制文件中的每个方法调用之前插入代码段,使得该代码段采集样本代码运行时的包含第二测试依赖对象和测试用例的第二测试信息。
步骤304、对获取的第二测试信息进行分析,获得包含第二被测对象的类型、第二测试依赖对象的类型,第二测试依赖对象是否为虚拟测试依赖对象及第二测试依赖对象在第二被测对象中的第二使用信息的样本信息。
步骤305、将样本信息输入初始的机器学习模型进行训练,得到训练后的机器学习模型。
步骤306、获得测试代码;
步骤307、将测试代码的源代码转换为二进制文件;
步骤308、对二进制文件进行程序插桩,即,在二进制文件中的每个方法调用之前插入代码段,使得该代码段采集样本代码运行时的包含第一测试依赖对象和测试用例的第一测试信息。
步骤309、对获取的第一测试信息进行分析,获得第一被测对象的类型、第一测试依赖对象的类型及第一测试依赖对象在第一被测对象中的第一使用信息。
步骤310、将第一被测对象的类型、第一测试依赖对象的类型及第一测试依赖对象在第一被测对象中的第一使用信息输入训练后的机器学习模型,得到虚拟测试依赖对象。
这里需要说明的是,上述确定虚拟测试依赖对象的方法流程步骤并不唯一,如,步骤301至步骤305可以与步骤306至步骤310分别执行。
基于同样的思想,本申请实施例提供了一种确定虚拟测试依赖对象的装置,如图4所示,该装置包括:
采集模块401,用于采集测试代码在测试运行过程中产生的第一测试信息;
确定模块402,用于根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;
所述确定模块402还用于,将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;
所述确定模块402还用于,通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。
可选的,所述第一测试依赖对象在所述第一被测对象中的第一使用信息包括以下至少一项:所述第一测试依赖对象在所述第一被测对象中接口使用情况、所述第一测试依赖对象在所述第一被测对象中的上下文信息、所述第一测试依赖对象在所述第一被测对象中的基本属性、所述第一测试依赖对象在所述第一被测对象中的类引用情况。
可选的,所述确定模块402还用于,从所述第一测试信息中统计所述第一测试依赖对象对预设接口记录中的各接口的直接引用数量;或/和确定以所述第一测试依赖对象为起点,在所述测试代码的方法调用图中间接调用所述预设接口记录中的各接口的间接引用数量;或/和确定所述第一测试依赖对象是否实现了所述预设接口记录中的任一接口;或/和确定所述第一测试依赖对象对synchronized方法的调用数量。
可选的,所述确定模块402还用于,确定所述第一被测对象中对所述第一测试依赖对象方法调用的第一数量;或/和确定在所述第一被测对象中所述第一测试依赖对象的返回值作为分支条件的使用次数;或/和确定在所述第一被测对象的条件分支中所述第一测试依赖对象方法调用的第二数量;或/和确定在所述第一被测对象中所述第一测试依赖对象作为异常被捕获的捕获次数;或/和确定所述第一测试依赖对象的参数与所述第一被测对象的参数存在依赖关系时的方法调用的第三数量。
可选的,所述确定模块402还用于,根据所述第一测试信息中的测试用例命名规则确定所述第一被测试对象的类型。
可选的,所述确定模块402还用于,根据所述第一测试信息中的第一测试依赖对象,通过正则匹配方法确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型。
可选的,所述采集模块401还用于,采集样本代码在测试运行过程中产生的第二测试信息;根据所述第二测试信息确定所述样本代码的样本信息,所述样本信息包括第二被测对象的类型、第二被测对象中包括的第二测试依赖对象的类型,所述第二测试依赖对象是否为虚拟测试依赖对象及所述第二测试依赖对象在所述第二被测对象中的第二使用信息;将所述样本信息输入初始的机器学习模型进行训练,得到所述机器学习模型。
可选的,所述确定模块402还用于,通过正则匹配方法根据所述第二测试依赖对象的类型,确定所述第二测试依赖对象是否为虚拟测试依赖对象。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (11)

1.一种确定虚拟测试依赖对象的方法,其特征在于,所述方法包括:
采集测试代码在测试运行过程中产生的第一测试信息;
根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;
将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;
通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。
2.如权利要求1中所述的方法,其特征在于,所述第一测试依赖对象在所述第一被测对象中的第一使用信息包括以下至少一项:
所述第一测试依赖对象在所述第一被测对象中接口使用情况、所述第一测试依赖对象在所述第一被测对象中的上下文信息、所述第一测试依赖对象在所述第一被测对象中的基本属性、所述第一测试依赖对象在所述第一被测对象中的类引用情况。
3.如权利要求2中所述的方法,其特征在于,所述第一测试依赖对象在所述第一被测对象中接口使用情况通过以下任一方式确定,包括:
从所述第一测试信息中统计所述第一测试依赖对象对预设接口记录中的各接口的直接引用数量;或/和
确定以所述第一测试依赖对象为起点,在所述测试代码的方法调用图中间接调用所述预设接口记录中的各接口的间接引用数量;或/和
确定所述第一测试依赖对象是否实现了所述预设接口记录中的任一接口;或/和
确定所述第一测试依赖对象对synchronized方法的调用数量。
4.如权利要求2中所述的方法,其特征在于,所述第一测试依赖对象在所述第一被测对象中上下文信息通过以下任一方式确定,包括:
确定所述第一被测对象中对所述第一测试依赖对象方法调用的第一数量;
或/和确定在所述第一被测对象中所述第一测试依赖对象的返回值作为分支条件的使用次数;
或/和确定在所述第一被测对象的条件分支中所述第一测试依赖对象方法调用的第二数量;
或/和确定在所述第一被测对象中所述第一测试依赖对象作为异常被捕获的捕获次数;
或/和确定所述第一测试依赖对象的参数与所述第一被测对象的参数存在依赖关系时的方法调用的第三数量。
5.如权利要求1-4中任一所述的方法,其特征在于,根据所述第一测试信息确定所述第一测试代码中的第一被测对象的类型,包括:
根据所述第一测试信息中的测试用例命名规则确定所述第一被测试对象的类型。
6.如权利要求1-4中任一所述的方法,其特征在于,根据所述第一测试信息确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型,包括:
根据所述第一测试信息中的第一测试依赖对象,通过正则匹配方法确定所述测试代码中第一被测对象中包括的第一测试依赖对象的类型。
7.如权利要求1-4中任一所述的方法,其特征在于,所述机器学习模型是通过如下方式获得的,包括:
采集样本代码在测试运行过程中产生的第二测试信息;
根据所述第二测试信息确定所述样本代码的样本信息,所述样本信息包括第二被测对象的类型、第二被测对象中包括的第二测试依赖对象的类型,所述第二测试依赖对象是否为虚拟测试依赖对象及所述第二测试依赖对象在所述第二被测对象中的第二使用信息;
将所述样本信息输入初始的机器学习模型进行训练,得到所述机器学习模型。
8.如权利要求7中所述的方法,其特征在于,所述第二测试依赖对象是否为虚拟测试依赖对象是通过如下方式确定的:
通过正则匹配方法根据所述第二测试依赖对象的类型,确定所述第二测试依赖对象是否为虚拟测试依赖对象。
9.一种确定虚拟测试依赖对象的装置,其特征在于,所述装置包括:
采集模块,用于采集测试代码在测试运行过程中产生的第一测试信息;
确定模块,用于根据所述第一测试信息确定所述测试代码中的第一被测对象的类型、第一被测对象中包括的第一测试依赖对象的类型,以及所述第一测试依赖对象在所述第一被测对象中的第一使用信息;
所述确定模块还用于,将所述第一被测对象的类型、所述第一测试依赖对象的类型及所述第一使用信息输入训练后的机器学习模型;
所述确定模块还用于,通过所述训练后的机器学习模型,确定所述第一测试依赖对象是否为虚拟测试依赖对象。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有程序,当所述程序在计算机上运行时,使得计算机实现执行权利要求1至8中任一项所述的方法。
11.一种计算机设备,其特征在于,包括:
存储器,用于存储计算机程序;
处理器,用于调用所述存储器中存储的计算机程序,按照获得的程序执行如权利要求1至8任一权利要求所述的方法。
CN202011402637.5A 2020-12-02 2020-12-02 一种虚拟测试依赖对象的确定方法及装置 Pending CN112579440A (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN202011402637.5A CN112579440A (zh) 2020-12-02 2020-12-02 一种虚拟测试依赖对象的确定方法及装置
PCT/CN2021/135084 WO2022117038A1 (zh) 2020-12-02 2021-12-02 一种确定虚拟测试依赖对象的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011402637.5A CN112579440A (zh) 2020-12-02 2020-12-02 一种虚拟测试依赖对象的确定方法及装置

Publications (1)

Publication Number Publication Date
CN112579440A true CN112579440A (zh) 2021-03-30

Family

ID=75128168

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011402637.5A Pending CN112579440A (zh) 2020-12-02 2020-12-02 一种虚拟测试依赖对象的确定方法及装置

Country Status (2)

Country Link
CN (1) CN112579440A (zh)
WO (1) WO2022117038A1 (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113656290A (zh) * 2021-08-04 2021-11-16 支付宝(杭州)信息技术有限公司 一种mock点自动识别方法、装置以及设备
WO2022117038A1 (zh) * 2020-12-02 2022-06-09 深圳前海微众银行股份有限公司 一种确定虚拟测试依赖对象的方法及装置

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105335281B (zh) * 2014-07-30 2018-03-20 阿里巴巴集团控股有限公司 一种自动mock外部依赖的方法及装置
CN106326088B (zh) * 2015-06-16 2021-03-23 中兴通讯股份有限公司 实现构建测试对象的方法、装置及业务配置测试的装置
WO2018098658A1 (zh) * 2016-11-30 2018-06-07 深圳市大疆创新科技有限公司 对象测试方法、装置及系统
CN112579440A (zh) * 2020-12-02 2021-03-30 深圳前海微众银行股份有限公司 一种虚拟测试依赖对象的确定方法及装置

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2022117038A1 (zh) * 2020-12-02 2022-06-09 深圳前海微众银行股份有限公司 一种确定虚拟测试依赖对象的方法及装置
CN113656290A (zh) * 2021-08-04 2021-11-16 支付宝(杭州)信息技术有限公司 一种mock点自动识别方法、装置以及设备

Also Published As

Publication number Publication date
WO2022117038A1 (zh) 2022-06-09

Similar Documents

Publication Publication Date Title
US8776029B2 (en) System and method of software execution path identification
US8954926B2 (en) Code coverage detection with scriptable language unmodified source
US8140911B2 (en) Dynamic software tracing
US20090222646A1 (en) Method and apparatus for detecting processor behavior using instruction trace data
US9836379B2 (en) Method and system for generating a memory trace of a program code executable on a programmable target
CN110196801B (zh) 一种基于代码覆盖率的测试方法及装置
CN106326067A (zh) 一种在压力测试下对cpu性能进行监控的方法及装置
WO2022117038A1 (zh) 一种确定虚拟测试依赖对象的方法及装置
Malavolta et al. How maintainability issues of android apps evolve
Molnar et al. Discovering maintainability changes in large software systems
David et al. Neural reverse engineering of stripped binaries
Saini et al. Comparing quality metrics for cloned and non cloned java methods: A large scale empirical study
Molnar et al. Evaluation of software product quality metrics
CN112363936A (zh) 差异覆盖率测试方法、装置、计算机设备和存储介质
Milea et al. Vector abstraction and concretization for scalable detection of refactorings
Mahmud et al. Api change impact analysis for android apps
Huo et al. Interpreting coverage information using direct and indirect coverage
CN111221721A (zh) 一种单元测试案例自动化录制和执行方法及装置
Pettersson Measuring precision for static and dynamic design pattern recognition as a function of coverage
CN110633199A (zh) 用于支持智能合约的区块链的测试装置、方法及介质
CN108763092B (zh) 一种基于交叉验证的代码缺陷检测方法及装置
CN110516446A (zh) 一种恶意软件家族归属判定方法、系统及存储介质
CN113392033B (zh) 一种确定被动iast测试api覆盖率的方法及装置
CN114490413A (zh) 测试数据的准备方法及装置、存储介质和电子设备
CN115080426A (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