[go: up one dir, main page]

CN116521510A - 测试方法、装置、设备、存储介质及产品 - Google Patents

测试方法、装置、设备、存储介质及产品 Download PDF

Info

Publication number
CN116521510A
CN116521510A CN202210078880.9A CN202210078880A CN116521510A CN 116521510 A CN116521510 A CN 116521510A CN 202210078880 A CN202210078880 A CN 202210078880A CN 116521510 A CN116521510 A CN 116521510A
Authority
CN
China
Prior art keywords
target
information
thread
statement
operation method
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
CN202210078880.9A
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.)
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 CN202210078880.9A priority Critical patent/CN116521510A/zh
Publication of CN116521510A publication Critical patent/CN116521510A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Prevention of errors by analysis, debugging or testing of software
    • G06F11/3604Analysis of software for verifying properties of programs
    • G06F11/3608Analysis of software for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Prevention of errors by analysis, debugging or testing of software
    • G06F11/3604Analysis of software for verifying properties of programs
    • G06F11/3616Analysis of software for verifying properties of programs using software metrics
    • 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)
  • Software Systems (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是本申请一个实施例提供的测试方法的流程图五;
图11是本申请一个实施例提供的测试方法的流程图六;
图12示例性示出了一种异常线程访问的检测流程示意图;
图13是本申请一个实施例提供的测试装置的框图;
图14是本申请一个实施例提供的计算机设备的结构框图。
具体实施方式
本申请实施例提供的测试方法涉及计算机技术,下面对本申请方法实施例中可能涉及的应用场景、相关术语或者名词进行简要介绍,以便于本申请领域技术人员理解。
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
Objective-C是一种通用、高级、面向对象的编程语言。
Clang:一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。
GCD(Grand Central Dispatch,多线程优化技术)是一个多核编程方法。
用户界面(User Interface,UI)是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议。
API(Application Programming Interface,应用程序接口)是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。
JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
请参考图1,其示出了本申请一个实施例提供的应用程序运行环境的示意图。该应用程序运行环境可以包括:终端10和服务器20。
终端10包括但不限于手机、电脑、智能语音交互设备、智能家电、车载终端、飞行器、游戏主机、电子书阅读器、多媒体播放设备、可穿戴设备等电子设备。终端10中可以安装应用程序的客户端。
在本申请实施例中,上述应用程序可以是任何类型的应用程序,包括但不限于通讯类应用程序、系统管理类应用程序、新闻类应用程序、社交类应用程序、互动娱乐类应用程序、浏览器应用程序、购物类应用程序、内容分享类应用程序、金融类应用程序、游戏类应用程序、教育类应用程序、生活服务类应用程序、地图类应用程序、阅读类应用程序、虚拟现实(Virtual Reality,VR)类应用程序、增强现实(Augmented Reality,AR)类应用程序等,本申请实施例对此不作限定。上述应用程序可以通过应用开发程序进行开发,上述终端10中可以安装应用开发程序的客户端。在示例性实施例中,应用开发程序为集成开发环境(IDE,Integrated Development Environment),集成开发环境是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务。可选地,应用开发程序为运行在目标操作系统上的一种集成开发环境Xcode。
服务器20用于为终端10中的应用程序或应用开发程序的客户端提供后台服务。例如,服务器20可以是上述应用程序或应用开发程序的后台服务器。服务器20可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、CDN(Content Delivery Network,内容分发网络)、以及大数据和人工智能平台等基础云计算服务的云服务器。可选地,服务器20同时为多个终端10中的应用程序提供后台服务。
可选地,终端10和服务器20之间可通过网络30进行互相通信。终端10以及服务器20可以通过有线或无线通信方式进行直接或间接地连接,本申请在此不做限制。
请参考图2,其示出了本申请一个实施例提供的测试方法的流程图一。该方法可应用于计算机设备中,所述计算机设备是指具备数据计算和处理能力的电子设备,如各步骤的执行主体可以是图1所示的应用程序运行环境中的终端10。该方法可以包括以下几个步骤(210~250)。
步骤210,获取第一信息。
第一信息用于表征目标测试场景关联的至少一种操作方法与至少两个线程之间的对应关系,至少两个线程是目标应用对应的线程。目标测试场景包括至少一个待测试场景,比如与UI操作相关的场景、耗时操作场景以及其他的一些特殊场景。
可选地,每个目标应用都对应一个进程。每个进程可以包含多个线程,这些线程可以同时运行,并各自处理一些任务。
在示例性实施例中,上述至少两个线程包括但不限于主线程和工作线程。工作线程是子线程。目标应用运行起来后,默认会产生一个主线程(MainThread)。可选地,主线程专门用来处理与UI相关的操作,如界面的显示与更新、处理用户交互事件等。对于一个应用来说,之所以引入多个线程,很大程度上是由于存在一些操作是非常耗时的,例如:发送网络请求并等待服务器的响应,这种耗时操作是不能够放在主线程中进行操作的,因为在等待的时间内主线程被使用,用户是不能做任何交互动作的,因而会极大影响用户体验。对于耗时的操作,需要再另外创建一个线程,比如工作线程,放到后台处理,当处理完成得到结果后,再返回主线程去设置UI界面。
上述操作方法具有对应的类(本申请实施例中也称对象类别)。类是指一种类型的对象的原型,其声明了每个对象都具有的属性(Property),同时还定义了同一类的所有对象都使用的一系列方法(Method),这里的方法即是上述操作方法。
在示例性实施例中,通过将一则消息(message)发送给一个对象(称为消息的接收者),可以调用该对象的一个方法,即上述操作方法。指令语句中写明调用的操作方法名,以及相应的参数,比如发送的消息内容等信息。
通过获取上述第一信息,可以确定目标测试场景关联的至少一种操作方法与至少两个线程之间的对应关系,通过上述对应关系可以确定目标测试场景下每种操作方法对应的目标执行线程。
在示例性实施例中,上述测试方法应用于目标应用开发程序中。相应的,如图3所示,上述步骤210之前,上述测试方法还包括下述步骤290,图3示出了本申请一个实施例提供的测试方法的流程图二。
步骤290,显示目标应用开发程序对应的应用开发页面。
基于上述应用开发页面,可以接收针对目标应用的编译操作;响应于应用开发页面接收到针对目标应用的编译操作,从上述步骤210开始执行。相应的,如图3所示,上述步骤210可由下述步骤210a替换实施。
步骤210a,响应于应用开发页面接收到针对目标应用的编译操作,获取第一信息。
上述编译操作包括针对应用开发页面中编译选项的选择操作。
上述目标应用开发程序中可以集成上述测试方法对应的测试脚本以及相关的插件,比如方法调用链获取插件,通过运行上述测试脚本以及上述方法调用链获取插件,即可执行上述测试方法。
步骤220,获取目标应用对应的至少一个文本文件。
至少一个文本文件包括至少一条指令语句。上述至少一个文本文件为目标应用对应的至少一个源代码文件。
在Objective-C中,每个类的定义包括两个部分:接口(interface)和实现(implementation)。接口部分定义在.h文件中,包含类的声明、属性以及方法,主要作用是对外提供访问接口。实现部分定义在.m文件中,主要用于方法的功能实现。上述至少一个文本包括目标应用对应的至少一个.m文件。m是一种文件格式,中文名为可执行的源代码文件,文件扩展名为.m。.h文件为头文件,头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明,而定义文件用于保存程序的实现。
在示例性实施例中,如图3所示,上述步骤220之后,上述测试方法还包括如下步骤(260~270)。
步骤260,获取至少一个文本文件中的目标文本片段。
目标文本片段用于表征目标对象类别的实现信息。可选地,上述目标文本片段是目标对象类别的实现部分对应的代码片段。Object-C代码中类存在声明interface和实现implementation,本申请实施例在分析的过程中需要获取到类的实现,得到该类的所有方法,从而分析出方法调用链。
在示例性实施例中,上述目标对象类别也可称为类。类的实现部分以类起始标识(比如@implementation)开始,并以对应的类结束标识(@end)结束。因此可通过上述两种标识,确定目标文本片段。在类的实现部分,即目标文本片段中,包括对接口部分定义的方法进行实现的代码内容。
可选地,上述目标对象类别包括目标系统提供的对象类别,也包括自定义的对象类别,本申请实施例对此不作限定。
步骤270,在目标文本片段包括预设操作方法对应的目标文本段的情况下,确定目标文本段中的目标指令语句。
其中,预设操作方法是目标对象类别对应的操作方法,目标文本段用于表征预设操作方法的实现信息,目标指令语句是表征预设操作方法对应的方法调用信息的指令语句,至少一条指令语句包括目标指令语句。
目标对象类别对应至少一种操作方法,每个操作方法都对应一段实现代码,这段实现操作方法的代码可称为操作方法对应的文本段,表征操作方法的实现信息。
文本段中的指令语句可以调用操作方法或函数进行消息传递,调用的操作方法或函数对应的目标对象类别可以是本类,也可以是其他类。
在一种可能的实施方式中,预设操作方法包括第一操作方法,第一操作方法是第一编程语言对应的操作方法。可选地,第一编程语言为Objective-C语言。相应的,如图4所示,上述步骤270的实施过程包括下述步骤(271~272),图4示出了本申请一个实施例提供的测试方法的流程图三。
步骤271,在目标文本片段包括第一操作方法对应的第一文本段的情况下,确定第一文本段中与第一目标信息关联的指令语句。
其中,第一文本段用于表征第一操作方法的实现信息,第一目标信息用于表征第一操作方法对应的方法调用关系,第一目标信息包括第一操作方法对应的对象类别继承信息、第一标识信息以及第一参数信息中至少一种。可选地,上述第一操作方法是基于第一编程语言对应的函数实现的操作方法,通过解析指令语句中与第一编程语言关联的函数,可确定上述第一操作方法。
上述对象类别继承信息用于表征第一操作方法对应的对象类别,以及该对象类别对应的父对象类别,包括但不限于对象类别名以及父对象类别名。上述对象类别继承信息可基于第一操作方法对应的指令语句中的消息接收方信息确定。
上述第一标识信息用于表征第一操作方法对应的方法标识信息,包括但不限于方法名称、关键字等标识信息。
第一参数信息为与第一操作方法关联的并且能够改变方法调用顺序的参数信息,比如选择器(SEL)参数信息和语句块(block)参数信息,这两种参数会改变方法调用顺序。
选择器(Selector,SEL)用于在消息中负责在对象的方法列表中选择一个方法执行。
上述语句块或指令语句块也称为代码块。Block是封装了一组代码指令语句的对象,可以在任何时间执行。其本质上是可移植的匿名函数,可以作为方法和函数的参数传入,可以从方法和函数中返回。
步骤272,将对象类别继承信息、第一标识信息以及第一参数信息关联的指令语句确定为目标指令语句。
保留上述对象类别继承信息、第一标识信息以及第一参数信息关联的指令语句,并将其作为目标指令语句,即可确定第一操作方法对应的方法调用关系。
在另一种可能的实施方式中,预设操作方法包括第二操作方法,第二操作方法是第二编程语言对应的操作方法。可选地,第二编程语言为C语言。相应的,如图4所示,上述步骤270的实施过程还包括下述步骤(273~274)。
步骤273,在目标文本片段包括第二操作方法对应的第二文本段的情况下,确定第二文本段中与第二目标信息关联的指令语句。
其中,第二文本段用于表征第二操作方法的实现信息,第二目标信息用于表征第二操作方法对应的方法调用关系,第二目标信息包括第二操作方法对应的第二标识信息与第二参数信息。可选地,上述第二操作方法是基于第二编程语言对应的函数实现的操作方法,通过解析指令语句中与第二编程语言关联的函数,可确定上述第二操作方法。
上述第二标识信息用于表征第二操作方法对应的方法标识信息,包括但不限于方法名称、关键字等标识信息。
上述第二参数信息为第二操作方法对应的完整参数信息。可选地,上述第二编程语言关联的函数为与GCD相关的函数,由于GCD相关的函数会根据不同的参数会改变当前访问的线程,所以需要把第二操作方法关联的参数信息完整的保存下来,作为上述第二参数信息。
步骤274,将第二标识信息与第二参数信息关联的指令语句确定为目标指令语句。
保留上述第二标识信息与第二参数信息关联的指令语句,并将其作为目标指令语句,即可确定第二操作方法对应的方法调用关系。
在示例性实施例中,如图4所示,执行上述步骤274之后,上述测试方法还包括下述步骤280。
步骤280,基于目标指令语句,生成至少一个文本文件对应的目标文件。
目标文件用于表征至少一条指令语句对应的方法调用链信息。
在示例性实施例中,上述目标文件为JSON文件。从上述文本文件中确定出上述目标指令语句后,可基于上述目标指令语句的内容生成JSON文件,后续通过对JSON文件解析即可确定出各目标指令语句对应的方法调用信息,比如各指令语句对应的操作方法,以及操作方法对应的参数信息、标识信息、对象类别集成信息等,通过各目标指令语句对应的方法调用信息即可确定目标应用中完整的方法调用链信息。
本申请实施例需要分析多线程异常访问问题,就需要知道目标应用涉及的方法调用的整个过程,来判断调用是否符合线程安全。因此可通过Clang进行语法分析,获取方法调用链信息。
在示例性实施例中,上述第一目标信息与第二目标信息都在是由Clang进行分析,Clang默认分析的结果都是以文本文件为单位,以上得到的数据也是单个文本文件的类结构,不满足以完整方法调用链为基础来分析线程安全问题,所以需要对这种情况作改进处理,目的是要能够拿到整个工程项目的完整方法调用链,可以先将每个文本文件的内容通过JSON文件形式保存下来。可选地,基于每个文本文件中的目标指令语句的内容,可生成每个文本文件对应的JSON文件。上述至少一个文本文件对应的JSON文件,即可表征整个目标对应的完整方法调用链信息。
在一个示例中,如图5所示,其示例性示出了一种方法调用链信息获取流程的示意图。在示例性实施例中,目标编译器Clang以及方法调用链获取插件Plugin集成于目标应用开发程序中,上述方法调用链获取插件是基于上述目标编译器Clang生成的插件,通过在目标应用开发程序中对目标应用对应的多个文本文件进行编译,即可基于上述目标编译器以及方法调用链获取插件对多个文本文件中的指令语句进行语法分析,获取到各个文本文件对应的方法调用链信息。可选地,上述可用Clang同类型的工具替代,如OClint(静态代码分析工具),目的就是为了拿到整个项目的方法调用链。上述多个文本文件,即多个代码文件中的代码文本中存在类的声明(interface)代码和类的实现(implementation)代码。在本申请实施例中,在上述目标编译器以及方法调用链获取插件进行语法分析的过程中,需要获取的目标文本片段包括类的实现代码,通过获取类的实现代码能够获取到各类对应的所有操作方法及其对应的文本段。
在操作方法与OC(Objective-C)函数对应的情况(比如目标操作方法为第一操作方法的情况)下,就从该操作方法对应的文本段中解析出操作方法对应的对象类别继承信息、第一标识信息以及第一参数信息。其中,上述对象类别继承信息包括但不限于操作方法对应的类名(对象类别)及其父类(父对象类别),上述类名及其父类可通过操作方法对应的消息接收方确定;第一标识信息包括但不限于操作方法对应的函数名;第一参数信息包括但不限于参数类型。保存父类是为了确定该操作方法对应的继承关系,基于上述继承关系可以确定该操作方法对应的类的类型,比如判断该操作方法对应的类是UI相关类或者UI相关类之外的其他类,类的类型与线程相关联;保存函数名用于判断线程切换等情况,第一参数信息是指与该操作方法关联的并且能够改变方法调用顺序的参数信息,比如选择器(SEL)参数信息和语句块(block)参数信息,这两种参数会改变方法调用顺序。通过获取上述对象类别继承信息、第一标识信息以及第一参数信息即可确定该操作方法对应方法调用关系,将文本文件中各个类对应的,目标操作方法对应的上述三种信息进行汇总即可反映文本文件对应的方法调用信息。
在操作方法与C函数对应的情况(比如目标操作方法为第二操作方法的情况)下,就从该操作方法对应的文本段中解析出操作方法对应的第二标识信息与第二参数信息。上述第二标识信息包括该操作方法对应的C函数的函数名。可选地,上述C函数为与GCD相关的函数,由于GCD相关的函数会根据不同的参数会改变当前访问的线程,所以需要把该操作方法关联的参数信息完整的保存下来,作为上述第二参数信息。
可选地,通过输出第一操作方法对应的类名及其父类、函数名与选择器参数信息或语句块参数信息,以及输出第二操作方法对应的函数名以及完整参数信息可以得到上述方法调用链信息。
步骤230,确定至少一条指令语句对应的操作方法和第一线程信息。
第一线程信息用于表征操作方法对应的实际执行线程。可选地,上述实际执行线程可基于方法调用链信息确定。每条指令语句对应的实际执行线程与该指令语句对应的上一执行指令语句相关联,若上一执行指令语句不涉及线程改变操作,则该指令语句的实际执行线程与上一执行指令语句的执行线程相同;若上一执行指令语句涉及线程改变操作,则该指令语句的实际执行线程为执行上一执行指令语句后的目标切换线程。因此,可通过方法调用链信息以及线程标记信息确定上述第一线程信息。上述线程标记信息用于表征历史检测语句对应的历史执行线程。
在示例性实施例中,如图3所示,执行上述步骤270之后,上述步骤230可由下述步骤230a替换实施。
步骤230a,确定目标指令语句对应的操作方法和第一线程信息。
在示例性实施例中,如图4所示,执行上述步骤280之后,上述步骤230a的实施过程包括下述步骤(230a1~230a2)。
步骤230a1,对目标文件进行解析处理,得到解析结果。
对上述JSON文件中的语句进行解析,可以得到目标指令语句对应的相关信息,包括上述第一目标信息和第二目标信息。
步骤230a2,根据解析结果,确定目标指令语句对应的操作方法和第一线程信息。
根据上述解析结果即可确定目标指令语句对应的操作方法,以及操作方法对应的方法调用信息,根据上述方法调用信息可以确定目标指令语句对应的实际执行线程,或者根据上述方法调用信息和线程标记信可以确定目标指令语句对应的实际执行线程。
在一个示例中,如图6所示,其示例性示出了一种基于方法调用链获取插件进行线程异常访问测试的流程示意图。在图6示出的流程中,将目标编译器Clang以及方法调用链获取插件Plugin集成到应用开发程序Xcode中;通过应用开发程序对目标应用对应的多个代码文件进行编译,在编译过程中即可基于上述目标编译器以及方法调用链获取插件对多个代码文件中的指令语句进行语法分析,并生成能够表征各代码文件对应的方法调用链信息的目标文件,比如JSON文件,进而对目标文件进行分析即可实现线程异常访问测试,并得到测试结果。
步骤240,根据第一信息,确定操作方法对应的第二线程信息。
第二线程信息用于表征操作方法在目标测试场景下对应的目标执行线程。
在在判断目标执行线程的过程中,需要先知道哪些操作方法需要在主线程调用,哪些操作方法需要在工作线程调用,因此可将这些方法与线程的对应关系提前整理好,识别到指令语句对应的操作方法后,可以根据上述第一信息确定操作方法对应的目标执行线程。
在一个示例中,如下表1所示,其示出了部分的第一信息。
表1
其中,上述NSData代表桥接数据的静态字节缓冲区的类。NSData及其可变子类为字节缓冲区提供数据对象或面向对象的包装器。NSData类提供了以原子方式将其内容保存到文件的方法。
上述UlPasteboard代表是用户界面粘贴板的类。在典型用法中,当用户请求对用户界面中的选项进行复制、剪切或重复操作时,应用程序中的对象会将数据写入粘贴板。然后,相同或不同应用程序中的另一个对象从粘贴板中读取该数据并将其呈现给新位置的用户;这通常发生在用户请求粘贴操作时。
上述AVAsset代表多媒体播放的类,用于对多种类型的媒体轨道进行建模。音频和视频轨道是最常见的轨道类型。
步骤250,对第一线程信息与第二线程信息进行对比处理,得到目标应用对应的线程测试结果。
上述线程测试结果用于表征目标应用中异常线程访问的情况。
通过对比第一线程信息与第二线程信息,可以确定指令语句对应的目标执行线程和实际执行线程是否相符,如果目标执行线程和实际执行线程不是相同的线程或者不是相同类别的线程,就说明对应的指令语句的线程调用异常,从而可以生成上述线程测试结果。
在一个示例中,如图7所示,其示例性示出了一种多线程异常访问检测流程的示意图。在图7示出的流程中,将方法调用链获取插件集成到应用开发程序Xcode中;通过应用开发程序对终端应用对应的多个代码文件进行编译,在编译过程中即可基于上述方法调用链获取插件对多个代码文件中的指令语句进行语法分析,得到方法调用链信息;再将方法调用链信息与待检测多线程场景中操作方法与线程之间的对应信息进行结合对比,来进行多线程异常访问的检测分析,得到测试结果。
在示例性实施例中,如图3所示,上述步骤250的实施过程包括如下步骤(251~254)。
步骤251,对第一线程信息与第二线程信息进行对比处理,得到对比结果。
在一种可能的实施方式中,上述第一线程信息包括实际执行线程对应的线程标识,上述第二线程信息包括目标执行线程对应的线程标识,将上述实际执行线程对应的线程标识与目标执行线程对应的线程标识进行对比,可以得到线程标识对比结果。上述对比结果包括线程标识对比结果。通过线程标识对比,可以确定上述目标执行线程和实际执行线程是否为相同线程,相应的,线程标识对比结果为目标执行线程与实际执行线程相同或不同。
在另一种可能的实施方式中,上述第一线程信息包括实际执行线程对应的线程类别,上述第二线程信息包括目标执行线程对应的线程类别,将上述实际执行线程对应的线程类别与目标执行线程对应的线程类别进行对比,可以得到线程类别对比结果。上述对比结果包括线程类别对比结果。通过线程类别对比,可以确定上述目标执行线程和实际执行线程是否为相同类别线程,相应的,线程标识对比结果为目标执行线程与实际执行线程类别相同或不同。
步骤252,若对比结果指示第一线程信息与第二线程信息不匹配,则根据对比结果,确定异常指令语句。
异常指令语句对应的实际执行线程与异常指令语句对应的目标执行线程不一致。
上述第一线程信息与第二线程信息不匹配的情况包括目标执行线程与实际执行线程不是相同线程,以及目标执行线程与实际执行线程的线程类别不同。
将第一线程信息与第二线程信息不匹配的指令语句确定为上述异常指令语句。
步骤253,获取异常指令语句对应的语句信息。
上述语句信息包括但不限于异常指令语句对应的文本文件的路径信息、异常指令语句在文本文件中的行数信息、异常指令语句对应的操作方法、实例对象以及线程调用信息。
步骤254,基于语句信息,生成线程测试结果。
基于各个异常指令语句对应的语句信,生成上述线程测试结果。
在示例性实施例中,在测试结果页面中显示上述线程测试结果。上述异常指令语句包括第一异常指令语句和第二异常指令语句。上述第一异常指令语句是指目标执行线程为主线程但实际执行线程为工作线程的指令语句,上述第二异常指令语句是指目标执行线程为工作线程但实际执行线程为主线程的指令语句。
可选地,在上述测试结果页面中显示第一异常指令语句的语句信息和第二异常指令语句的语句信息。
在一个示例中,如图8所示,其示例性示出了一种测试结果页面的示意图。在图8所示的测试结果页面80中,示出了需要在主线程操作的异常指令语句1的语句信息,以及需要在工作线程操作的第二异常指令语句2的语句信息。其中,异常指令语句1的语句信息可以包括异常指令语句1对应的异常代码文件路径1、实例1、操作方法1、代码行数1以及异常调用1;异常指令语句2的语句信息可以包括异常代码文件路径2[实例2操作方法2]->代码行数2:[异常调用2]。
下面列举一个具体的线程检测结果示例,以便于本领域技术人员理解,上述线程检测结果示例的内容如下。其中,各条语句信息的含义可按下述语句信息格式确定,即异常代码文件路径[实例操作方法]->代码行数:[异常调用]。
需要在主线程操作:
/Source/App/PersonalLiveBiz/Developer/DataReportTool/PLDevDataReportViewController.m[PL DevDataReportViewControllerexportLogFile:]->line:195[UIViewframe];
/Source/App/PersonalLiveBiz/Room/Plugin/Gift/UI/PLGiftDisplay/PLFreeGiftDisplayViewController.m[PLFreeGiftDisplayViewControlleraddEmitterImage:width:]->line:307[UIView subviews];
/Source/App/PersonalLiveBiz/AnnualCeLebration/RedPacket/PLAnnuaLRedPacketViewController.m[PLAnnuaLRedPacketViewControllerdataUpdated;returnCode;]->line;375[PLPlayerViewmaskImageView];
/Source/App/PersonalLiveBiz/EditPersonalInfo/UI/PLEditSchoolViewController.m[PLEditSchoolViewControllersearchBarTextDidEndEditing:]->line:225[UIButton enabled];
/Source/App/PersonalLiveBiz/Room/Plugin/MemberList/PLMemberListCell.m[PLMemberListCellupdateAvatarFrame:type:]->line:230[YYAnimatedImageViewsetImage:];
/Source/App/PersonalLiveBiz/TinyVideo/TinyVideo/PhotoEdit/Mosaic/FSMosaicViewController.m[FSMosaicViewControllerupdateImage;]->line:415[UIButtonenabled]。
需要在工作线程操作:
/Source/App/PersonalLiveBiz/ShortRecord/Logic/PLDeliverShortVideoMgr.m[PLDeliverShortVideaMgrdeliverShortRecord:ShowProcess:]->line:131[NSDatadataWithContentsOfURL:];
/Source/App/PersonalLiveBiz/Room/Plugin/OnlineDating/Logic/Lottie0pti/0DLottieUnzipper.m[ODLottieUnzipperunZipFile:toPath:]->line:77[MiniZipArchivenew];
/Source/App/PersonalLiveBiz/ShortRecord/Logic/PLDeliverShortVideoMgr.m[PLDeliverShortVideoMgrinternalDeliverDoodle:]->line;797[NSDatadataWithContents0fURL;];
/Source/Kernel/QMX/QMX/Effects/GPUImageAudioSampLeDataProvider.m[GPUImageAudioSampleDataProviderreadAudioSamplesFromAsset:startTime:duration:]->line:49[AVAsset duration];
/Source/App/Controls/QUI/UI/Cell/QUITableViewCell.m[QUITableViewCellgetImaqeFromURL;]->line:196[NSData dataWithContentsOfURL:];
/Source/App/PersonalLiveBiz/TinyVideo/VideoPublish/PLVideoPublish.m[PLVideoPublish getFeedId:]->line:95[NSData dataWithContents0furl:]。
通过显示上述异常指令语句的语句信息,能够帮助开发者快速解决线程异常访问问题。
综上所述,本申请实施例提供的技术方案,通过获取目标测试场景下各操作方法与各线程之间的对应信息,以及确定目标应用对应的文本文件中的指令语句对应的操作方法,从而可以根据上述对应信息确定出指令语句对应的目标执行线程,再将目标执行线程与确定出的指令语句对应的实际执行线程进行对比,可以得到整个目标应用对应的线程测试结果,从而全面反映目标应用对应的指令语句中异常访问线程的情况,无需动态运行目标应用,仅需对目标应用的指令语句作静态分析即可自动确定出全面的线程测试结果,覆盖多样化的使用场景,降低了线程异常访问测试的复杂度,提高了测试的全面性与准确性,整体上提升了测试效率。
请参考图9,其示出了本申请一个实施例提供的测试方法的流程图四。该方法可应用于计算机设备中,所述计算机设备是指具备数据计算和处理能力的电子设备,如各步骤的执行主体可以是图1所示的应用程序运行环境中的终端10。该方法可以包括以下几个步骤(901~919)。
步骤901,显示目标应用开发程序对应的应用开发页面。
步骤902,响应于应用开发页面接收到针对目标应用的编译操作,获取第一信息。
步骤903,获取目标应用对应的至少一个文本文件。
步骤904,获取至少一个文本文件中的目标文本片段。
步骤905,在目标文本片段包括第一操作方法对应的第一文本段的情况下,确定第一文本段中与第一目标信息关联的指令语句。
步骤906,在目标文本片段包括第二操作方法对应的第二文本段的情况下,确定第二文本段中与第二目标信息关联的指令语句。
对于上述步骤的解释说明可参考上一实施例中的内容,这里不再赘述。
步骤907,基于对象类别继承信息、第一标识信息以及第一参数信息关联的指令语句,以及第二标识信息与第二参数信息关联的指令语句,得到至少一条指令语句。
将对象类别继承信息、第一标识信息以及第一参数信息关联的指令语句,以及第二标识信息与第二参数信息关联的指令语句,从至少一个文本文件中筛选出来,即可得到本申请实施例需要分析的至少一条指令语句。
可选地,基于至少一条指令语句,生成至少一个文本文件对应的目标文件;对目标文件进行解析处理,得到解析结果;根据解析结果,确定至少一条指令语句对应的操作方法和第一线程信息。其中,确定至少一条指令语句对应的操作方法和第一线程信息的过程见后续步骤。
步骤908,获取目标指针。
目标指针用于表征待检测指令语句对应的位置信息。
步骤909,基于目标指针,确定至少一条指令语句中的当前检测语句。
步骤910,获取线程标记信息。
线程标记信息用于表征历史检测语句对应的历史执行线程。
由于本申请实施例是通过静态代码分析确定线程异常访问问题,不会实际执行指令语句,因此需要标记指令语句对应的执行线程。
线程标记信息包括但不限于线程标识和线程类别。
步骤911,基于线程标记信息,确定当前检测语句对应的第一线程信息。
每条指令语句对应的实际执行线程与该指令语句对应的上一执行指令语句相关联,若上一执行指令语句不涉及线程改变操作,则该指令语句的实际执行线程与上一执行指令语句的执行线程相同;若上一执行指令语句涉及线程改变操作,则该指令语句的实际执行线程为执行上一执行指令语句后的目标切换线程。因此,需要获取能够表征历史执行线程标记信息,并基于线程标记信息确定当前检测语句对应的实际执行线程。
步骤912,对当前检测语句进行操作方法识别处理,得到当前检测语句对应的目标操作方法。
在示例性实施例中,对当前检测语句进行字词识别处理,得到字词识别结果。若字词识别结果与目标操作方法对应的目标字段相对应,则可确定当前检测语句对应的操作方法为上述目标操作方法。
步骤913,根据第一信息,确定目标操作方法对应的第二线程信息。
将目标操作方法在第一信息中对应的线程信息确定为上述第二线程信息。
步骤914,对第一线程信息与第二线程信息进行对比处理,得到对比结果。
步骤915,若对比结果指示第一线程信息与第二线程信息不匹配,则将当前检测语句确定为异常指令语句。
步骤916,输出异常指令语句对应的语句信息。
步骤917,判断当前检测语句是否为最后一条指令语句。若是。则执行步骤918;若否,则执行步骤919。
步骤918,基于语句信息,生成线程测试结果。
步骤919,基于目标操作方法,更新目标指针和线程标记信息。并从上述步骤909开始执行。
在示例性实施例中,如图10所示,上述步骤919的实施过程包括如下步骤(9191~9197),图10示出了本申请一个实施例提供的测试方法的流程图五。
步骤9191,判断目标操作方法是否为线程改变操作方法。若是,则从步骤9192开始执行;若否,则执行步骤9197。
判断操作方法是否为线程改变操作方法,需要先知道哪些操作方法调用会改变线程。在示例性实施例中,获取第二信息,第二信息包括至少一种线程改变操作方法对应的属性信息,上述属性信息包括线程改变操作方法对应的类、方法名以及线程类别;根据第二信息,判断目标操作方法是否为线程改变操作方法。具体地,若第二信息中包括目标操作方法,则目标操作方法为线程改变操作方法;若第二信息中不包括目标操作方法,则目标操作方法不为线程改变操作方法。
在一个示例中,如下表2所示,其示出了部分第二信息。
表2
其中,NSThread代表执行线程的抽象类,若想让方法在它自己的执行线程中运行时,可以使用这个类。NSOperation代表与单个任务相关的代码和数据的抽象类。NSNotificationCenter(通知中心)是一种通知分发机制,可以将信息广播给注册的观察者。detachNewThreadWithBlock(使用代码块分离新线程)是使用块分离新线程的方法。detachNewThreadSelector(使用选择器分离新线程):toTarget(目标接收方):withObject(目标信息),是分离一个新线程并使用指定的选择器作为线程入口点的方法。该方法下的选择器Selector是指向目标接收方发送目标信息的选择器;toTarget是在新线程接收目标信息的对象;withObject是传递给目标接收方的参数信息,可能为空。performSelectorInBackground(在后台执行选择器):withObject(目标信息):是指在新的后台线程上调用接收方的方法。该方法下的选择器是认明方法调用的选择器;该方法下的目标信息可以是调用时传递给方法的自变量参数。如果方法不带参数,如果不带参数则目标信息为空。performSelectorOnMainThread(在主线程上执行选择器):withObject(目标信息):waitUntilDone(等待完成):modes(模式):是指使用指定模式在主线程上调用接收方的方法。performSelectorOnMainThread(在主线程上执行选择器):withObject(目标信息):waitUntilDone(等待完成):是指使用默认模式在主线程上调用接收方的方法。blockOperationWithBlock(代码块操作):是指创建并返回一个对象并将指定的块添加到它的方法。initWithTarget(初始化目标):selector(选择器):object(对象):是指返回NSThread使用给定参数初始化的对象。dispatch_async(异步调度),是指提交一个代码块以在调度队列上异步执行并立即返回的方法。dispatch_sync(同步调度),是指提交一个代码块到指定的调度队列以同步执行的方法。AVPlayerltemDidPlayToEndTimeNotification(播放器项目播放结束通知),是指当播放器项目播放到其结束时间时系统发布通知的方法。
步骤9192,确定目标操作方法对应的改变后线程信息。
在目标操作方法为线程改变操作方法的情况下,确定目标操作方法对应的改变后线程信息。
指令语句调用的线程改变操作方法后,会改变下一指令语句的执行线程,线程改变操作方法改变的线程往往是与线程改变操作方法对应的,因此可根据目标操作方法,确定改变后的线程,上述改变后线程信息为改变后的线程信息。
步骤9193,基于改变后线程信息,更新线程标记信息。
可选地,将线程标记信息更新为上述改变后线程信息,以确定下一检测语句对应的实际执行线程。
步骤9194,获取目标操作方法对应的参数信息。
上述参数信息用于确定使用目标操作方法进行消息传递的消息接收方,消息接收方对应的指令语句在当前检测语句执行之后执行。
步骤9195,基于参数信息,确定当前检测语句对应的下一检测语句。
在一种可能的实施方式中,如图11所示,上述步骤9195的实施过程包括如下步骤(9195a~9195b),图11示出了本申请一个实施例提供的测试方法的流程图六。
步骤9195a,在参数信息包括语句块参数信息的情况下,确定语句块参数信息对应的指令语句块。
指令语句块是指执行目标操作的指令语句集合。指令语句块即上述实施例中提到的代码块。
若参数信息包括语句块参数信息,说明当前检测语句对应的下一检测语句在指令语句块对应的指令语句集合中,因此根据语句块参数信息确定当前检测语句对应的指令语句块,
步骤9195b,在指令语句块中确定下一检测语句。
在示例性实施例中,若首次调用该指令语句块,可将指令语句块中首个指令语句确定为下一检测语句。
在另一种可能的实施方式中,如图11所示,上述步骤9195的实施过程包括如下步骤(9195c~9195e)。
步骤9195c,在参数信息包括选择器参数信息的情况下,确定目标操作方法对应的第一对象类别,以及选择器参数信息对应的第二对象类别。
上述目标操作方法是当前检测语句调用的操作方法,目标操作方法对应的第一对象类别也是当前检测语句对应的对象类别;上述选择器参数信息指示的下一检测语句也会调用操作方法,因此上述选择器参数信息对应的第二对象类别,也是下一检测语句对应的第二对象类别。
在示例性实施例中,各个对象类别对应的指令语句分别在不同的文本文件中,因此,在发生线程改变的情况下,需要判断当前检测语句与下一检测语句对应的对象类别,从而确定下一检测语句。
步骤9195d,若第一对象类别与第二对象类别相匹配,则将选择器参数信息在当前检测语句对应的文本文件中对应的指令语句,确定为下一检测语句。
第一对象类别与第二对象类别相匹配的情况包括第一对象类别与第二对象类别相同。若第一对象类别与第二对象类别相同,则可说明当前检测语句与下一检测语句均对应同一对象类别,无需从其他文件中查找下一检测语句。
在示例性实施例中,对当前检测语句对应的文本文件对应的第一JSON文件进行解析,确定选择器参数信息在当前检测语句对应的文本文件中对应的指令语句,并将其确定为下一检测语句。
步骤9195e,若第一对象类别与第二对象类别不匹配,则将选择器参数信息在第二对象类别对应的文本文件中对应的指令语句,确定为下一检测语句。
第一对象类别与第二对象类别不匹配的情况包括第一对象类别与第二对象类别不同。若第一对象类别与第二对象类别不同,则可说明当前检测语句与下一检测语句对应于不同的对象类别,需要从其他文件中查找下一检测语句。
在示例性实施例中,获取第二对象类别对应的文本文件对应的第二JSON文件;对第二JSON文件进行解析,确定选择器参数信息在第二对象类别对应的文本文件中对应的指令语句,并将其确定为下一检测语句。
步骤9196,将目标指针对应的位置信息更新为下一检测语句对应的位置信息。
步骤9197,保持线程标记信息不变,并将目标指针对应的位置信息更新为当前检测语句在至少一条指令语句中对应的下一指令语句的位置信息。
在目标操作方法不为线程改变操作方法的情况下,保持线程标记信息不变,并将目标指针对应的位置信息更新为当前检测语句在至少一条指令语句中对应的下一指令语句的位置信息。
在一个示例中,如图12所示,其示例性示出了一种异常线程访问的检测流程示意图。遍历各个类中的操作方法,遍历到任一操作方法后,判断该操作方法是否检测过。若是,则不处理;若否,则遍历操作方法对应的文本段中的各个语句节点,遍历到任一语句节点后,判断该语句对应的操作方法是否符合线程调用。若不符合,则发出该语句为异常线程调用语句的警告;若符合,判断该语句对应的操作方法是否具备改变线程能力。若不具备,则更新语句节点并按流程继续检测;若具备,则标记线程类型,并判断该语句对应的操作方法关联的参数是否存在选择器参数(selector)或代码块参数(block)。若存在block,则遍历对应代码块节点,并从判断操作方法是否符合线程调用的步骤开始执行;若存在selector,则判断selector指向的操作方法是否为本类方法,以查看是否需要跨类遍历方法。上述本类方法是指属于当前遍历的类的操作方法。若是,在本类中改变遍历顺序到selector指向的操作方法并从上述判断该操作方法是否检测过的步骤开始执行;若否,则获取其他类对应的JSON文件,并对其他类对应的JSON文件进行分析,以使遍历顺序改变到selector指向的其他类操作方法,并从上述判断该操作方法是否检测过的步骤开始执行。如此循环,直到遍历完所有的类即可,整个循环检测过程结束后即可输出完整的测试结果,找出所有涉及异常线程访问的指令语句。
下面是本申请实施例示出的一段使用Objective-C语言编写的代码,其中以注释的形式标注出了存在异常线程访问情况的指令语句,代码内容如下:
上述代码中,第37行的指令语句与第52行的指令语句均不符合线程调用,因此会在最后的测试结果中显示上述第37行的指令语句与第52行的指令语句为异常指令语句,并且指出第37行的指令语句与第52行的指令语句需要在主线程上执行。
综上所述,本申请实施例提供的技术方案,通过在编译目标应用时进行静态代码分析,从而获取文本文件中涉及方法调用的目标指令语句,并遍历目标指令语句调用的操作方法,以确定目标指令语句之间的方法调用关系以及涉及的线程切换操作,从而标记历史执行线程信息,以实现在不运行代码的情况下根据历史执行线程信息确定目标指令语句对应的实际执行线程,并将实际执行线程与目标执行线程进行对比,从而确定出线程访问异常的指令语句,并根据异常指令语句的语句信息生成测试结果,从而全面反映目标应用对应的指令语句中异常访问线程的情况,无需动态运行目标应用,仅需对目标应用的指令语句作静态分析即可自动确定出全面的线程测试结果,覆盖多样化的使用场景,降低了线程异常访问测试的复杂度,提高了测试的全面性与准确性,整体上提升了测试效率。
下述为本申请装置实施例,可用于执行本申请方法实施例。对于本申请装置实施例中未披露的细节,请参照本申请方法实施例。
请参考图13,其示出了本申请一个实施例提供的测试装置的框图。该装置具有实现上述测试方法的功能,所述功能可以由硬件实现,也可以由硬件执行相应的软件实现。该装置可以是计算机设备,也可以设置在计算机设备中。该装置1300可以包括:第一信息获取模块1310、文本文件获取模块1320、执行线程确定模块1330、目标线程确定模块1340、测试结果生成模块1350。
第一信息获取模块1310,用于获取第一信息,所述第一信息用于表征目标测试场景关联的至少一种操作方法与至少两个线程之间的对应关系,所述至少两个线程是目标应用对应的线程;
文本文件获取模块1320,用于获取所述目标应用对应的至少一个文本文件,所述至少一个文本文件包括至少一条指令语句;
执行线程确定模块1330,用于确定所述至少一条指令语句对应的操作方法和第一线程信息,所述第一线程信息用于表征所述操作方法对应的实际执行线程;
目标线程确定模块1340,用于根据所述第一信息,确定所述操作方法对应的第二线程信息,所述第二线程信息用于表征所述操作方法在所述目标测试场景下对应的目标执行线程;
测试结果生成模块1350,用于对所述第一线程信息与所述第二线程信息进行对比处理,得到所述目标应用对应的线程测试结果。
在示例性实施例中,所述测试结果生成模块1350,包括:线程对比单元、异常语句确定单元、语句信息获取单元、测试结果生成单元。
线程对比单元,用于对所述第一线程信息与所述第二线程信息进行对比处理,得到对比结果。
异常语句确定单元,用于若所述对比结果指示所述第一线程信息与所述第二线程信息不匹配,则根据所述对比结果,确定异常指令语句,所述异常指令语句对应的实际执行线程与所述异常指令语句对应的目标执行线程不一致。
语句信息获取单元,用于获取所述异常指令语句对应的语句信息。
测试结果生成单元,用于基于所述语句信息,生成所述线程测试结果。
在示例性实施例中,所述执行线程确定模块1330,包括:指针获取单元、检测语句确定单元、线程标记获取单元、执行线程确定单元、操作方法识别单元、信息更新单元。
指针获取单元,用于获取目标指针,所述目标指针用于表征待检测指令语句对应的位置信息。
检测语句确定单元,用于基于所述目标指针,确定所述至少一条指令语句中的当前检测语句。
线程标记获取单元,用于获取线程标记信息,所述线程标记信息用于表征历史检测语句对应的历史执行线程。
执行线程确定单元,用于基于所述线程标记信息,确定所述当前检测语句对应的第一线程信息。
操作方法识别单元,用于对所述当前检测语句进行操作方法识别处理,得到所述当前检测语句对应的目标操作方法。
信息更新单元,用于基于所述目标操作方法,更新所述目标指针和所述线程标记信息,并从所述基于所述目标指针,确定所述至少一条指令语句中的当前检测语句的步骤开始执行。
在示例性实施例中,所述信息更新单元,包括:线程改变确定子单元、线程标记更新子单元、方法参数获取子单元、检测语句确定子单元、指针更新子单元。
线程改变确定子单元,用于在所述目标操作方法为线程改变操作方法的情况下,确定所述目标操作方法对应的改变后线程信息。
线程标记更新子单元,用于基于所述改变后线程信息,更新所述线程标记信息。
方法参数获取子单元,用于获取所述目标操作方法对应的参数信息。
检测语句确定子单元,用于基于所述参数信息,确定所述当前检测语句对应的下一检测语句。
指针更新子单元,用于将所述目标指针对应的位置信息更新为所述下一检测语句对应的位置信息。
在示例性实施例中,所述检测语句确定子单元,具体用于:
在所述参数信息包括语句块参数信息的情况下,确定所述语句块参数信息对应的指令语句块,所述指令语句块是指执行目标操作的指令语句集合;
在所述指令语句块中确定所述下一检测语句。
在示例性实施例中,所述检测语句确定子单元,具体还用于:
在所述参数信息包括选择器参数信息的情况下,确定所述目标操作方法对应的第一对象类别,以及所述选择器参数信息对应的第二对象类别;
若所述第一对象类别与所述第二对象类别相匹配,则将所述选择器参数信息在所述当前检测语句对应的文本文件中对应的指令语句,确定为所述下一检测语句;
若所述第一对象类别与所述第二对象类别不匹配,则将所述选择器参数信息在所述第二对象类别对应的文本文件中对应的指令语句,确定为所述下一检测语句。
在示例性实施例中,所述装置1300还包括:文本片段获取模块、目标语句确定模块。
文本片段获取模块,用于获取所述至少一个文本文件中的目标文本片段,所述目标文本片段用于表征目标对象类别的实现信息。
目标语句确定模块,用于在所述目标文本片段包括预设操作方法对应的目标文本段的情况下,确定所述目标文本段中的目标指令语句;其中,所述预设操作方法是所述目标对象类别对应的操作方法,所述目标文本段用于表征所述预设操作方法的实现信息,所述目标指令语句是表征所述预设操作方法对应的方法调用信息的指令语句,所述至少一条指令语句包括所述目标指令语句。
所述执行线程确定模块1330,还用于确定所述目标指令语句对应的操作方法和第一线程信息。
在示例性实施例中,所述预设操作方法包括第一操作方法,所述第一操作方法是第一编程语言对应的操作方法,所述目标语句确定模块,包括:第一语句确定单元、目标语句确定单元。
第一语句确定单元,用于在所述目标文本片段包括所述第一操作方法对应的第一文本段的情况下,确定所述第一文本段中与第一目标信息关联的指令语句;其中,所述第一文本段用于表征所述第一操作方法的实现信息,所述第一目标信息用于表征所述第一操作方法对应的方法调用关系,所述第一目标信息包括所述第一操作方法对应的对象类别继承信息、第一标识信息以及第一参数信息中至少一种。
目标语句确定单元,用于将所述对象类别继承信息、所述第一标识信息以及所述第一参数信息关联的指令语句确定为所述目标指令语句。
在示例性实施例中,所述预设操作方法包括第二操作方法,所述第二操作方法是第二编程语言对应的操作方法,所述目标语句确定模块,还包括:第二语句确定单元。
第二语句确定单元,用于在所述目标文本片段包括所述第二操作方法对应的第二文本段的情况下,确定所述第二文本段中与第二目标信息关联的指令语句;其中,所述第二文本段用于表征所述第二操作方法的实现信息,所述第二目标信息用于表征所述第二操作方法对应的方法调用关系,所述第二目标信息包括所述第二操作方法对应的第二标识信息与第二参数信息。
所述目标语句确定单元,还用于将所述第二标识信息与所述第二参数信息关联的指令语句确定为所述目标指令语句。
在示例性实施例中,所述装置1300还包括:目标文件生成模块。
目标文件生成模块,用于基于所述目标指令语句,生成所述至少一个文本文件对应的目标文件,所述目标文件用于表征所述至少一条指令语句对应的方法调用链信息。
所述执行线程确定模块1330,包括:目标文件解析单元、方法与线程确定单元。
目标文件解析单元,用于对所述目标文件进行解析处理,得到解析结果。
方法与线程确定单元,用于根据所述解析结果,确定所述目标指令语句对应的操作方法和第一线程信息。
在示例性实施例中,所述装置对应于目标应用开发程序,所述装置1300还包括:页面显示模块、编译执行模块。
页面显示模块,用于显示所述目标应用开发程序对应的应用开发页面。
编译执行模块,用于响应于所述应用开发页面接收到针对所述目标应用的编译操作,从所述获取第一信息的步骤开始执行。
综上所述,本申请实施例提供的技术方案,通过获取目标测试场景下各操作方法与各线程之间的对应信息,以及确定目标应用对应的文本文件中的指令语句对应的操作方法,从而可以根据上述对应信息确定出指令语句对应的目标执行线程,再将目标执行线程与确定出的指令语句对应的实际执行线程进行对比,可以得到整个目标应用对应的线程测试结果,从而全面反映目标应用对应的指令语句中异常访问线程的情况,无需动态运行目标应用,仅需对目标应用的指令语句作静态分析即可自动确定出全面的线程测试结果,覆盖多样化的使用场景,降低了线程异常访问测试的复杂度,提高了测试的全面性与准确性,整体上提升了测试效率。
需要说明的是,上述实施例提供的装置,在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
请参考图14,其示出了本申请一个实施例提供的计算机设备的结构框图。该计算机设备可以是终端。该计算机设备用于实施上述实施例中提供的测试方法。具体来讲:
通常,计算机设备1400包括有:处理器1401和存储器1402。
处理器1401可以包括一个或多个处理核心,比如4核心处理器、8核心处理器等。处理器1401可以采用DSP(Digital Signal Processing,数字信号处理)、FPGA(FieldProgrammable Gate Array,现场可编程门阵列)、PLA(Programmable Logic Array,可编程逻辑阵列)中的至少一种硬件形式来实现。处理器1401也可以包括主处理器和协处理器,主处理器是用于对在唤醒状态下的数据进行处理的处理器,也称CPU(Central ProcessingUnit,中央处理器);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器1401可以在集成有GPU(Graphics Processing Unit,图像处理器),GPU用于负责显示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器1401还可以包括AI(Artificial Intelligence,人工智能)处理器,该AI处理器用于处理有关机器学习的计算操作。
存储器1402可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器1402还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。在一些实施例中,存储器1402中的非暂态的计算机可读存储介质用于存储至少一个指令,至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集,且经配置以由一个或者一个以上处理器执行,以实现上述测试方法。
在一些实施例中,计算机设备1400还可选包括有:外围设备接口1403和至少一个外围设备。处理器1401、存储器1402和外围设备接口1403之间可以通过总线或信号线相连。各个外围设备可以通过总线、信号线或电路板与外围设备接口1403相连。具体地,外围设备包括:射频电路1404、触摸显示屏1405、摄像头组件1406、音频电路1407、定位组件1408和电源1409中的至少一种。
本领域技术人员可以理解,图14中示出的结构并不构成对计算机设备1400的限定,可以包括比图示更多或更少的组件,或者组合某些组件,或者采用不同的组件布置。
在示例性实施例中,还提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或所述指令集在被处理器执行时以实现上述测试方法。
可选地,该计算机可读存储介质可以包括:ROM(Read Only Memory,只读存储器)、RAM(Random Access Memory,随机存取记忆体)、SSD(Solid State Drives,固态硬盘)或光盘等。其中,随机存取记忆体可以包括ReRAM(Resistance Random Access Memory,电阻式随机存取记忆体)和DRAM(Dynamic Random Access Memory,动态随机存取存储器)。
在示例性实施例中,还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述测试方法。
应当理解的是,在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。另外,本文中描述的步骤编号,仅示例性示出了步骤间的一种可能的执行先后顺序,在一些其它实施例中,上述步骤也可以不按照编号顺序来执行,如两个不同编号的步骤同时执行,或者两个不同编号的步骤按照与图示相反的顺序执行,本申请实施例对此不作限定。
另外,在本申请的具体实施方式中,涉及到用户信息等相关的数据,当本申请以上实施例运用到具体产品或技术中时,需要获得用户许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
以上所述仅为本申请的示例性实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

Claims (15)

1.一种测试方法,其特征在于,所述方法包括:
获取第一信息,所述第一信息用于表征目标测试场景关联的至少一种操作方法与至少两个线程之间的对应关系,所述至少两个线程是目标应用对应的线程;
获取所述目标应用对应的至少一个文本文件,所述至少一个文本文件包括至少一条指令语句;
确定所述至少一条指令语句对应的操作方法和第一线程信息,所述第一线程信息用于表征所述操作方法对应的实际执行线程;
根据所述第一信息,确定所述操作方法对应的第二线程信息,所述第二线程信息用于表征所述操作方法在所述目标测试场景下对应的目标执行线程;
对所述第一线程信息与所述第二线程信息进行对比处理,得到所述目标应用对应的线程测试结果。
2.根据权利要求1所述的方法,其特征在于,所述对所述第一线程信息与所述第二线程信息进行对比处理,得到所述目标应用对应的线程测试结果,包括:
对所述第一线程信息与所述第二线程信息进行对比处理,得到对比结果;
若所述对比结果指示所述第一线程信息与所述第二线程信息不匹配,则根据所述对比结果,确定异常指令语句,所述异常指令语句对应的实际执行线程与所述异常指令语句对应的目标执行线程不一致;
获取所述异常指令语句对应的语句信息;
基于所述语句信息,生成所述线程测试结果。
3.根据权利要求1或2所述的方法,其特征在于,所述确定所述至少一条指令语句对应的操作方法和第一线程信息,包括:
获取目标指针,所述目标指针用于表征待检测指令语句对应的位置信息;
基于所述目标指针,确定所述至少一条指令语句中的当前检测语句;
获取线程标记信息,所述线程标记信息用于表征历史检测语句对应的历史执行线程;
基于所述线程标记信息,确定所述当前检测语句对应的第一线程信息;
对所述当前检测语句进行操作方法识别处理,得到所述当前检测语句对应的目标操作方法;
基于所述目标操作方法,更新所述目标指针和所述线程标记信息,并从所述基于所述目标指针,确定所述至少一条指令语句中的当前检测语句的步骤开始执行。
4.根据权利要求3所述的方法,其特征在于,所述基于所述目标操作方法,更新所述目标指针和所述线程标记信息,包括:
在所述目标操作方法为线程改变操作方法的情况下,确定所述目标操作方法对应的改变后线程信息;
基于所述改变后线程信息,更新所述线程标记信息;
获取所述目标操作方法对应的参数信息;
基于所述参数信息,确定所述当前检测语句对应的下一检测语句;
将所述目标指针对应的位置信息更新为所述下一检测语句对应的位置信息。
5.根据权利要求4所述的方法,其特征在于,所述基于所述参数信息,确定所述当前检测语句对应的下一检测语句,包括:
在所述参数信息包括语句块参数信息的情况下,确定所述语句块参数信息对应的指令语句块,所述指令语句块是指执行目标操作的指令语句集合;
在所述指令语句块中确定所述下一检测语句。
6.根据权利要求4所述的方法,其特征在于,所述基于所述参数信息,确定所述当前检测语句对应的下一检测语句,还包括:
在所述参数信息包括选择器参数信息的情况下,确定所述目标操作方法对应的第一对象类别,以及所述选择器参数信息对应的第二对象类别;
若所述第一对象类别与所述第二对象类别相匹配,则将所述选择器参数信息在所述当前检测语句对应的文本文件中对应的指令语句,确定为所述下一检测语句;
若所述第一对象类别与所述第二对象类别不匹配,则将所述选择器参数信息在所述第二对象类别对应的文本文件中对应的指令语句,确定为所述下一检测语句。
7.根据权利要求1所述的方法,其特征在于,所述方法还包括:
获取所述至少一个文本文件中的目标文本片段,所述目标文本片段用于表征目标对象类别的实现信息;
在所述目标文本片段包括预设操作方法对应的目标文本段的情况下,确定所述目标文本段中的目标指令语句;其中,所述预设操作方法是所述目标对象类别对应的操作方法,所述目标文本段用于表征所述预设操作方法的实现信息,所述目标指令语句是表征所述预设操作方法对应的方法调用信息的指令语句,所述至少一条指令语句包括所述目标指令语句;
所述确定所述至少一条指令语句对应的操作方法和第一线程信息,包括:
确定所述目标指令语句对应的操作方法和第一线程信息。
8.根据权利要求7所述的方法,其特征在于,所述预设操作方法包括第一操作方法,所述第一操作方法是第一编程语言对应的操作方法,所述在所述目标文本片段包括预设操作方法对应的目标文本段的情况下,确定所述目标文本段中的目标指令语句,包括:
在所述目标文本片段包括所述第一操作方法对应的第一文本段的情况下,确定所述第一文本段中与第一目标信息关联的指令语句;其中,所述第一文本段用于表征所述第一操作方法的实现信息,所述第一目标信息用于表征所述第一操作方法对应的方法调用关系,所述第一目标信息包括所述第一操作方法对应的对象类别继承信息、第一标识信息以及第一参数信息中至少一种;
将所述对象类别继承信息、所述第一标识信息以及所述第一参数信息关联的指令语句确定为所述目标指令语句。
9.根据权利要求7所述的方法,其特征在于,所述预设操作方法包括第二操作方法,所述第二操作方法是第二编程语言对应的操作方法,所述在所述目标文本片段包括预设操作方法对应的目标文本段的情况下,确定所述目标文本段中的目标指令语句,包括:
在所述目标文本片段包括所述第二操作方法对应的第二文本段的情况下,确定所述第二文本段中与第二目标信息关联的指令语句;其中,所述第二文本段用于表征所述第二操作方法的实现信息,所述第二目标信息用于表征所述第二操作方法对应的方法调用关系,所述第二目标信息包括所述第二操作方法对应的第二标识信息与第二参数信息;
将所述第二标识信息与所述第二参数信息关联的指令语句确定为所述目标指令语句。
10.根据权利要求7至9任一项所述的方法,其特征在于,所述方法还包括:
基于所述目标指令语句,生成所述至少一个文本文件对应的目标文件,所述目标文件用于表征所述至少一条指令语句对应的方法调用链信息;
所述确定所述目标指令语句对应的操作方法和第一线程信息,包括:
对所述目标文件进行解析处理,得到解析结果;
根据所述解析结果,确定所述目标指令语句对应的操作方法和第一线程信息。
11.根据权利要求1所述的方法,其特征在于,所述方法应用于目标应用开发程序中,所述方法还包括:
显示所述目标应用开发程序对应的应用开发页面;
响应于所述应用开发页面接收到针对所述目标应用的编译操作,从所述获取第一信息的步骤开始执行。
12.一种测试装置,其特征在于,所述装置包括:
第一信息获取模块,用于获取第一信息,所述第一信息用于表征目标测试场景关联的至少一种操作方法与至少两个线程之间的对应关系,所述至少两个线程是目标应用对应的线程;
文本文件获取模块,用于获取所述目标应用对应的至少一个文本文件,所述至少一个文本文件包括至少一条指令语句;
执行线程确定模块,用于确定所述至少一条指令语句对应的操作方法和第一线程信息,所述第一线程信息用于表征所述操作方法对应的实际执行线程;
目标线程确定模块,用于根据所述第一信息,确定所述操作方法对应的第二线程信息,所述第二线程信息用于表征所述操作方法在所述目标测试场景下对应的目标执行线程;
测试结果生成模块,用于对所述第一线程信息与所述第二线程信息进行对比处理,得到所述目标应用对应的线程测试结果。
13.一种计算机设备,其特征在于,所述计算机设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如权利要求1至11任一项所述的测试方法。
14.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1至11任一项所述的测试方法。
15.一种计算机程序产品,其特征在于,所述计算机程序产品包括计算机指令,所述计算机指令存储在计算机可读存储介质中,计算机设备的处理器从计算机可读存储介质读取所述计算机指令,所述处理器执行所述计算机指令,使得所述计算机设备执行以实现如权利要求1至11任一项所述的测试方法。
CN202210078880.9A 2022-01-24 2022-01-24 测试方法、装置、设备、存储介质及产品 Pending CN116521510A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210078880.9A CN116521510A (zh) 2022-01-24 2022-01-24 测试方法、装置、设备、存储介质及产品

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210078880.9A CN116521510A (zh) 2022-01-24 2022-01-24 测试方法、装置、设备、存储介质及产品

Publications (1)

Publication Number Publication Date
CN116521510A true CN116521510A (zh) 2023-08-01

Family

ID=87406822

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210078880.9A Pending CN116521510A (zh) 2022-01-24 2022-01-24 测试方法、装置、设备、存储介质及产品

Country Status (1)

Country Link
CN (1) CN116521510A (zh)

Similar Documents

Publication Publication Date Title
CN106980504B (zh) 一种应用程序开发方法及其工具、设备
CN111736840A (zh) 小程序应用的编译方法、运行方法、存储介质及电子设备
CN110764748B (zh) 代码调用方法、装置、终端及存储介质
CN110941655B (zh) 一种数据格式转换方法及装置
CN114691188B (zh) 兼容性评估方法、装置、设备及存储介质
CN110955409B (zh) 在云平台上创建资源的方法和装置
CN108170430B (zh) 一种界面展示的方法及系统
CN114238948A (zh) 一种应用程序检测方法、装置、电子设备及存储介质
CN112988175A (zh) 跨平台应用安装包的生成方法、装置、介质及电子设备
CN113901083A (zh) 基于多解析器的异构数据源操作资源解析定位方法和设备
CN113778897A (zh) 接口的自动测试方法、装置、设备及存储介质
CN111240772A (zh) 一种基于区块链的数据处理方法、装置及存储介质
CN110928548A (zh) 一种数据处理方法以及设备
CN110888972A (zh) 一种基于Spark Streaming的敏感内容识别方法及装置
CN113987337A (zh) 基于组件化动态编排的搜索方法、系统、设备及存储介质
CN110765003B (zh) 代码检测方法、装置以及设备、存储介质
CN116521510A (zh) 测试方法、装置、设备、存储介质及产品
CN111488286A (zh) 一种Android模块独立开发的方法及装置
CN116414689A (zh) 一种基于反射机制的接口参数校验方法及系统
CN116257673A (zh) 基于ElasticSearch的数据查询方法、装置、设备及存储介质
CN115858556A (zh) 一种数据处理方法、装置、存储介质及电子设备
CN115591243A (zh) 渲染通道的性能检测方法、装置、电子设备及存储介质
CN114546410A (zh) 一种基于设计模式的代码优化方法及相关设备
CN113961279A (zh) 页面渲染方法、装置、服务器和存储介质
CN110688430A (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