CN112306844B - 软件开发***的接口测试方法、装置、设备及存储介质 - Google Patents

软件开发***的接口测试方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN112306844B
CN112306844B CN201910695960.7A CN201910695960A CN112306844B CN 112306844 B CN112306844 B CN 112306844B CN 201910695960 A CN201910695960 A CN 201910695960A CN 112306844 B CN112306844 B CN 112306844B
Authority
CN
China
Prior art keywords
test case
test
class
calling
program
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.)
Active
Application number
CN201910695960.7A
Other languages
English (en)
Other versions
CN112306844A (zh
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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910695960.7A priority Critical patent/CN112306844B/zh
Publication of CN112306844A publication Critical patent/CN112306844A/zh
Application granted granted Critical
Publication of CN112306844B publication Critical patent/CN112306844B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

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

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

软件开发***的接口测试方法、装置、设备及存储介质
技术领域
本发明涉及软件开发技术领域,尤其涉及一种软件开发***的接口测试方法、装置、设备及存储介质。
背景技术
随着互联网技术的发展,软件开发***的规模和复杂性日益增加,对于测试的要求也越来越严格,其中,接口测试又是软件开发***测试的重要组成部分。
相关技术在进行接口测试时往往局限于特定的平台,或者需要测试人员掌握较多的开发语言,导致测试效率低下。
发明内容
本发明实施例提供一种软件开发***的接口测试方法、装置、电子设备及存储介质,能够提高接口测试效率,降低测试人员的学习负担。
本发明实施例的技术方案是这样实现的:
本发明实施例提供一种软件开发***的接口测试方法,包括:
查询软件开发***的程序集中携带有测试属性的每个类、以及所述每个类中携带有测试属性的方法,所述每个类包括的方法用于测试接口且与所述接口采用相同的开发语言;
将所述每个类包括的方法作为测试用例,对应所述每个类创建由所述类包括的方法形成的测试用例集合;
通过所述开发语言对应的反射机制,将每个所述测试用例集合对应的类实例化为类对象;
遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述方法的调用结果;
将所述方法的调用结果与所述测试用例的预期结果进行比较,以确定所述测试用例的测试结果。
本发明实施例提供一种软件开发***的接口测试装置,包括:
查询模块,用于查询软件开发***的程序集中携带有测试属性的每个类、以及所述每个类中携带有测试属性的方法,所述每个类包括的方法用于测试接口且与所述接口采用相同的开发语言;以及将所述每个类包括的方法作为测试用例,对应所述每个类创建由所述类包括的方法形成的测试用例集合;
反射模块,用于通过所述开发语言对应的反射机制,将每个所述测试用例集合对应的类实例化为类对象;
调用模块,用于遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述方法的调用结果;
比较模块,用于将所述方法的调用结果与所述测试用例的预期结果进行比较,以确定所述测试用例的测试结果。
上述方案中,所述装置还包括确定模块,用于当调用的所述方法中不包括异步函数时,确定调用所述方法的过程中不需要进行异步等待;以及用于当调用的所述方法中包括异步函数时,确定调用所述方法的过程中需要进行异步等待。
上述方案中,所述调用模块,还用于在主协程中启动第一协程,在所述第一协程中调用所述方法;当在调用所述方法的过程中需要进行异步等待时,在所述第一协程中启动第二协程,在所述第二协程中启动第三协程,在所述第三协程中调用所述方法;当异步等待开始时,从所述第三协程切换至所述主协程,以及当异步等待结束时,从所述主协程返回至所述第三协程,继续调用所述方法。
上述方案中,所述装置还包括标记模块,用于将所述软件开发***的程序集中携带有测试用例属性的类,标记为对应测试用例集合中的键;以及用于将所述类包括的携带有测试用例属性的方法,标记为对应测试用例的值;基于所述键对应的类、以及所述值对应的方法,形成键值对形式的字典文件。
上述方案中,所述反射模块,还用于对于每个所述测试用例集合对应的类执行以下处理:调用所述反射机制中的程序集方法,并基于所述程序集方法传递所述测试用例集合对应的类的名称或地址,以使所述程序集方法根据所述名称或地址执行在内存空间中的加载处理,以形成所述类对象。
上述方案中,所述调用模块,还用于通过调用所述反射机制中的获取信息方法,以执行当前所遍历的测试用例对应的方法,并获取执行过程中方法的以下信息至少之一:名称、返回类型、参数、访问修饰符和实现信息。
上述方案中,所述装置还包括信息生成模块,用于根据所述测试结果,生成以下信息至少之一:测试用例集合条数,测试用例总条数,失败的测试用例总条数;每个所述测试用例集合中测试用例条数,失败的测试用例条数;每个所述测试用例的测试结果,以及当所述测试用例的测试结果为失败时的失败原因分析。
本发明实施例提供一种电子设备,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现本发明实施例提供的软件开发***的接口测试方法。
本发明实施例提供一种存储介质,存储有可执行指令,用于引起处理器执行时,实现本发明实施例提供的软件开发***的接口测试方法。
本发明实施例具有以下有益效果:
一方面,通过采用与软件开发***相同的开发语言编写测试用例,并通过相同的开发语言对应的反射机制调用测试用例来进行接口测试,测试人员只需学***台下进行软件开发***的接口测试。
附图说明
图1是本发明实施例提供的软件开发***的接口测试方法的一个可选的应用场景示意图;
图2是本发明实施例提供的用于软件开发***的接口测试的电子设备的一个可选的结构示意图;
图3是本发明实施例提供的软件开发***的接口测试方法的一个可选的流程示意图;
图4是本发明实施例提供的软件开发***的接口测试方法的一个可选的流程示意图;
图5是本发明实施例提供的软件开发***的接口测试方法的一个可选的流程示意图;
图6是本发明实施例提供的用于测试游戏开发***接口的测试用例集合代码示意图;
图7是本发明实施例提供的游戏开发***的接口测试方法的一个可选的流程示意图;
图8是本发明实施例提供的游戏开发***的接口测试方法的一个可选的流程示意图;
图9是本发明实施例提供的用于测试异步函数的代码示意图;
图10是本发明实施例提供的游戏开发***的接口测试结果示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,所描述的实施例不应视为对本发明的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本发明实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本发明实施例的目的,不是旨在限制本发明。
对本发明实施例进行进一步详细说明之前,对本发明实施例中涉及的名词和术语进行说明,本发明实施例中涉及的名词和术语适用于如下的解释。
1)软件开发***,也称软件开发平台,是一个功能强大的业务基础平台,为软件工程师提供了搭建好的软件框架和各种所需的工具,其目的在于提高软件工程师的开发效率和降低开发难度。软件开发***包括游戏开发***、手机应用(APP,Application)开发***等。
2)游戏开发***,也称为游戏引擎,用于编辑电脑游戏***或者一些交互式实时图像应用程序的开发框架,为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序。可以包含以下子***:渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测***、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理等功能。
3)程序集,对软件开发***的源代码使用编译器编译得到的、供在运行时环境(例如,公共语言运行库(CLR,Common Language Runtime),Java虚拟机等)中进一步编译的中间编译结果,例如,在视窗(WINDOWS)***中,程序集一般表现为.dll或者是.exe的格式。
4)原生语言接口,即软件开发***的开发语言实现的接口,用于实现软件中各种功能,例如渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测***、音效、脚本引擎、电脑动画、人工智能等相关的接口。以unity3D游戏引擎为例,其采用C#作为开发语言,则对应的原生语言接口为C#接口。
5)类,是程序代码中对于属性和方法的封装,属性可以称为成员变量,方法可以称为成员函数。
6)反射(Reflection),指开发语言提供的可以访问、检测和修改程序集的状态或行为的一种原生能力,通过反射机制提供的方法,可以动态地实例化程序集中的类(类实例化的结果称为类的对象,简称为类对象)并调用类对象中的方法,进而获得方法的调用结果。
例如,C#语言提供的反射调用的机制,通过类型(type)类和程序集(assembly)类实现,其中,assembly类中包含可以加载和执行程序集的方法,通过调用方法可以允许访问程序集(例如测试用例)的元数据;type类包括了用于获取类中成员信息的方法,通过调用type类中的方法可以访问类的各种成员信息,包括构造函数、属性、方法和事件等。
7)测试用例,是指为了测试软件开发***的原生语言接口,编写的一组测试输入、执行条件以及预期结果,预期结果用于与原生语言接口根据测试输入和执行条件而实际输出的结果比对,以便判断接口中的程序路径或接口整体上是否满足需求。
8)协程,一个特殊的函数,可以在某个地方挂起,并且可以重新在挂起处继续运行。一个线程中可以包含多个协程,多个协程的运行是串行的,当一个协程运行时,其他协程必须挂起。
发明人在实施本发明实施例的过程中发现,相关技术在进行接口测试时往往只能局限于特定的平台,例如,Nunit是一种广泛使用的C#接口测试框架,但其只能在Windows平台下使用,无法对其他平台下的C#接口进行测试;或者需要测试人员掌握多种开发语言,例如,ltest是一种lua接口测试框架,xlua、ulua和slua可以实现lua和C#之间的相互调用,结合两者即可实现C#接口的测试,但需要测试人员同时掌握多种开发语言,增加了测试人员的学习负担。
对此,考虑基于软件开发***本身的兼容性,采用与软件开发***相同的开发语言编写测试用例,并通过相同开发语言的反射机制来调用所述测试用例进行接口测试,故可以在查询软件开发***的程序集中携带有测试属性的每个类、以及每个类中携带有测试属性的方法,每个类包括的方法用于测试接口且与接口采用相同的开发语言;将每个类包括的方法作为测试用例,对应每个类创建由相应类包括的方法形成的测试用例集合;通过开发语言对应的反射机制,将每个测试用例集合对应的类实例化为类对象;遍历每个测试用例集合中的测试用例,调用类对象中与当前所遍历的测试用例对应的方法,获取方法的调用结果;将方法的调用结果与所述测试用例的预期结果进行比较,以确定测试用例的测试结果。
鉴于此,本发明实施例提供一种软件开发***的接口测试方法、装置、设备和存储介质,能够提高接口测试效率,降低测试人员的学习负担。
下面说明本发明实施例提供的电子设备的示例性应用,本发明实施例提供的电子设备可以实施为笔记本电脑,平板电脑,台式计算机,智能手机等各种类型的用户终端,也可以实施为服务器或服务器集群,还可以采用由用户终端和服务器协同的方式实施。下面,将说明电子设备的示例性应用。
参见图1,图1是本发明实施例提供的软件开发***的接口测试方法的一个可选的应用场景示意图,测试人员通过终端100将测试用例通过网络200发送给服务器300,服务器300对测试用例进行测试,将测试结果通过网络200返回给用户终端100,供测试人员查看和分析。
下面说明本发明实施例提供的电子设备的示例性结构,参见图2,图2是本发明实施例提供的用于软件开发***的接口处理的电子设备300的结构示意图,图2所示的电子设备300包括:至少一个处理器310、存储器350、至少一个网络接口320和用户接口330。电子设备300中的各个组件通过总线***340耦合在一起。可理解,总线***340用于实现这些组件之间的连接通信。总线***340除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线***340。
处理器310可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口330包括使得能够呈现媒体内容的一个或多个输出装置331,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口330还包括一个或多个输入装置332,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器350可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器350可选地包括在物理位置上远离处理器310的一个或多个存储设备。
存储器350包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Me mory),易失性存储器可以是随机存取存储器(RAM,Random Access Memor y)。本发明实施例描述的存储器350旨在包括任意适合类型的存储器。
在一些实施例中,存储器350能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作***351,包括用于处理各种基本***服务和执行硬件相关任务的***程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块352,用于经由一个或多个(有线或无线)网络接口320到达其他计算设备,示例性的网络接口320包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
呈现模块353,用于经由一个或多个与用户接口330相关联的输出装置331(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作***设备和显示内容和信息的用户接口);
输入处理模块354,用于对一个或多个来自一个或多个输入装置332之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本发明实施例提供的装置可以采用软件方式实现,图2示出了存储在存储器350中的软件开发***的接口测试装置355,其可以是程序和插件等形式的软件,包括以下软件模块:查询模块3551、创建模块3552、反射模块3553、调用模块3554和比较模块3555,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。将在下文中说明各个模块的功能。
在另一些实施例中,本发明实施例提供的软件开发***的接口测试装置可以采用硬件方式实现,作为示例,本发明实施例提供的软件开发***的接口测试装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本发明实施例提供的软件开发***的接口测试方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application Specific Integrate d Circuit)、DSP、可编程逻辑器件(PLD,Programmable Logic Device)、复杂可编程逻辑器件(CPLD,Complex Programmable LogicDevice)、现场可编程门阵列(FPGA,Field-Programmable Gate Array)或其他电子元件。
下面将结合本发明实施例提供的电子设备为服务器时的示例性应用,说明本发明实施例提供的软件开发***的接口测试方法。参见图3,图3是本发明实施例提供的软件开发***的接口测试方法的一个可选的流程示意图,将结合图3示出的步骤进行说明。
步骤S301:查询软件开发***的程序集中携带有测试属性的每个类、以及所述每个类中携带有测试属性的方法,所述每个类包括的方法用于测试接口且与所述接口采用相同的开发语言。
这里,在执行步骤S301之前,所述方法还可以包括:接收测试开发人员在软件开发***的程序集中植入的用于测试的类以及类中用于测试的方法。
在一些实施例中,在进行接口测试之前,测试开发人员通过用户终端在软件开发***的源代码中编写用于测试的类以及类中用于测试的方法,服务器查询测试人员新植入的用于测试的类和方法,利用所述类中的方法对接口进行测试。作为示例,测试开发人员为了测试软件中网络的连接情况,可以在软件开发***中编写相应的用于测试网络连接情况的类以及类中用于测试网络连接情况的方法。
作为示例,测试开发人员为了测试软件中代码下载更新的速度,可以在软件开发***中编写相应的用于测试下载更新速度的类以及类中用于测试下载更新速度的方法。
所述软件开发***可以是游戏开发***,也可以是其他的开发***,本发明实施例在此不做具体限定。
所述每个类包括的方法与所述接口采用相同的开发语言是指编写所述方法的开发语言与软件开发***的开发语言保持一致。
示例的,当所述软件开发***的开发语言为Java语言时,则采用Java语言来编写每个类中的方法;当所述软件开发***的开发语言为C++语言时,则采用C++语言来编写每个类中的方法;当所述软件开发***的开发语言为C#语言时,则采用C#语言来编写每个类中的方法。
步骤S302:将所述每个类包括的方法作为测试用例,对应每个类创建由相应类包括的方法形成的测试用例集合。
参见图4,图4是本发明实施例提供的软件开发***的接口测试方法的一个可选的流程示意图,在一些实施例中,图3示出的步骤S302可以通过图4示的步骤S3021至步骤S3023实现,将结合各步骤进行说明。
步骤S3021:将所述软件开发***的程序集中携带有测试用例属性的类,标记为对应测试用例集合的键。
步骤S3022:将所述类包括的携带有测试用例属性的方法,标记为对应测试用例的值。
步骤S3023:基于所述键对应的类、以及所述值对应的方法,形成键值对形式的字典文件。
这里,所述字典是指数据结构中元素的集合,其采用键-值对的形式保存数据,一个键可以对应多个值。
示例地,服务器在执行步骤S301之后,获取到若干组携带有测试属性的类以及每个所述类中若干组携带有测试属性的方法,即每个类对应一组方法,则可以将每个所述类的名称作为键,将每个所述类中包括的方法的名称或者地址作为值进行保存。
作为示例,服务器在软件开发***的程序集中查找到3组携带测试属性的测试用例集合,其中,测试用例集合1包括2个测试用例;测试用例集合2包括3个测试用例;测试用例集合3包括2个测试用例,则可以以下述方式进行保存:
{"testSuite1":["testCase11","testCase12"],"testSuite2":["testCase21","testCase22","testCase23"],"testSuite3":["testCase31","testCase32"]}。
需要说明的是,这里测试用例与方法是相同的开发语言。
步骤S303:通过所述开发语言对应的反射机制,将每个所述测试用例集合对应的类实例化为类对象。
这里,所述通过所述开发语言对应的反射机制,将每个所述测试用例集合对应的类实例化为类对象是指对开发语言提供的类的程序集进行实例化处理,也即将软件开发***的程序集从存储器加载到内存中。具体的,包括以下步骤:对于每个所述测试用例集合对应的类执行如下处理:调用反射机制中的程序集方法,并基于所述程序集方法传递所述测试用例集合对应的类的名称或地址,以使程序集方法根据所述名称或地址执行在内存空间中的加载处理,以形成所述类对象。
示例的,对于基于测试用例集合对应的类的地址可以编写如下代码进行调用:
Assembly assembly=Assembly.LoadFile(@"D:\TestDll\bin\Debug\TestDll.dll")。
作为示例,对于采用C#语言作为开发语言的游戏开发***,则采用C#的反射机制将每个测试用例集合对应的类实例化为类对象。具体的,调用C#的反射机制中的调用的程序集方法,并基于所述程序集方法传递所述测试用例集合对应的类的名称或地址,以使程序集方法根据所述名称或地址执行在内存空间中的加载处理,以形成所述类对象。
步骤S304:遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述方法的调用结果。
参见图5,图5是本发明实施例提供的软件开发***的接口测试方法的一个可选的流程示意图,在一些实施例中,图3示出的步骤S304中调用所述类对象中与当前所遍历的测试用例对应的方法可以包括图5中两种不同的情况。具体的,在调用所述方法之前,需要判断所述方法是否包括异步函数,当所述方法包括异步函数时,表示在调用所述方法的过程中需要等待,则使用协程的方式进行调用;当所述方法不包括异步函数时,表示在调用所述方法的过程中不需要等待,则可以直接进行调用。下面进行具体说明。
函数可以分为同步函数和异步函数。其中,同步函数是指当一个函数是同步执行时,那么所述函数被调用时不会立即返回,直到所述函数所要做的事情全都做完了才返回。异步函数是指当一个异步函数被调用时,所述函数会立即返回尽管该函数规定的操作任务还没有完成。
当一个线程调用一个同步函数时(例如:所述函数用于完成写文件任务),如果所述函数没有立即完成规定的操作,则所述操作会导致该调用线程的挂起(将CPU的使用权交给***,让***分配给其他线程使用),直到所述同步函数规定的操作完成才返回,最终才能导致该调用线程被重新调用。
当一个线程调用的是一个异步函数时,所述函数会立即返回尽管其规定的任务还没有完成,那么线程就会执行异步函数的下一条语句,而不会被挂起,导致使用线程无法实现测试用例的串行执行。
在一些实施例中,本发明实施例使用协程的方式对异步函数进行调用,以实现所有的测试用例之间是串行执行的。
作为示例,程序启动的时候在主协程Mo中运行,在主协程Mo中又启动协程Co1运行所有的测试用例。当调用的测试用例不是异步函数时,直接在协程Co1中运行所述函数。当调用的测试用例是异步函数,则在协程Co1中启动其他的协程来运行所述异步函数。
举例来说,假设在时刻T1接收到一个异步函数,则在协程Co1中启动协程Co2,在协程Co2中又启动协程Co3,在协程Co3中调用所述异步函数。这里之所以在协程Co3中调用所述异步函数而不是直接在协程Co2中调用所述异步函数是因为协程Co1相关代码不是一个游戏对象,无法直接启动一个协程Co2,但是可以通过在协程Co1中调用另外一个游戏对象的函数来启动协程Co3,而协程Co1和协程Co3之间的调用串联通过一个协程Co2来实现。
当运行所述异步函数一段时间到达时刻T2时,需要等待其它事件比如网络消息,则从协程Co3切换至主协程Mo,而主协程Mo并不用于运行测试用例,因此,在等待的过程中,所述异步函数被挂起且不会执行其他的测试用例。在异步等待结束时,即到达时刻T3,则从主协程Mo返回协程Co1继续执行所述异步函数中剩余的代码。当所述异步函数调用结束后,从协程Co3返回协程Co2,再返回协程Co1,执行其他的测试用例。如此,在协程Co3等待的时候保证不会切换到协程Co1和Co2,这样就保证了所有的测试用例都是串行执行的。
这里,所述方法的调用结果包括方法的名称、返回类型、参数、访问修饰符和实现信息至少之一。
作为示例,对于MethodInfo方法,获取的是方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等,因此,方法的调用结果为方法的名称、返回类型、参数、访问修饰符和实现信息等参数。
步骤S305:将所述方法的调用结果与所述测试用例的预期结果进行比较,以确定所述测试用例的测试结果。
这里,将所述方法的调用结果与所述测试用例的预期结果进行比较,判断方法的调用结果是否与测试用例的预期结果一致,若是,则表示测试通过;若否,则表示测试失败,即测试不通过。
示例地,对于测试用例1:EXPECT_EQ(3,Add(1,2)),其预期值是3,实际值是Add(1,2),也是3,预期值等于实际值,测试通过。
示例地,对于测试用例2:EXPECT_EQ(4,Add(1,2)),其预期值是4,实际值为Add(1,2),是3,预期值不等于实际值,测试失败。
在对软件开发***程序集中所有的携带测试属性的类,以及每个类中携带有测试属性的方法进行测试之后,汇总测试结果并记录,输出测试结果供测试开发人员进行查看和分析,输出结果可以采用xml格式文件,也可以采用json格式文件。
所述输出结果可以包括测试用例集合条数,测试用例总条数,失败的测试用例总条数;每个所述测试用例集合中测试用例条数,失败的测试用例条数;每个所述测试用例的测试结果,以及当所述测试用例的测试结果为失败时的失败原因分析等。
作为示例,可以采用XML格式文件首先将测试用例集合数、测试用例总条数、失败的测试用例总条数放置在首行进行输出,以供测试开发人员对本次测试结果有个最初的了解。随后,对于每个测试用例集合,首先显示测试用例集合中测试用例的条数以及失败的测试用例条数。最后,在每个测试用例集合中显示每条测试用例的测试结果,对于失败的测试用例还显示失败的原因。
下面继续结合图2说明本发明实施例提供的软件开发***的接口测试装置355的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器340的软件开发***的接口测试装置355中的软件模块可以包括:查询模块3551、创建模块3552、反射模块3553、调用模块3554和比较模块3555。
所述查询模块3551,用于查询软件开发***的程序集中携带有测试属性的每个类、以及所述每个类中携带有测试属性的方法,所述每个类包括的方法用于测试接口且与所述接口采用相同的开发语言;
所述创建模块3552,用于将所述每个类包括的方法作为测试用例,对应所述每个类创建由所述类包括的方法形成的测试用例集合;
所述反射模块3553,用于通过所述开发语言对应的反射机制,将每个所述测试用例集合对应的类实例化为类对象;
所述调用模块3554,用于遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述方法的调用结果;
所述比较模块3555,用于将所述方法的调用结果与所述测试用例的预期结果进行比较,以确定所述测试用例的测试结果。
在一些实施例中,所述调用模块3554,还用于当调用所述方法的过程中不需要进行异步等待时,直接调用所述类对象中与当前所遍历的测试用例对应的方法;以及当调用所述方法的过程中需要进行异步等待时,使用协程调用所述类对象中与当前所遍历的测试用例对应的方法。
在一些实施例中,所述装置还包括确定模块3556,用于当调用的所述方法中不包括异步函数时,确定调用所述方法的过程中不需要进行异步等待;以及用于当调用的所述方法中包括异步函数时,确定调用所述方法的过程中需要进行异步等待。
在一些实施例中,所述调用模块3554,还用于在主协程中启动第一协程,在所述第一协程中调用所述方法;当在调用所述方法的过程中需要进行异步等待时,在所述第一协程中启动第二协程,在所述第二协程中启动第三协程,在所述第三协程中调用所述方法;当异步等待开始时,从所述第三协程切换至所述主协程,以及当异步等待结束时,从所述主协程返回至所述第三协程,继续调用所述方法。
在一些实施例中,所述装置还包括标记模块3557,用于将所述软件开发***的程序集中携带有测试用例属性的类,标记为对应测试用例集合中的键;以及用于将所述类包括的携带有测试用例属性的方法,标记为对应测试用例的值;基于所述键对应的类、以及所述值对应的方法,形成键值对形式的字典文件。
在一些实施例中,所述反射模块3553,还用于对于每个所述测试用例集合对应的类执行以下处理:调用所述反射机制中的程序集方法,并基于所述程序集方法传递所述测试用例集合对应的类的名称或地址,以使所述程序集方法根据所述名称或地址执行在内存空间中的加载处理,以形成所述类对象。
在一些实施例中,所述调用模块3554,还用于通过调用所述反射机制中的获取信息方法,以执行当前所遍历的测试用例对应的方法,并获取执行过程中方法的以下信息至少之一:名称、返回类型、参数、访问修饰符和实现信息。
上述方案中,所述装置还包括信息生成模块3558,用于根据所述测试结果,生成以下信息至少之一:测试用例集合条数,测试用例总条数,失败的测试用例总条数;每个所述测试用例集合中测试用例条数,失败的测试用例条数;每个所述测试用例的测试结果,以及当所述测试用例的测试结果为失败时的失败原因分析。
需要说明的是,对于本发明实施例提供的软件开发***的接口测试装置中未尽的技术细节,可以根据图3-5、7-8任一附图的说明而理解。
在一些实施例中,所述软件开发***可以是游戏开发***。下面,以游戏开发***为例说明本发明实施例在一个实际的应用场景中的示例性应用。相关技术在进行C#接口测试时只能局限于特定的平台,例如,Nunit是一种windows平台下的C#接口测试框架,只支持windows平台,无法满足跨平台的需求;或者需要测试人员掌握多种开发语言,例如,Ltest是一种跨平台的lua接口测试框架,通过xlua、ulua或slua可以实现lua和C#之间的相互调用,结合两者即可实现C#接口的测试,但测试人员需要同时掌握xlua、ulua和slua语言,增加了测试人员的学习负担。
本发明实施例提供一种用于测试Unity引擎下C#接口的测试框架,直接使用C#语言编写测试用例集合,每个测试用例集合包括若干个测试用例,在运行所述测试用例集合时,首先通过C#的反射机制将所述测试用例集合对应的类实例化成类对象,在运行所述测试用例集合中的测试用例时,使用C#的反射机制调用所述测试用例,所述测试用例就会被执行,遍历所有所述测试用例集合中的测试用例即可完成测试,从而测试人员只需学***台,只要Unity引擎支持的平台,使用此测试框架均可以进行C#的接口测试。
图6是本发明实施例提供的用于测试Unity引擎下C#接口的测试用例集合代码示意图,测试开发人员可以在整个所述Unity工程的任意位置编写所述测试用例集合。如图6所示,所述测试用例集合对应一个继承CSTestSuite的类,所述测试用例集合使用CSTestAttribute属性来标识;所述测试用例集合中的测试用例也使用CSTestAttribute属性来标识。其中,SetUpTestCase函数在所述测试用例集合中的所有测试用例执行前执行;TearDownTestCase函数在所述测试用例集合中的所有测试用例执行后执行;SetUp函数在每个所述测试用例执行前执行;TearDown函数在每个所述测试用例执行后执行。
图7是本发明实施例提供的游戏开发***的接口测试方法的一个可选的流程示意图,如图7所示,所述方法包括以下步骤:
步骤S701:开始进行接口测试。
步骤S702:搜索整个程序集中的类,记录所有带CSTestAttribute属性的类,以及所述类中带CSTestAttribute属性的方法,每个类对应一组方法,将所述类和所述类对应的方法以键-值对的字典形式进行保存。
步骤S703:执行本次测试结果的初始化,以及输出日志(log)。
步骤S704:执行当前测试用例集合结果的初始化,以及输出日志(log)。
这里,在执行本步骤之前,从步骤S702的字典中随机获取一个测试用例集合。
步骤S705:执行当前测试用例集合的初始化。
步骤S706:执行当前测试用例结果的初始化,以及输出日志(log)。
这里,在执行本步骤之前,从所述当前测试用例集合中随机获取一个测试用例。
步骤S707:执行当前测试用例的初始化。
步骤S708:判断所述测试用例是否为异步函数。
如果判断结果为否,则执行步骤S709;如果判断结果为是,则执行步骤S710。
步骤S709:执行同步的测试用例。
这里,执行同步的测试用例具体过程为:首先使用C#的反射机制将当前测试用例集合对应的类实例化为类对象,在运行所述测试用例时,使用C#的反射机制调用所述测试用例对应的方法。
步骤S710:执行异步的测试用例。
这里,执行异步的测试用例为使用协程来执行所述测试用例。
步骤S711:汇总当前测试用例的测试结果。
步骤S712:记录当前测试用例的测试结果,以及输出日志(log)。
步骤S713:判断当前测试用例集合中的测试用例是否测试完毕。
如果判断结果为否,则执行步骤S706;如果判断结果为是,则执行步骤S714。
步骤S714:汇总当前测试用例集合的测试结果。
步骤S715:记录当前测试用例集合的测试结果,以及输出日志(log)。
步骤S716:判断当前测试用例集合是否测试完毕。
如果判断结果为否,则执行步骤S704;如果判断结果为是,则执行步骤S717。
步骤S717:记录本次测试结果,以及输出日志(log)。
步骤S718:测试结束。
需要说明的是,在步骤S708中,当所述测试用例为普通函数时,则直接调用所述函数即可。如果所述测试用例为异步函数,则需要做异步等待,那么需要使用协程来执行所述函数。为了使测试开发人员能够在测试代码中直接做等待,需要做到以下两点:
1)启动一个协程来执行所述函数;
2)在协程中等待的时候不能切换到原来的协程,而是切换到主协程。具体的执行过程如下。
参见图8,图8是本发明实施例提供的游戏开发***的接口测试方法的一个可选的流程示意图,如图8所示,程序启动的时候在主协程Mo运行,然后启动协程Co1调用所有的测试用例。当所述测试用例为普通函数时,直接在协程Co1中调用所述测试用例。当所述测试用例为异步函数时,则需要启动其他的协程进行调用。
示例地,在时刻T2调用测试用例,所述测试用例为异步函数,需要做异步等待,则启动一个协程Co2,在协程Co2中又启动协程Co3,在协程Co3中调用所述测试用例。当所述测试用例异步等待开始时,即时刻T4,则从协程Co3切换至主协程Mo,当所述测试用例异步等待结束时,即时刻T5,则从主协程Mo切换回协程Co3继续执行所述测试用例中其他的代码。当所述测试用例执行完毕后返回协程Co2,再回到协程Co1,继续执行其他的测试用例。如此,在协程Co3等待的时候保证不会切换到协程Co1和Co2,确保了所有的测试用例都是串行执行的。
相应地,参见图9,图9是本发明实施例提供的用于调用异步接口的具体代码示意图,采用图9所示的代码来实现异步函数的调用以保证测试用例的串行执行。
本发明实施例提供的C#接口测试框架的输出结果为两个文件:xml格式文件和json格式文件。下面以xml格式结果进行展示。
参见图10,图10是本发明实施例提供的Unity引擎下C#接口的测试结果示意图,如图10所示,其显示了整个测试过程中测试用例集合条数3条、测试用例总条数15条、失败的测试用例总条数6条;对于测试用例集合1包括5个测试用例,1个失败的测试用例;对于测试用例集合2包括8个测试用例,4个失败的测试用例;对于测试用例集合3包括2个测试用例,1个失败的测试用例;对于每个测试用例显示了成功还是失败,对于失败的测试用例显示了失败原因。
本发明实施例提供的用于测试Unity引擎下C#接口的测试框架,直接使用C#语言编写测试用例集合进行接口测试,从而测试开发人员只需学***台,只要Unity引擎支持的平台,使用此测试框架均可以进行测试。此外,本发明实施例提供的测试框架通过使用协程的方式对异步函数进行调用,保证了所有的测试用例都是串行执行的。
本发明实施例提供一种存储有可执行指令的存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本发明实施例提供的软件开发***的接口测试方法,例如,如图3-5、7-8任一附图示出的软件开发***的接口测试方法。
在一些实施例中,存储介质可以是FRAM、ROM、PROM、EPROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件***中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(HTML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
综上所述,通过本发明实施例具有以下有益效果:
1)一方面,通过采用与软件开发***相同的开发语言编写测试用例,并通过相同的开发语言对应的反射机制调用测试用例来进行接口测试,测试人员只需学***台下进行软件开发***的接口测试。
2)当测试用例对应的方法包括异步函数时,通过使用协程的方式来调用所述方法,从而保证了所有测试用例的调用都是串行进行的,实现了对异步函数的测试。
以上所述,仅为本发明的实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本发明的保护范围之内。

