CN109710539A - 一种基于字节码操作的安卓软件增强测试方法 - Google Patents

一种基于字节码操作的安卓软件增强测试方法 Download PDF

Info

Publication number
CN109710539A
CN109710539A CN201910044054.0A CN201910044054A CN109710539A CN 109710539 A CN109710539 A CN 109710539A CN 201910044054 A CN201910044054 A CN 201910044054A CN 109710539 A CN109710539 A CN 109710539A
Authority
CN
China
Prior art keywords
android
test
exception
code
software package
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
CN201910044054.0A
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.)
Nanjing University
Original Assignee
Nanjing University
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 Nanjing University filed Critical Nanjing University
Priority to CN201910044054.0A priority Critical patent/CN109710539A/zh
Publication of CN109710539A publication Critical patent/CN109710539A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明基于字节码操作的安卓软件增强测试方法,步骤一、基于安卓开发框架,确定一个安卓开发版本以及一个安卓软件包,扫描并确定其中存在的资源相关的可能抛出异常的方法;步骤二、通过字节码操作技术,将方法与异常的分析和触发代码植入步骤一中的安卓软件包,并生成修改过的软件包以及植入位置的报告;步骤三、针对步骤二中产生的软件包和报告,编写被植入代码控制策略的配置文件;步骤四、确定安卓软件测试框架和测试用例,执行测试,收集测试用例报告以及执行过程中产生的日志,用于下一次测试。本方法基于字节码操作技术,对安卓软件代码中的资源相关方法的异常进行分析和控制,从而对原有测试进行增强。

Description

