CN115576854B - 一种安卓自动化单元测试方法 - Google Patents
一种安卓自动化单元测试方法 Download PDFInfo
- Publication number
- CN115576854B CN115576854B CN202211486722.3A CN202211486722A CN115576854B CN 115576854 B CN115576854 B CN 115576854B CN 202211486722 A CN202211486722 A CN 202211486722A CN 115576854 B CN115576854 B CN 115576854B
- Authority
- CN
- China
- Prior art keywords
- test
- android
- test case
- unit
- code
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/427—Parsing
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明涉及软件测试技术领域,公开了一种安卓自动化单元测试方法,通过搜索算法,生成随机且覆盖边界计算、断言以及测试数据多样化的测试用例;并且对于安卓程序,本发明可以通过转换库将原生安卓代码语句转换为可直接运行JVM环境的语句,并基于JVM环境进行安卓单元测试,有效提升单元测试的覆盖率,降低编写安卓单元测试的人力成本。同时本发明避免动态编译,直接构建JUnit测试类对象,此对象动态获取测试语句并执行测试语句,支持将JUnit测试类对象传输到执行器内核直接运行,省略了动态编译的内存和时间开销,有效提高了单元测试效率。
Description
技术领域
本发明属于软件测试技术领域,尤其涉及一种安卓自动化单元测试方法。
背景技术
随着数字化和信息化的不断发展,许多企业或用户个体对软件系统的依赖程度日益攀升,而软件安全及质量问题也越来越受到广大用户的重视。软件测试是保障软件质量的重要手段,但是,随着软件开发规模的增大、复杂程度的日益增加,如何快速寻求软件中的错误也愈加困难。而单元测试是自动测试领域的重要基石部分,其主要目标是验证代码的功能性与异常情况的处理能力,所以单元测试对于软件的稳定具有重大意义。
在现有技术中,安卓开发工作人员在进行安卓程序测试时,存在以下问题:
(1)面对安卓软件中复杂的类和方法,需要大量且多样的测试用例,且都要开发(或测试)人员自己编写,人力成本高,效率低下;
(2)安卓程序若打包到Android虚拟机(或真机)运行、调试、测试,则运行速度慢,导致设备运行时测试效率低下;而Android语句由于依赖Android系统的接口,若直接运行到JVM,由于android.jar文件并没有具体实现,当Android程序运行并出现异常时不会生成具体的报错信息;而且JVM中也并没有安卓原生四大组件及其生命周期的管理等安卓源码的相关实现,在JVM上直接运行安卓代码也会产生报错。因此安卓程序无法实现在JVM上做自动化单元测试;
(3)单元测试生成过程中,需要在单一进程中才可以获取到插桩的反馈信息并提供给适应度函数做分析,但Android程序在Android虚拟机(或真机)运行时会出现多线程问题,导致插桩过程中的桩函数无法正常反馈给主进程。
因此,亟需结合JVM和安卓虚拟技术,以及搜索算法,提出一种安卓自动化单元测试方法来解决上述问题。
发明内容
本发明针对测试用例编码空间的多样化、大规模和复杂性导致测试用例生成需要大量的人力和计算资源的问题,提供了一种安卓自动化单元测试方法,该方法通过安卓语句转换库替换测试语句,修改并拓展测试类行为,实现基于JVM的避免动态编译的测试,可以快速的进行算法迭代优化,生成高覆盖率标准的单元测试用例集。
本发明的技术方案是这样实现的:
一种安卓自动化单元测试方法,包括以下步骤:
T1、解析被测源代码的结构信息;对被测源代码进行覆盖目标插桩,生成用于收集测试信息的回调桩程序,所述测试信息包括测试执行时间、迭代次数、适应度函数值以及各类覆盖率信息等;构造测试用例的适应度评价函数;
T2、创建并使用自定义测试类JunitTestStatements:针对插桩后的被测源代码,初始化生成测试代码;通过转换库对测试代码中的安卓组件进行虚拟化构造,将安卓原生语句转化为可直接运行于JVM环境的代码;虚拟化构造后的测试代码包括多个测试用例,每个测试用例对应一个测试用例方法,多个测试用例组成一个单元测试用例集;以上所说的“测试用例方法”和“对象的方法”中的“方法”指的是面向对象程序设计概念中的方法,在面向对象中,类为现实世界中具有相同属性特征和行为的对象的抽象,对象则是类的一个实例,方法则是描述类的行为的一个程序,类似于C语言中的函数;
T3、创建测试执行器,通过反射机制获取测试代码中的测试用例方法并运行到JVM中进行单元测试;反射机制是Java语言中的一个非常重要的特性,它允许程序再运行时进行自我检查,可以在运行的过程中获取一个对象所属的类、类的成员变量和方法,也允许在运行的时候创建对象并调用对象的方法;
T4、在执行单元测试的过程的同时,利用适应度评价函数计算所述单元测试用例集中各测试用例的适应度结果;根据得到的适应度结果,通过搜索算法对单元测试用例集进行搜索,并生成新一代的单元测试用例集;
T5、根据得到的新一代的单元测试用例集进行单元测试,重复步骤T4,直至单元测试用例集达到预先设定的覆盖率指标或搜索算法迭代次数达到预设值;
T6、结束迭代后,对得到的测试用例集进行最终测试,在进行最终测试的过程中,通过回调桩程序收集测试信息,得到各类覆盖率信息,整合信息并输出最终测试结果报告。
优选的,步骤T1过程如下:
T11、解析被测源代码的文件结构信息和依赖信息,获取生成用例时所需要的参数信息,如初始化参数配置,被测源代码依赖jar等;同时生成被测源代码的控制流图;
T12、设定覆盖率指标和迭代次数,选择用于优化测试用例的搜索算法;根据控制流图确定被测源代码的分支与路径;
T13、根据得到的分支与路径,利用插桩技术对被测源代码进行覆盖目标插桩,生成用于收集测试信息的回调桩程序;在软件测试技术中,会先分析被测源代码在运行逻辑上的分支和路径,对被测源代码中的特定位置进行插桩操作,并根据桩程序收集需要的信息,插桩的位置可以是程序的第一条语句、分支语句的开始、循环语句的开始、下一个入口语句之前的语句、程序的结束语句、分支语句的结束、循环语句的结束等;
T14、根据设定的覆盖率指标构造测试用例的适应度评价函数。
优选的,步骤T12中,所述覆盖率指标为行覆盖率、分支覆盖率和路径覆盖率中的一种或任意组合;
所述搜索算法包括基于搜索的决策方法或者状态遍历方法。
优选的,步骤T2过程如下:
T21、创建并使用自定义测试类JunitTestStatements,针对插桩后的被测源代码,初始化生成测试代码;
T22、所述自定义测试类JunitTestStatements搜索被测代码中的安卓四大组件构造库,通过转换库对测试代码中的安卓组件进行虚拟化构造,将安卓原生语句转化为可直接运行于JVM环境的代码;虚拟化构造后的测试代码包括多个测试用例,每个测试用例对应一个测试用例方法,多个测试用例组成一个单元测试用例集。
对于依赖安卓运行环境的被测源代码,需要通过转换库,则调用Android四大组件的API,对安卓组件对象进行虚拟化构造,加载过程中使用 ASM 修改字节码,将部分方法的实现替换,如new语句等都需要执行等价构造语句替换并在使用完成后进行销毁,将桩程序中的原生安卓代码语句转换为可直接运行于JVM环境的语句,让JVM可以实现对Android原生组件进行生命周期的管理;
对于本方案,需要说明的是,对于安卓程序来说,虽然同样是基于Java开发的应用,但被编译后的代码并不是运行在JVM的。普通的Java类会被JRE通过javac 编译成class文件,再直接由JVM解释执行;而安卓的Java程序也会被编译成class文件,但会由dex工具将class编译成dex文件,再将dex打包成apk文件,最终运行在安卓机或者dvm。这种编译过程上的差异一定程度上也导致了安卓程序运行、测速度的缓慢。当我们测试安卓时,需要依赖Android SDK中的android.jar包,但android.jar包底层没有具体的代码实现,只能运行在Android系统中并在其中得到实现,而JVM中是没有Android源代码的相关实现方法的,并不能直接运行安装程序。目前主流的自动生成单元测试用例方法都只针对纯Java程序,而无法针对Android程序生成单元测试用例。
优选的,步骤T3过程如下:
T31、创建JUnit单元测试类对象Runner,Runner为测试执行器;执行单元测试时,通过注解@RunWith找到所述测试执行器,测试执行器再通过注解@Test找到测试用例方法并通过反射机制调用测试用例方法,再在JVM中执行测试用例方法;
T32、根据单元测试用例集,执行单元测试。
优选的,步骤T4过程如下:
T41、在执行单元测试的过程的同时,利用适应度评价函数计算所述单元测试用例集中各测试用例的适应度结果;并通过回调桩程序收集测试用例的各类覆盖率信息;
T42、根据得到的各类覆盖率信息计算适应度结果,根据适应度结果筛选出进入下一代的测试用例;
T43、在不同测试用例之间设置选择随机交叉点并随机指定一位做变异运算,进行多目标优化搜索,得到新一代的单元测试用例集。
优选的,步骤T6过程如下:
T61、结束迭代后,得到最终的单元测试用例集,并对冗余用例进行精简操作,得到最新的单元测试用例集,所述对冗余测试用例进行精简操作具体为:查找覆盖相同路径或相同分支的测试用例,选择代码行数最少的测试用例作为保留项;
T62、根据得到的最新的单元测试用例集执行最终测试,进行用例正确性判断,若测试执行失败则加入异常抛出块;
T63、通过回调桩程序收集被测源代码的各类覆盖率信息,如行覆盖率、分支覆盖率、路径覆盖率等,并整合被测源代码和测试用例信息,输出最终测试报告。测试用例信息包括测试用例的执行时间、被测源代码生成测试用例的搜索迭代次数,测试用例的适应度函数值等。
与现有技术相比,本发明取得以下有益效果:
(1)本发明提供了一种安卓自动化单元测试方法,通过搜索算法生成高覆盖率且测试数据多样化的测试用例,并且可直接基于JVM的环境进行安卓单元测试执行,能有效提升单元测试的覆盖率以及提高安卓自动化测试的速度,降低编写安卓单元测试的人力成本;
(2)本发明可以避免动态编译,直接构建JUnit测试类对象,此对象动态获取测试语句并执行测试语句,支持将JUnit测试类对象通过反射机制传输到执行器内核直接运行,省略了动态编译的内存和时间开销,有效提高了单元测试效率。
附图说明
图1是本发明实施例中公开的一种安卓自动化单元测试方法的流程图;
图2是本发明实施例中解析待测代码及初始化测试用例的流程图;
图3是本发明实施例中的安卓单元测试执行的原理图;
图4是本发明实施例中测试用例迭代进化的流程图;
图5是本发明实施例中进行最终测试用例优化和测试结果生成的流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1~5所示,本实施例提供了一种安卓自动化单元测试方法,可以通过搜索算法生成高覆盖率且测试数据多样化的测试用例,并且可以直接在JVM的环境下执行安卓单元测试(JVM指Java virtualMachine,即Java虚拟机,是用来执行Java字节码的虚拟计算机。当Java文件只需经过一次编译,就会生成class文件,class文件可以运行在不同平台的机器的JVM上,实现Java语言的跨平台特性。)。此处选取应用程序Calculator作为示例,包括以下步骤:
T1、解析被测源代码的结构信息;对被测源代码进行覆盖目标插桩,生成用于收集测试信息的回调桩程序,所述测试信息包括测试执行时间、迭代次数、适应度函数值以及各类覆盖率信息等;构造测试用例的适应度评价函数;
具体的,如图2所示,步骤T1过程如下:
T11、解析Calculator应用源代码的文件结构信息和依赖信息,获取生成用例时所需要的参数信息,如初始化参数配置,即本示例中的安卓版本为Android10,测试调用组件“com.xxx.TestActivity”等;又比如被测源代码依赖jar,即本示例中依赖junit-4.12.jar,shadows-framework-4.4.jar等jar包;同时生成被测源代码的控制流图;控制流图是一个过程或程序的抽象表现,代表一个程序执行过程中会遍历到的所有路径。
T12、设定覆盖率指标和迭代次数,选择用于优化测试用例的搜索算法;根据控制流图确定被测源代码的分支与路径;
所述搜索算法是利用计算机的性能针对特定目标穷举问题所有解决方案从而求出问题的解的一种方法,包括了一般意义下所有基于搜索的决策方法或者状态遍历方法;搜索算法可以分为盲目搜索算法和启发式搜索算法,而演化算法是启发式搜索算法的一种,包括完整套件算法、多目标优化算法、动态多目标排序算法、DynaMOSA多目标算法等;本实施例中选用的搜索算法为DynaMOSA多目标算法,是演化算法中的一种;
具体的,所述覆盖率指标为行覆盖率、分支覆盖率和路径覆盖率中的一种或任意组合;
T13、根据得到的分支与路径,利用插桩技术对被测源代码进行覆盖目标插桩,生成用于收集测试信息的回调桩程序;在软件测试技术中,会先分析被测源代码在运行逻辑上的分支和路径,对被测源代码中的特定位置进行插桩操作,并根据桩程序收集需要的信息,插桩的位置可以是程序的第一条语句、分支语句的开始、循环语句的开始、下一个入口语句之前的语句、程序的结束语句、分支语句的结束、循环语句的结束等;
T14、根据设定的覆盖率指标构造测试用例的适应度评价函数,适应度函数是在演化算法中,描述个体性能的主要指标,根据适应度函数得到结果的大小,可以对个体进行优胜劣汰。本实施例中的覆盖率指标是测试用例的行覆盖率、分支覆盖率、路径覆盖率的组合,将覆盖率指标作为评价标准并结合适应度函数计算适应值,再通过适应值来选择最优的测试用例。本实施例中,适应度评价函数的计算方法为同一个测试用例的不同覆盖率的加权平均值,各覆盖率的权重比为1:1:1。举个例子,在本实施例中的一个测试用例中,行覆盖率是0.8,分支覆盖率是0.55,路径覆盖率是0.9,则该测试用例的适应值为(0.8*1+0.55*1+0.9*1)/(1+1+1),即0.75。
T2、创建并使用自定义测试类JunitTestStatements:针对插桩后的被测源代码,初始化生成测试代码;通过转换库对测试代码中的安卓组件进行虚拟化构造,将安卓原生语句转化为可直接运行于JVM环境的代码;虚拟化构造后的测试代码包括多个测试用例,每个测试用例对应一个测试用例方法,多个测试用例组成一个单元测试用例集;以上所说的“测试用例方法”和“对象的方法”中的“方法”指的是面向对象程序设计概念中的方法,在面向对象中,类为现实世界中具有相同属性特征和行为的对象的抽象,对象则是类的一个实例,方法则是描述类的行为的一个程序,类似于C语言中的函数;
具体的,如图3所示,步骤T2过程如下:
T21、创建并使用自定义测试类JunitTestStatements,针对插桩后的被测源代码,初始化生成测试代码;测试类JunitTestStatements 基于Robolectric进行再次开发来模拟仿真安卓环境;Robolectric是一个第三方安卓单元测试框架;JunitTestStatements会通过setStatements方法和getStatements方法并结合Robolectric框架及被测源代码(安卓)生成JVM可运行的测试语句,如安卓组件和控件的创建,还有组件和控件的生命周期控制;
T22、所述自定义测试类JunitTestStatements搜索被测代码中的安卓四大组件构造库,通过转换库对测试代码中的安卓组件进行虚拟化构造,将安卓原生语句转化为可直接运行于JVM环境的代码;举个例子,原生的安卓代码为:
public class WKZJActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_activity);
final View button = findViewById(R.id.login);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(WKZJActivity.this,LoginActivity.class));
}
});
}
}
则进行虚拟化构造后的测试代码为:
@RunWith(AndroidTestRunner.class)
public class WKZJActivityTest {
@Test
public void clickingLogin_shouldStartLoginActivity() {
try (ActivityController<WKZJActivity> controller =Robolectric.buildActivity(WKZJActivity.class)) {
controller.setup(); // Moves Activity to RESUMED state
WKZJActivity activity = controller.get();
activity.findViewById(R.id.login).performClick();
Intent expectedIntent = new Intent(activity,LoginActivity.class);
Intent actual = shadowOf(RuntimeEnvironment.application).getNextStartedActivity();
assertEquals(expectedIntent.getComponent(),actual.getComponent());
}
}
}
虚拟化构造后的测试代码包括多个测试用例,每个测试用例对应一个测试用例方法,多个测试用例组成一个单元测试用例集;对于依赖安卓运行环境的被测源代码,需要通过转换库,则调用Android四大组件的API,对安卓组件对象进行虚拟化构造,加载过程中使用 ASM 修改字节码,将部分方法的实现替换,如new语句等都需要执行等价构造语句替换并在使用完成后进行销毁,将桩程序中的原生安卓代码语句转换为可直接运行于JVM环境的语句,让JVM可以实现对Android原生组件进行生命周期的管理;
对于本方案,需要说明的是,对于安卓程序来说,虽然同样是基于Java开发的应用,但被编译后的代码并不是运行在JVM的。普通的Java类会被JRE通过javac 编译成class文件,再直接由JVM解释执行;而安卓的Java程序也会被编译成class文件,但会由dex工具将class编译成dex文件,再将dex打包成apk文件,最终运行在安卓机或者dvm。这种编译过程上的差异一定程度上也导致了安卓程序运行、测速度的缓慢。当我们测试安卓时,需要依赖Android SDK中的android.jar包,但android.jar包底层没有具体的代码实现,只能运行在Android系统中并在其中得到实现,而JVM中是没有Android源代码的相关实现方法的,并不能直接运行安装程序。目前主流的自动生成单元测试用例方法都只针对纯Java程序,而无法针对Android程序生成单元测试用例。
T3、创建测试执行器,通过反射机制获取测试代码中的测试用例方法并运行到JVM中进行单元测试;反射机制是Java语言中的一个非常重要的特性,它允许程序再运行时进行自我检查,可以在运行的过程中获取一个对象所属的类、类的成员变量和方法,也允许在运行的时候创建对象并调用对象的方法;
具体的,步骤T3过程如下:
T31、创建JUnit单元测试类对象Runner,Runner为测试执行器;执行单元测试时,通过注解@RunWith找到所述测试执行器,测试执行器再通过注解@Test找到测试用例方法并通过反射机制调用测试用例方法,再在JVM中执行测试用例方法;测试用例方法代码例子如下所示:
@RunWith(RobolectricTestRunner.class)
public class TestActivity_ESTest {
@Test(timeout = 4000)
public void test0() throws Throwable{
Class<TestActivity> class0 = TestActivity.class;
ActivityController activityController0 =Robolectric.buildActivity((Class) class0);
activityController0.setup();
activityController0.get();
activityController0.pasuse();
activityController0.stop();
activityController0.destroy();
}
@Test(timeout = 4000)
public void test1() throws Throwable{
Class<TestActivity> class0 = TestActivity.class;
ActivityController activityController0 =Robolectric.buildActivity((Class) class0);
activityController0.setup();
TestActivity testActivity0 = (TestActivity)activityController0.get();
View view0 = null;
testActivity0.onClick(view0);
}
}
在执行模块中,测试内核JunitCore会查找并创建对应的测试执行器Runner,找到具有@Test注解的测试用例方法,测试用例中可能包含需要依赖于安卓运行环境的代码片段,预先设置的Runner本身定义了许多安卓方法的替换类,修改并拓展了类行为使得支持生命周期在JVM中模拟执行,用例执行因此不会出现环境异常;
T32、根据单元测试用例集,执行单元测试。
T4、在执行单元测试的过程的同时,利用适应度评价函数计算所述单元测试用例集中各用例的适应度结果;根据得到的适应度结果,通过搜索算法对单元测试用例集进行搜索,并生成新一代的单元测试用例集;
具体的,如图4所示,步骤T4过程如下:
T41、在执行单元测试的过程的同时,利用适应度评价函数计算所述单元测试用例集中各测试用例的适应度结果;并通过回调桩程序收集测试用例的各类覆盖率信息;
T42、根据得到的各类覆盖率信息计算适应度结果,根据适应度结果筛选出进入下一代的测试用例;
T43、在不同测试用例之间设置选择随机交叉点并随机指定一位做变异运算,进行多目标优化搜索,得到新一代的单元测试用例集。
T5、重复步骤T4,直至单元测试用例集达到预先设定的覆盖率要求或搜索算法迭代次数达到预设值;
T6、结束迭代后,对得到的测试用例集进行最终测试,在进行最终测试的过程中,通过回调桩程序收集测试信息,得到各类覆盖率信息,整合信息并输出最终测试结果报告。
具体的,如图5所示,步骤T6过程如下:
T61、结束迭代后,优化得到最终的单元测试用例集,并对冗余用例进行精简操作,得到最新的单元测试用例集,所述对冗余测试用例进行精简操作具体为:查找覆盖相同路径或相同分支的测试用例,选择代码行数最少的测试用例作为保留项;
T62、根据得到的最新的单元测试用例集执行最终测试,进行用例正确性判断,若测试执行失败则加入异常抛出块;
T63、通过回调桩程序收集被测源代码的各类覆盖率信息,如行覆盖率、分支覆盖率、路径覆盖率等,并整合被测源代码和测试用例信息,包括测试用例的执行时间、被测源代码生成测试用例的搜索迭代次数,测试用例的适应度函数值等,输出最终测试报告。
根据上述说明书的揭示和教导,本发明所属领域的技术人员还可以对上述实施方式进行变更和修改。因此,本发明并不局限于上面揭示和描述的具体实施方式,对本发明的一些修改和变更也应当落入本发明的权利要求的保护范围内。此外,尽管本说明书中使用了一些特定的术语,但这些术语只是为了方便说明,并不对本发明构成任何限制。
Claims (6)
1.一种安卓自动化单元测试方法,其特征在于,所述方法包括以下步骤:
T1、解析被测源代码的结构信息;对被测源代码进行覆盖目标插桩,生成用于收集测试信息的回调桩程序;构造测试用例的适应度评价函数;
T2、创建并使用自定义测试类JunitTestStatements:针对插桩后的被测源代码,初始化生成测试代码;通过转换库对测试代码中的安卓组件进行虚拟化构造,将安卓原生语句转化为可直接运行于JVM环境的代码;虚拟化构造后的测试代码包括多个测试用例,每个测试用例对应一个测试用例方法,多个测试用例组成一个单元测试用例集;
T3、创建测试执行器,通过反射机制获取测试代码中的测试用例方法并运行到JVM中进行单元测试;具体步骤为:
T31、创建JUnit单元测试类对象Runner,Runner为测试执行器;执行单元测试时,通过注解@RunWith找到所述测试执行器,测试执行器再通过注解@Test找到测试用例方法并通过反射机制调用测试用例方法,再在JVM中执行测试用例方法;
T32、根据单元测试用例集,执行单元测试;
T4、在执行单元测试的过程的同时,利用适应度评价函数计算所述单元测试用例集中各测试用例的适应度结果;根据得到的适应度结果,通过搜索算法对单元测试用例集进行搜索,并生成新一代的单元测试用例集;
T5、根据得到的新一代的单元测试用例集进行单元测试,重复步骤T4,直至单元测试用例集达到预先设定的覆盖率指标或搜索算法迭代次数达到预设值;
T6、结束迭代后,对得到的测试用例集进行最终测试,在进行最终测试的过程中,通过回调桩程序收集测试信息,得到各类覆盖率信息,整合信息并输出最终测试结果报告。
2.根据权利要求1所述的一种安卓自动化单元测试方法,其特征在于,步骤T1过程如下:
T11、解析被测源代码的文件结构信息和依赖信息,获取生成用例时所需要的参数信息,同时生成被测源代码的控制流图;
T12、设定覆盖率指标和迭代次数,选择用于优化测试用例的搜索算法;根据控制流图确定被测源代码的分支与路径;
T13、根据得到的分支与路径,利用插桩技术对被测源代码进行覆盖目标插桩,生成用于收集测试信息的回调桩程序;
T14、根据设定的覆盖率指标构造测试用例的适应度评价函数。
3.根据权利要求2所述的一种安卓自动化单元测试方法,其特征在于,步骤T12中,所述覆盖率指标为行覆盖率、分支覆盖率和路径覆盖率中的一种或任意组合;
所述搜索算法包括基于搜索的决策方法或者状态遍历方法。
4.根据权利要求1所述的一种安卓自动化单元测试方法,其特征在于,步骤T2过程如下:
T21、创建并使用自定义测试类JunitTestStatements,针对插桩后的被测源代码,初始化生成测试代码;
T22、所述自定义测试类JunitTestStatements搜索被测代码中的安卓四大组件构造库,通过转换库对测试代码中的安卓组件进行虚拟化构造,将安卓原生语句转化为可直接运行于JVM环境的代码;虚拟化构造后的测试代码包括多个测试用例,每个测试用例对应一个测试用例方法,多个测试用例组成一个单元测试用例集。
5.根据权利要求1所述的一种安卓自动化单元测试方法,其特征在于,步骤T4过程如下:
T41、在执行单元测试的过程的同时,利用适应度评价函数计算所述单元测试用例集中各测试用例的适应度结果;并通过回调桩程序收集测试用例的各类覆盖率信息;
T42、根据得到的各类覆盖率信息计算适应度结果,根据适应度结果筛选出进入下一代的测试用例;
T43、在不同测试用例之间设置选择随机交叉点并随机指定一位做变异运算,进行多目标优化搜索,得到新一代的单元测试用例集。
6.根据权利要求1所述的一种安卓自动化单元测试方法,其特征在于,步骤T6过程如下:
T61、结束迭代后,得到最终的单元测试用例集,并对冗余测试用例进行精简操作,得到最新的单元测试用例集,所述对冗余测试用例进行精简操作具体为:查找覆盖相同路径或相同分支的测试用例,选择代码行数最少的测试用例作为保留项;
T62、根据得到的最新的单元测试用例集执行最终测试,进行用例正确性判断,若测试执行失败则加入异常抛出块;
T63、通过回调桩程序收集被测源代码的各类覆盖率信息,并整合被测源代码和测试用例信息,输出最终测试结果报告。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211486722.3A CN115576854B (zh) | 2022-11-25 | 2022-11-25 | 一种安卓自动化单元测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211486722.3A CN115576854B (zh) | 2022-11-25 | 2022-11-25 | 一种安卓自动化单元测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115576854A CN115576854A (zh) | 2023-01-06 |
CN115576854B true CN115576854B (zh) | 2023-03-28 |
Family
ID=84590362
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211486722.3A Active CN115576854B (zh) | 2022-11-25 | 2022-11-25 | 一种安卓自动化单元测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115576854B (zh) |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114090440A (zh) * | 2021-11-21 | 2022-02-25 | 广州链安科技有限公司 | 一种基于安卓操作系统的一体化免源码调试方法 |
CN115098355A (zh) * | 2022-05-13 | 2022-09-23 | 天津大学 | 基于历史数据驱动的jvm测试程序生成方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102103538A (zh) * | 2011-02-22 | 2011-06-22 | 南京航空航天大学 | 一种基于Agent的码垛机器人控制软件测试方法 |
CN108710575B (zh) * | 2018-05-23 | 2020-11-24 | 华南理工大学 | 基于路径覆盖测试用例自动生成的单元测试方法 |
CN114238154B (zh) * | 2022-02-24 | 2022-05-06 | 湖南泛联新安信息科技有限公司 | 一种符号执行方法、单元测试方法、电子设备及存储介质 |
CN114741296A (zh) * | 2022-04-12 | 2022-07-12 | 武汉紫阑信息技术有限公司 | 单元测试方法、装置、电子设备和存储介质 |
-
2022
- 2022-11-25 CN CN202211486722.3A patent/CN115576854B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114090440A (zh) * | 2021-11-21 | 2022-02-25 | 广州链安科技有限公司 | 一种基于安卓操作系统的一体化免源码调试方法 |
CN115098355A (zh) * | 2022-05-13 | 2022-09-23 | 天津大学 | 基于历史数据驱动的jvm测试程序生成方法 |
Also Published As
Publication number | Publication date |
---|---|
CN115576854A (zh) | 2023-01-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10691419B2 (en) | Reconstructing a high level compilable program from an instruction trace | |
US8898647B2 (en) | Method and apparatus for test coverage analysis | |
US9971672B2 (en) | Using emulation to disassociate verification from stimulus in functional test | |
Eceiza et al. | Fuzzing the internet of things: A review on the techniques and challenges for efficient vulnerability discovery in embedded systems | |
US10649887B2 (en) | Co-verification of hardware and software | |
JP6142705B2 (ja) | オブジェクト指向言語のための記号テストドライバの反復生成 | |
Olsthoorn et al. | Syntest-solidity: Automated test case generation and fuzzing for smart contracts | |
Le | Segmented symbolic analysis | |
Jeong et al. | Utopia: Automatic generation of fuzz driver using unit tests | |
US20180217922A1 (en) | Application testing | |
US20220129371A1 (en) | Initialization Sequences for Automatic Software Test Generation | |
Bolis et al. | Model-driven testing for web applications using abstract state machines | |
CN115576854B (zh) | 一种安卓自动化单元测试方法 | |
CN110737590A (zh) | 一种离线调试方法 | |
US11442845B2 (en) | Systems and methods for automatic test generation | |
Wehrmeister et al. | Support for early verification of embedded real-time systems through UML models simulation | |
Zakharov et al. | Compositional environment modelling for verification of GNU C programs | |
Hewson et al. | Performance regression testing on the java virtual machine using statistical test oracles | |
Wehrmeister et al. | Framework to simulate the behavior of embedded real-time systems specified in UML models | |
CN116841886B (zh) | 一种面向配置缺陷的定向模糊测试方法 | |
Sastry et al. | TESTING DISTRIBUTED EMBEDDED SYSTEMS THROUGH INSTRUCTION SET SIMULATORS | |
Westerberg | Proof-producing resolution of indirect jumps in the binary intermediate representation BIR | |
Nasiri et al. | A case study for a novel framework for cloud testing | |
Zhang et al. | ICTDroid: Parameter-Aware Combinatorial Testing for Components of Android Apps | |
Fakhruddin et al. | Hybrid Automated Test Generation Tool (HATG) |
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 |