Claims (11)

1.一种软件开发***的接口测试方法,其特征在于,包括:
查询软件开发***的程序集中携带有测试属性的每个类、以及所述每个类中携带有测试属性的方法,所述每个类包括的方法用于测试接口且与所述接口采用相同的开发语言;
将所述每个类包括的方法作为测试用例,对应所述每个类创建由所述类包括的方法形成的测试用例集合;
对于每个所述测试用例集合对应的类执行以下处理:
调用所述开发语言对应的反射机制中的程序集方法,并基于所述程序集方法传递所述测试用例集合对应的类的名称或地址,以使
所述程序集方法根据所述名称或地址执行在内存空间中的加载处理,以形成类对象;
遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述测试用例对应的方法的调用结果;
将所述测试用例对应的方法的调用结果与所述测试用例的预期结果进行比较,以确定所述测试用例的测试结果。
2.根据权利要求1所述的方法,其特征在于,所述遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,包括:
当调用所述测试用例对应的方法的过程中不需要进行异步等待时,直接调用所述类对象中与当前所遍历的测试用例对应的方法;
当调用所述测试用例对应的方法的过程中需要进行异步等待时,使用协程调用所述类对象中与当前所遍历的测试用例对应的方法。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
当调用的所述测试用例对应的方法中不包括异步函数时,确定调用所述测试用例对应的方法的过程中不需要进行异步等待;
当调用的所述测试用例对应的方法中包括异步函数时,确定调用所述测试用例对应的方法的过程中需要进行异步等待。
4.根据权利要求2所述的方法,其特征在于,所述使用协程调用所述类对象中与当前所遍历的测试用例对应的方法,包括:
在主协程中启动第一协程,在所述第一协程中调用所述测试用例对应的方法;
当在调用所述测试用例对应的方法的过程中需要进行异步等待时,在所述第一协程中启动第二协程,在所述第二协程中启动第三协程,在所述第三协程中调用所述测试用例对应的方法;
当异步等待开始时,从所述第三协程切换至所述主协程;以及
当异步等待结束时,从所述主协程返回至所述第三协程,继续调用所述测试用例对应的方法。
5.根据权利要求1所述的方法,其特征在于,所述将所述每个类包括的方法作为测试用例,对应所述每个类创建由所述类包括的方法形成的测试用例集合,包括:
将所述软件开发***的程序集中携带有测试用例属性的类,标记为对应测试用例集合的键;
将所述类包括的携带有测试用例属性的方法,标记为对应测试用例的值;
基于所述键对应的类、以及所述值对应的方法,形成键值对形式的字典文件。
6.根据权利要求1所述的方法,其特征在于,所述调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述测试用例对应的方法的调用结果,包括:
通过调用所述反射机制中的获取信息方法,以执行当前所遍历的测试用例对应的方法,并获取执行过程中方法的以下信息至少之一:
名称、返回类型、参数、访问修饰符和实现信息。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
根据所述测试结果,生成以下信息至少之一:
测试用例集合条数,测试用例总条数,失败的测试用例总条数;
每个所述测试用例集合中测试用例条数,失败的测试用例条数;
每个所述测试用例的测试结果,以及当所述测试用例的测试结果为失败时的失败原因分析。
8.一种软件开发***的接口测试装置,其特征在于,所述装置包括:
查询模块,用于查询软件开发***的程序集中携带有测试属性的每个类、以及所述每个类中携带有测试属性的方法,所述每个类包括的方法用于测试接口且与所述接口采用相同的开发语言;
创建模块,用于将所述每个类包括的方法作为测试用例,对应所述每个类创建由所述类包括的方法形成的测试用例集合;
反射模块,用于对于每个所述测试用例集合对应的类执行以下处理:调用所述开发语言对应的反射机制中的程序集方法,并基于所述程序集方法传递所述测试用例集合对应的类的名称或地址,以使所述程序集方法根据所述名称或地址执行在内存空间中的加载处理,以形成类对象;
调用模块,用于遍历每个所述测试用例集合中的测试用例,调用所述类对象中与当前所遍历的测试用例对应的方法,以获取所述测试用例对应的方法的调用结果;
比较模块,用于将所述测试用例对应的方法的调用结果与所述测试用例的预期结果进行比较,以确定所述测试用例的测试结果。
9.根据权利要求8所述的装置,其特征在于,所述调用模块还用于:
当调用所述测试用例对应的方法的过程中不需要进行异步等待时,直接调用所述类对象中与当前所遍历的测试用例对应的方法;以及
当调用所述测试用例对应的方法的过程中需要进行异步等待时,使用协程调用所述类对象中与当前所遍历的测试用例对应的方法。
10.一种电子设备,其特征在于,所述电子设备包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至7任一项所述的软件开发***的接口测试方法。
11.一种计算机可读存储介质,存储有计算机可执行指令或者计算机程序,其特征在于,所述计算机可执行指令或者计算机程序被处理器执行时实现权利要求1至7任一项所述的软件开发***的接口测试方法。
CN201910695960.7A 2019-07-30 2019-07-30 软件开发***的接口测试方法、装置、设备及存储介质 Active CN112306844B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910695960.7A CN112306844B (zh) 2019-07-30 2019-07-30 软件开发***的接口测试方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910695960.7A CN112306844B (zh) 2019-07-30 2019-07-30 软件开发***的接口测试方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN112306844A CN112306844A (zh) 2021-02-02
CN112306844B true CN112306844B (zh) 2024-05-28