一种基于字节码操作的安卓软件增强测试方法
技术领域
本发明属于软件工程,测试工程领域。本发明涉及基于字节码操作,对安卓软件包中资源相关调用的异常进行分析和控制,从而增强测试。
背景技术
近年来,信息技术迅速发展,各平台软件的数量和规模日益增长,给人们的生活带来了许多便利,其中作为代表的就是两大手机平台之一的安卓。然而,越来越多的软件和越来越复杂的软件功能使得软件的质量保障受到挑战。安卓应用本身具有多版本、演化快的特点,如何能够有效的保证软件的质量是一个备受关注的问题。安卓是由谷歌公司主导开发的移动操作系统,短短几年时间安卓系统便从安卓1.0版本发展到目前(2018年12月)的安卓9.0版本,其上的应用数已经达到了两百多万种。
谷歌公司开发的安卓平台使用开发语言Java,其特征是面向对象的编程方式与使用异常的错误处理方式。安卓软件是使用事件驱动的方式的进行开发的,其功能代码零散,对于软件质量的保障也造成了一定的阻碍。为了保证软件的质量,软件通常进行一系列的测试,其中比较常见的是单元测试和界面测试的方式。安卓平台虽然与传统Java虚拟机平台不太一样,但仍然支持了传统Java的单元测试框架JUnit,并有许多的界面测试框架,例如Robotium、Espresso、Appium等。然而,即使是众多的测试也不能完全保证软件的正确性。对于Java的异常处理代码,即使能够在大多数情况下通过测试,也有可能在一些极端情况产生诸如应用崩溃等问题,例如极端网络环境下等。这一部分代码的正确性验证是非常困难的,特别是涉及到与外部资源相关操作的异常处理代码时,由于环境的不稳定性,现有的测试并不能很好的反应被测代码的质量。
安卓平台早期的实现与Java虚拟机大致一样,其都是通过将Java代码编译成字节码,然后由虚拟机来解释并执行这些字节码。后来谷歌开发了Android Runtime这个处理程序,通过在安装时直接将字节码翻译成可执行机器码的方式,绕过了虚拟机的低性能。然而这并没有改变安卓软件包,所以安卓软件包仍然是相对容易分析与操作的字节码,字节码操作技术能够很好的得到应用。安卓软件包的字节码与Java虚拟机所使用的字节码相对一致,其中涉及到方法调用相关的指令一共有五个,分别为InvokeStatic、InvokeVirtual、InvokeDynamic、InvokeInterface、InvokeSpecial。其中InvokeStatic用于调用静态方法,InvokeVirtual用于调用实例方法,InvokeDynamic用于调用动态解析的方法,InvokeInterface用于调用接口方法,而InvokeSpecial用于调用实例化方法、私有方法和父类的方法。通过分析其中的四个InvokeStatic、InvokeVirtual、InvokeInterface、InvokeSpecial,可以得知安卓软件包中几乎所有的被调用的方法。
发明内容
发明目的,安卓平台经过几年的迭代演化,平台架构的复杂行不断增加;新型硬件的发展给手机带来了更丰富的交互方式,也增加了安卓应用的复杂度,传统的测试方式对于软件质量的保障能力已经不足。
同时,开源软件的兴起,导致了大批量的弱测试甚至无测试软件的出现,这通常是因为开发开源软件的无法像公司那样有巨大的投入。对于这些软件,如何在各种条件下都保证软件的质量,对于开发者是一个巨大挑战。如何投入尽量少的资源来尽可能保障软件质量是一个普遍关注的问题。
此外,安卓软件开发的主流语言Java,针对它的异常处理代码的正确性验证是很难的。特别是对于资源相关操作的异常处理,很容易在极端外部资源条件下出现问题。
本发明的目的正是面向以上三个问题,基于字节码操作,针对安卓平台的特点提出了一种用于安卓软件测试增强的办法。测试过程中先对安卓软件包进行分析并做一定修改,再通过配置植入代码的方式来更改软件的执行流程,然后执行测试用例来完成测试。
技术方案:为完成上述目的,本发明采用的方案如下:
一种基于字节码操作的安卓软件增强测试方法,其特征是包括如下步骤:
1)基于安卓开发框架,确定一个安卓开发版本以及一个安卓软件包,扫描并确定其中存在的资源相关的可能抛出异常的方法:
11)确定安卓开发的版本和开发环境;
12)确定目标安卓软件包;
13)扫描安卓软件包,确定其中存在被调用的资源相关、可能抛出异常的方法;
14)确定13)中每个方法对应的受检异常与不受检异常;
2)通过字节码操作技术,将方法与异常的分析和触发代码植入1)中的安卓软件包,并生成修改过的软件包以及植入位置的报告:
21)对1)中检查出的所有资源相关的方法和对应的每个异常,植入生成异常实例的代码;
22)在21)植入生成异常实例的代码之后,植入调用分析代码的入口代码;
23)确定并记录下22)对应方法的调用位置和异常的类型;
24)导出23)中的所有记录,生成植入位置的报告;
3)针对步骤二中产生的软件包和报告,编写被植入代码的配置文件:
31)针对2)中产生的植入报告和软件包,确定运行时需要分析和触发的资源相关操作的包、类和方法;
32)确定运行时需要分析和触发的资源相关操作的异常;
33)确定31)和32)中的包、类、方法和异常的包含模式;
34)确定31)和32)中的方法和异常,确定对应执行次数的触发模式;
35)确定被植入代码的最大执行次数;
36)导出上述所有配置,生成被植入代码的配置文件;
4)确定安卓软件测试框架和测试用例,执行测试,收集测试用例报告以及执行过程中产生的日志,用于下一次测试:
41)确定安卓测试平台;
42)使用安卓开发工具,上传3)中生成的配置文件到41)中的安卓测试平台;
43)确定安卓测试框架和测试脚本;
44)执行测试,收集测试结果;
45)使用安卓开发工具,收集测试执行过程日志;
46)分析测试结果和执行过程日志,重复3)和4),进行下一次测试。
有益效果:
通过本发明中的对安卓软件的字节码修改,结合原有的测试用例,可以有效地探索抛出外部资源相关异常对测试的不同影响,从而增强原有测试。
附图说明
图1为本发明实施例的资源相关代码所在的包。
图2为本发明实施例的生成异常实例的流程图。
图3为本发明实施例的被植入代码的执行流程。
图4为本发明实施例的控制策略的接口代码。
图5为本发明实施例的生成的软件包和植入报告。
图6为本发明实施例的被控制策略的配置文件。
具体实施方式
下面结合附图和具体实施例对本发明做进一步详细说明。
本实施例的基于字节码操作的安卓软件增强测试方法,首先测试人员基于安卓开发框架,确定一个安卓开发版本以及一个安卓软件包,扫描并确定其中存在的资源相关的可能抛出异常的方法;通过字节码操作技术,将方法与异常的分析和触发代码植入中的安卓软件包,并生成修改过的软件包以及植入位置的报告;针对之前产生的软件包和报告,编写被植入代码的配置文件;然后确定安卓软件测试框架和测试用例,执行测试,收集测试用例报告以及执行过程中产生的日志,并进行下一次测试。
步骤1)基于安卓开发框架,确定一个安卓开发版本以及一个安卓软件包,扫描并确定其中存在的资源相关的可能抛出异常的方法。
安卓开发人员都知道安卓应用是使用Java进行开发的,安卓软件包的字节码与Java也是对应的。安卓软件包的内部字节码的格式为Dalvik,通过Soot工具可以进行解包,解包后获得软件包中所有的类和方法。遍历所有的类中方法的方法体的字节码,扫描其中存在的InvokeVirtual、InvokeSpecial、InvokeStatic、InvokeInterface字节码指令,得到所有被调用的方法。
图1为列出的所有资源相关的方法所在的包,共13个,在这些包的所有被调用的方法为资源相关的方法。检查方法签名得到所有方法可能抛出的受检异常,检查方法的注释和方法体得到方法可能抛出的不受检异常。
步骤2)通过字节码操作技术,将方法与异常的分析和触发代码植入步骤1)中的安卓软件包,并生成修改过的软件包以及植入位置的报告。
资源相关的操作在运行过程中由于外部资源的影响,有可能抛出相应的异常。在正常测试环境中,无法触发一些极端环境下的异常,所以使用强制抛出异常的方式来实现。异常的控制点设置于方法的调用前,因此方法的所有参数都已经计算完成,而方法并未开始执行。
图2展示了一个异常实例的构造方式,首先输入异常的类型,然后遍历它的所有构造函数。对每一个构造函数,如果能够设置好对应参数的默认值,则调用这个构造函数构造一个异常实例。图2的流程存在失败的可能,但由于绝大多数异常的构造函数非常简单,能够覆盖绝大多数场景。对于参数类型的默认值,分为以下几种情况:1.如果不是基础类型或者是字符串类型,设置为null;2.如果是int/Integer、long/Long类型,设置为0;3.如果是float/Float、float/Double类型,设置为0.0;4.如果是字符串类型,设置为空字符串。异常实例构造这部分代码的位置位于方法的调用前,从而异常实例所存储的堆栈能够反映方法调用的栈情况。
植入异常实例构造代码之后,在这段代码后面植入异常的分析与控制代码。图3为异常分析与控制代码的主要流程,图4为图3中所述控制策略的接口代码。首先将上述构造的异常实例、被调用的方法签名、以及方法调用的位置输入。如果当前控制策略实例未生成,则通过读取测试环境上的配置文件,生成一个控制策略实例,控制策略完全符合配置文件的描述。然后通过一个全局的计数器,获取本次方法调用的计数。将异常实例、方法签名以计数输入到控制策略的takeOver方法,得到此处异常是否应该抛出,同时打印日志。
记录上述植入代码的位置、方法和异常,最终汇总并输出到一个文件,与软件包一起输入,如图5所示,其中报告内容包含方法签名、方法调用者、方法调用位置、方法可能抛出的受检异常以及方法可能抛出的不受检异常。
步骤3)针对步骤二中产生的软件包和报告,编写被植入代码的配置文件:
基于步骤2)中的报告,按照一定规则编写一个控制策略的配置文件。图6所示为被植入代码控制策略的一个配置文件,配置文件的格式为XML格式。其中policy标签的exclude标记有两种值,分别为“true”和“false”,代表其子标签的包含模式是排斥还是包含。policy标签的limit标记需要值为一个整数,如果是负数代表没有控制上限,如果是自然数代表控制则为被植入的异常分析与控制代码的总执行次数。policyentry的kind标记有四种值:1.package,代表包;2.class,代表类;3.method,代表方法;4.exception,代表异常。每个policyentry的都必须有一个value标记,值为对应类型的签名。对于方法和异常类型的policyentry,可以额外有一个pattern标记,其值为0和1组成的字符串,0代表不抛出异常,1代表抛出异常,字符串中0和1的顺序代表执行顺序。当方法和异常类型的policyentry同时有pattern标记时,默认以方法类型的判断。测试人员通过手工编写或者自动生成上述配置文件。
步骤4)确定安卓软件测试框架和测试用例,执行测试,收集测试用例报告以及执行过程中产生的日志,用于下一次测试:
基于步骤2)中的生成的安卓软件包和步骤3)中的配置文件,确定安卓测试环境为真实手机或模拟器,安卓开发版本为手机系统对应的版本。首先使用安卓开发工具adb将文件上传到测试环境的/data/local/tmp目录,用于配置文件读取。
测试人员准备好一套测试脚本与测试执行平台,例如JUnit、Appium等,同时将生成的安卓软件包安装到安卓测试环境上,执行测试脚本,通过测试执行平台获得所有测试的结果,通过安卓开发工具adb的logcat功能收集到被植入代码的日志,分析并进行下一次测试。
以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (4)

