应用组件
应用组件是 Android 应用的基本构建块。每个组件都是一个入口点,系统或用户可通过该入口点进入应用。有些组件会依赖于其他组件。Android主要有以下四大组件。
Activity
Activity就是用户与应用程序互动的界面。Activity总共有6种状态,Created, Started, Resumed, Paused, Stopped, Destroyed。与此同时,有以下7个回调函数使得其状态发生转换。
onCreate()
该方法是在Activity第一次被创建的时候被调用,并且只会调用这一次,之后不会再调用。
调用前后:Created -> Started
onStart()
系统调用该方法时,Activity对用户可见,应用会为 Activity 进入前台并支持互动做准备,所以应用通过此方法来初始化维护界面的代码。
调用前后:Started -> Resumed
onResume()
此时应用将一直处于于用户互动状态,直到某些事件发生,使得焦点离开应用。
调用前后:Resumed -> Paused
onPause()
此状态意味着用户离开了该应用,也就是此Activity不在前台。
状态:Paused
onStop()
Activity不再对用户可见,应用应释放所有不需要的资源以及可能会引发内存泄漏的资源。
状态:Stopped
onDestroy()
系统调用此方法的原因:Activity 即将结束(由于用户彻底关闭 Activity 或由于系统为 Activity 调用 finish()),或者由于配置变更(例如设备旋转或多窗口模式),系统暂时销毁 Activity。
状态:Destroyed
onRestart()
调用前后:Stopped -> Started
Service
不同于Activity,Service没有UI,但是当用户需要让应用长期处于后台运行状态时,Service也可以当做一个入口。
Started service 启动服务,负责告诉系统长期保持应用处于运行状态直到工作完成
Bound service 绑定服务,也就是为另外的进程提供某种API
BroadcastReceiver
Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息。举例来说,Android 系统会在发生各种系统事件时发送广播,例如系统启动或设备开始充电时。
ContentProvider
ContentProvider管理一组共享的应用数据,可以将这些数据存储在文件系统、SQLite 数据库、网络中或者应用可访问的任何其他持久化存储位置。在ContentProvider允许的情况下,其他应用可通过内容提供程序查询或修改数据。
变异测试(Mutation Testing)
变异测试概述
变异测试是一种基于故障的软件测试技术。核心思想是:对程序注入故障,并以此来测试 程序的测试集 能否发现故障,以此评判测试集的质量。
这种测试策略之所以能够成功,是因为程序员往往犯的错误都比较好定义。因此我们就可以用这些错误来代表程序员经常犯下的错误,来评估测试集的质量,这些错误也被成为变异算子(Mutant Operator)。
当然变异测试也有一定的限制条件,一般有两个原则或假设
- The Competent Programmer
假设源程序接近正确,只存在小的语法错误。 - The Coupling Effect
假设可以检测简单故障的测试用例也能够检测大多数更复杂的故障
变异测试的过程
- 将测试集运行源程序,并更改出现的错误。
- 向源程序注入变异算子。
- 再用测试集运行已注入变异算子的程序。
- 比较1和3步骤的结果,如果结果不同则表明变异算子被杀死了,并且说明测试集可以检测出故障的注入;如果结果相同则说明测试集不能检测并杀死故障。
- 对于等价变异的故障注入,应该将其丢弃。
这里解释一下什么是等价变异?
等价变异就是对源程序的修改没有改变源程序原本的意思。举个小例子就很好理解了。
源程序如下:
int t = 3;
while(true) {
t --;
if(t == 0)
break;
}
如果将while循环中的跳出条件 t == 0 ,改为 t <= 0,源程序还是会在 t == 0的时候跳出循环,所以这样的修改并没有改变源程序原本的意思。
这个过程之后便可以分析一下测试集的质量。 对于每一个测试集的质量都可以用一个指标,Mutation Adequacy Score(Mutation Score)
Mutation Score(MS) = 杀死的变异算子 / (总的变异算子 - 等价的变异算子)
通过这个公式我们可以清晰知道 MS 的取值范围从0到1,取值越接近1的测试集越好。
Android中的变异算子
主要可以分成以下四类。
Intent Mutation Operators
我们知道Android中,Intent对象经常被用来启动Activity,或者用来Activity之间进行接收或发送数据。主要有以下两种变异算子:
-
Intent Pacload Replacement (IPR) 将Intent中发送的数据更改为默认值,以验证Intent对象传递的值是否正确。 -
Intent Target Replacement (ITR) 用来将同一个包中的所有类替换为每个Intent的目标,以验证Intent执行后能否正常启动目标Activity或Service。
Event Handler Mutation Operators
Android是基于事件,它使用事件处理程序来对事件进行响应,主要也有两种变异算子:
-
OnClick Event Replacement (ECR) 将程序中的OnClick()更改为其他兼容的处理程序,想要杀死这个变异算子至少需要触发一次OnClick事件。 -
OnTouch Event Replacement (ETR) 将程序中的OnTouch()更改为其他兼容的处理程序,想要杀死这个变异算子至少需要触发一次OnTouch事件。
Acticity Lifecycle Mutation Operators
Lifecycle Method Deletion (MDL) 将那些重写了改变生命周期状态的方法删除掉,以验证应用是否处于正确的状态。
XML Mutation Operators
XML在安卓中广泛使用,不仅用于manifest文件中,也用于定义用户界面、定义启动Activity等。主要有以下三种变异算子:
- Button Widget Deletion (BWD)
每次删除程序中的一个Button,想要杀死这个变异算子,需要检查每一个Button是否正确。 - EditText Widget Deletion (TWD)
每次删除程序中的一个EditText,想要杀死这个变异算子,需要检查每一个EditText是否正确。 - Activity Permission Deletion (APD)
每次删除manifest文件中的一个permission,想要杀死这个变异算子,需要去测试 需要该permission的函数 。(检测每一个permission是否有必要声明)
|