Family

ID=74486109

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910695960.7A Active CN112306844B (zh) 2019-07-30 2019-07-30 软件开发***的接口测试方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN112306844B (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101807168A (zh) * 2010-03-15 2010-08-18 北京航空航天大学 一种支持版本兼容的数字终端测试环境及其构建方法
CN106201862A (zh) * 2015-05-25 2016-12-07 阿里巴巴集团控股有限公司 web服务压力测试方法及装置
CN109408393A (zh) * 2018-11-07 2019-03-01 深圳市腾讯网络信息技术有限公司 应用测试方法、装置及设备和计算机可读存储介质

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105373533B (zh) * 2014-07-31 2019-04-09 阿里巴巴集团控股有限公司 一种页面链接地址的检测方法、客户端及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101807168A (zh) * 2010-03-15 2010-08-18 北京航空航天大学 一种支持版本兼容的数字终端测试环境及其构建方法
CN106201862A (zh) * 2015-05-25 2016-12-07 阿里巴巴集团控股有限公司 web服务压力测试方法及装置
CN109408393A (zh) * 2018-11-07 2019-03-01 深圳市腾讯网络信息技术有限公司 应用测试方法、装置及设备和计算机可读存储介质

Also Published As

Publication number Publication date
CN112306844A (zh) 2021-02-02

Similar Documents

Publication Publication Date Title
CN108027722B (zh) 在编译和部署中动态更新应用
CN107273286B (zh) 针对任务应用的场景自动化测试平台及方法
CN102667730B (zh) 设计时调试
US7895575B2 (en) Apparatus and method for generating test driver
US9952837B1 (en) Reusable component in a modeling environment
EP2850529A2 (en) System and methods for generating and managing a virtual device
US20190004774A1 (en) Automated source code adaption to inject features between platform versions
WO2014035463A1 (en) System and methods for generating and managing a virtual device
CN111209203B (zh) 一种基于源代码的模型验证方法
US9189213B2 (en) Automatic configuration of project system from project capabilities
KR101029332B1 (ko) 모바일 소프트웨어 테스트 장치 및 방법
CN111338925A (zh) 小程序测试方法及装置、***、电子设备和存储介质
CN109284222B (zh) 软件单元、数据处理***中的项目测试方法、装置及设备
CN112306844B (zh) 软件开发***的接口测试方法、装置、设备及存储介质
CN109491904B (zh) 一种SparkSQL应用程序的自动化测试方法和装置
US11573787B1 (en) Hot reloading a running application with an unsaved source code change
CN115470152A (zh) 测试代码生成方法、测试代码生成装置以及存储介质
US11442845B2 (en) Systems and methods for automatic test generation
CN111240972B (zh) 一种基于源代码的模型验证装置
CN114297088A (zh) 前端vue框架组件的测试方法、装置、设备及介质
CN112540920A (zh) 测试方法、装置、设备和存储介质
CN113590224B (zh) 服务器的检测方法、装置、电子设备及存储介质
WO2022127263A1 (zh) 一种代码处理方法以及相关设备
CN117453302A (zh) 导入软件开发包的方法、装置、设备及计算机可读介质
CN116048999A (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
GR01 Patent grant
GR01 Patent grant