1.一种基于字节码操作的安卓软件增强测试方法,其特征是,包括如下步骤:
步骤一、基于安卓开发框架,确定一个安卓开发版本以及一个安卓软件包,扫描并确定其中存在的资源相关的可能抛出异常的方法,具体为:
步骤1.1确定安卓开发的版本和开发环境;
步骤1.2确定目标安卓软件包;
步骤1.3扫描安卓软件包,确定其中存在被调用的资源相关、可能抛出异常的方法;
步骤1.4确定步骤1.3中每个方法对应的受检异常与不受检异常;
步骤二、通过字节码操作技术,将方法与异常的分析和触发代码植入步骤一中的安卓软件包,并生成修改过的软件包以及植入位置的报告,具体为:
步骤2.1对步骤一中检查出的所有资源相关的方法的调用点和对应的每个异常,植入生成异常实例的代码;
步骤2.2在步骤2.1植入生成异常实例的代码之后,植入调用分析代码的入口代码;
步骤2.3确定并记录下步骤2.2对应方法的调用位置和异常的类型;
步骤2.4导出步骤2.3中的所有记录,生成植入位置的报告;
步骤三、针对步骤二中产生的软件包和报告,编写被植入代码的配置文件,具体为:
步骤3.1针对步骤二中产生的植入报告和软件包,确定运行时需要分析和触发的资源相关操作的包、类和方法;
步骤3.2确定运行时需要分析和触发的资源相关操作的异常;
步骤3.3确定步骤3.1和步骤3.2中的包、类、方法和异常的包含模式;
步骤3.4确定步骤3.1和步骤3.2中的方法和异常,确定对应执行次数的触发模式;
步骤3.5)=确定被植入代码的最大执行次数;
步骤3.6导出上述所有配置,生成被植入代码的配置文件;
步骤四、确定安卓软件测试框架和测试用例,执行测试,收集测试用例报告以及执行过程中产生的日志,用于下一次测试,具体为:
步骤4.1确定安卓测试平台;
步骤4.2使用安卓开发工具,上传步骤三中生成的配置文件到步骤4.1中的安卓测试平台;
步骤4.3确定安卓测试框架和测试脚本;
步骤4.4执行测试,收集测试结果;
步骤4.5使用安卓开发工具,收集测试执行过程日志;
步骤4.6分析测试结果和执行过程日志,重复步骤三和步骤四,进行下一次测试。
2.根据权利要求1所述的基于字节码操作的安卓软件增强测试方法,其特征是:首先测试人员确定安卓开发平台和被测试的安卓软件包,确定软件包中被调用的可能抛出异常的资源相关的方法和对应的异常。
3.根据权利要求2所述的基于字节码操作的安卓软件增强测试方法,其特征是:确定方法和异常后,对每一个方法的调用点植入异常生成代码和异常分析和触发的代码,并生成植入报告和软件包。
4.根据权利要求3所述的基于字节码操作的安卓软件增强测试方法,其特征是:针对植入代码后的软件包,通过配置被植入代码可以改变软件的执行流程,能够帮助增强原有的测试。
CN201910044054.0A 2019-01-17 2019-01-17 一种基于字节码操作的安卓软件增强测试方法 Pending CN109710539A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910044054.0A CN109710539A (zh) 2019-01-17 2019-01-17 一种基于字节码操作的安卓软件增强测试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910044054.0A CN109710539A (zh) 2019-01-17 2019-01-17 一种基于字节码操作的安卓软件增强测试方法

