Android四大组件及变异测试

Posted Kiefer_lin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android四大组件及变异测试相关的知识,希望对你有一定的参考价值。

应用组件

应用组件是 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)

当然变异测试也有一定的限制条件,一般有两个原则或假设

  1. The Competent Programmer
    假设源程序接近正确,只存在小的语法错误。
  2. The Coupling Effect
    假设可以检测简单故障的测试用例也能够检测大多数更复杂的故障

变异测试的过程

  1. 将测试集运行源程序,并更改出现的错误。
  2. 向源程序注入变异算子。
  3. 再用测试集运行已注入变异算子的程序。
  4. 比较1和3步骤的结果,如果结果不同则表明变异算子被杀死了,并且说明测试集可以检测出故障的注入;如果结果相同则说明测试集不能检测并杀死故障。
  5. 对于等价变异的故障注入,应该将其丢弃。

这里解释一下什么是等价变异?

等价变异就是对源程序的修改没有改变源程序原本的意思。举个小例子就很好理解了。

源程序如下:

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之间进行接收或发送数据。主要有以下两种变异算子:

  1. Intent Pacload Replacement (IPR)
    将Intent中发送的数据更改为默认值,以验证Intent对象传递的值是否正确。

  2. Intent Target Replacement (ITR)
    用来将同一个包中的所有类替换为每个Intent的目标,以验证Intent执行后能否正常启动目标Activity或Service。

Event Handler Mutation Operators

Android是基于事件,它使用事件处理程序来对事件进行响应,主要也有两种变异算子:

  1. OnClick Event Replacement (ECR)
    将程序中的OnClick()更改为其他兼容的处理程序,想要杀死这个变异算子至少需要触发一次OnClick事件。

  2. OnTouch Event Replacement (ETR)
    将程序中的OnTouch()更改为其他兼容的处理程序,想要杀死这个变异算子至少需要触发一次OnTouch事件。

Acticity Lifecycle Mutation Operators

Lifecycle Method Deletion (MDL)
将那些重写了改变生命周期状态的方法删除掉,以验证应用是否处于正确的状态。

XML Mutation Operators

XML在安卓中广泛使用,不仅用于manifest文件中,也用于定义用户界面、定义启动Activity等。主要有以下三种变异算子:

  1. Button Widget Deletion (BWD)
    每次删除程序中的一个Button,想要杀死这个变异算子,需要检查每一个Button是否正确。
  2. EditText Widget Deletion (TWD)
    每次删除程序中的一个EditText,想要杀死这个变异算子,需要检查每一个EditText是否正确。
  3. Activity Permission Deletion (APD)
    每次删除manifest文件中的一个permission,想要杀死这个变异算子,需要去测试 需要该permission的函数 。(检测每一个permission是否有必要声明)

以上是关于Android四大组件及变异测试的主要内容,如果未能解决你的问题,请参考以下文章

Android之四大组件六大布局五大存储

基于全基因组测序数据鉴定结构变异的四大类算法总结

Android 开发必备知识点及面试题汇总(Android+Java+算法+性能优化+四大组件……)

android 怎么刷新UI组件

Android第一行代码--Service(四大组件之一)

Android 四大组件之service与Broadcast