Publications (1)

Publication Number Publication Date
CN109710539A true CN109710539A (zh) 2019-05-03

Family

ID=66262304

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910044054.0A Pending CN109710539A (zh) 2019-01-17 2019-01-17 一种基于字节码操作的安卓软件增强测试方法

Country Status (1)

Country Link
CN (1) CN109710539A (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101165658A (zh) * 2006-10-18 2008-04-23 国际商业机器公司 自动生成可再现运行时问题的单元测试用例的方法和系统
CN102819492A (zh) * 2012-08-02 2012-12-12 中山大学 一种基于Android的关键字驱动自动化测试框架
CN105868097A (zh) * 2015-01-22 2016-08-17 阿里巴巴集团控股有限公司 系统测试方法及其装置
CN106294036A (zh) * 2015-05-21 2017-01-04 阿里巴巴集团控股有限公司 一种硬件故障验证方法、装置及客户端
US9652353B2 (en) * 2013-10-15 2017-05-16 Oracle International Corporation Monitoring business transaction failures involving database procedure calls
CN108270832A (zh) * 2016-12-30 2018-07-10 华为软件技术有限公司 一种故障重放方法和装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101165658A (zh) * 2006-10-18 2008-04-23 国际商业机器公司 自动生成可再现运行时问题的单元测试用例的方法和系统
CN102819492A (zh) * 2012-08-02 2012-12-12 中山大学 一种基于Android的关键字驱动自动化测试框架
US9652353B2 (en) * 2013-10-15 2017-05-16 Oracle International Corporation Monitoring business transaction failures involving database procedure calls
CN105868097A (zh) * 2015-01-22 2016-08-17 阿里巴巴集团控股有限公司 系统测试方法及其装置
CN106294036A (zh) * 2015-05-21 2017-01-04 阿里巴巴集团控股有限公司 一种硬件故障验证方法、装置及客户端
CN108270832A (zh) * 2016-12-30 2018-07-10 华为软件技术有限公司 一种故障重放方法和装置

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
刘佳翔等: "《Java程序的静态故障注入工具》", 《内蒙古大学学报》 *
胡坚: "《程序设计基础》", 31 October 2015, 西安交通大学出版社 *
陈锦富等: "软件错误注入测试技术研究", 《THE CHINESE ACADEMY OF SCIENCES》 *

Similar Documents

Publication Publication Date Title
Park et al. Fuzzing javascript engines with aspect-preserving mutation
Memon et al. Automating regression testing for evolving GUI software
Ma et al. Grt: Program-analysis-guided random testing (t)
Memon An event‐flow model of GUI‐based applications for testing
US7243090B2 (en) System and method for specification tracking in a Java compatibility testing environment
Leitner et al. Reconciling manual and automated testing: The autotest experience
Eickelmann et al. An evaluation of software test environment architectures
US20060230320A1 (en) System and method for unit test generation
US7895575B2 (en) Apparatus and method for generating test driver
Kifetew et al. Reproducing field failures for programs with complex grammar-based input
Zhou et al. Towards a practical approach to test aspect-oriented software
Wetzlmaier et al. Hybrid monkey testing: enhancing automated GUI tests with random test generation
Arlt et al. Grey-box gui testing: Efficient generation of event sequences
Setiawan et al. Vulnerability analysis using the interactive application security testing (iast) approach for government x website applications
CN108572895A (zh) 一种Linux下自动检查软硬件配置的稳定性测试方法
Saddler et al. EventFlowSlicer: a tool for generating realistic goal-driven GUI tests.
CN109710539A (zh) 一种基于字节码操作的安卓软件增强测试方法
CN108763079A (zh) 项目流自动化测试和部署的方法及其系统
Yi et al. Exploring the Capability of ChatGPT in Test Generation
Ribeiro et al. Using dynamic analysis of java bytecode for evolutionary object-oriented unit testing
EP1388063B1 (en) System and method for automated assertion acquisition in a java compatibility testing
Hewson et al. Performance regression testing on the java virtual machine using statistical test oracles
Gulabovska et al. Towards more sophisticated static analysis methods of python programs
Uspenskiy A survey and classification of software testing tools
CN113204765B (zh) 一种Hyperledger Fabric链码的测试方法及系统

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
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20190503