Android自动化测试之路——Service

对Service进行测试,首先你得熟悉service的两种生命周期,即onCreate——onBind 和onCreate——onStartCommand。

启动服务的方式分别是startService()和bindService()。

创建测试类需要继承ServiceTestCase这个类,默认初始化会设定mock Context和mock Application,已达到与被测对象的独立,实现单元测试的目的。

需要说明下的是ServiceTestCase.bindService()和Service.bindService()方法的不同之处在于:1、入参不一样,第一个只需要intent就行了。  2、返回值不一样 第一个返回IBinder对象

与ActivityInstrumentationTestcase一样,需要复写setUp与tearDown以达到初始化与事后处理的目的,若要在里面实现,需在super后编写实现语句。

默认情况下,ServiceTestCase会运行testAndroidTestCaseSetupProperly()方法来确定测试类正确地搭建好了Context。

那么对于Service进行测试到底要测什么呢?在SDK中所提到的主要有以下几个方面:

1.调用Context.startService()或者Context.bindService()后要确定onCreate()方法被正确地调用;同样,当调用Context.stopService(), Context.unbindService(), stopSelf()或者 stopSelfResult()等方法时要确定onDestroy()方法被正确地调用。
2.服务能够正确地处理Context.startService()的多次调用,只有第一次调用才会触发Service.onCreate()方法,但是每次都会调用Service.onStartCommand()方法。还要注意的是startService()不会嵌套调用,因此对Context.stopService()或者 Service.stopSelf() ( stopSelf(int)不再此列)的一次调用就应该能够终止服务。
3.测试服务在实现上的逻辑正确性。

下面就以一个示例代码来看:

public class IRemoteServiceTest extends ServiceTestCase {

    private final static String IRemoteService = "com.noah.remote.service.IRemoteService";
    private static Class iRemote;
    private IRemoteCommand iCommand;

    static{
        try {
            iRemote = Class.forName(IRemoteService);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public IRemoteServiceTest() {
        super(iRemote);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void testOnCreate(){
        Intent in = new Intent();
        in.setClassName(getContext(), IRemoteService);

        IBinder binder = bindService(in);
        if(binder.isBinderAlive()){
            iCommand = IRemoteCommand.Stub.asInterface(binder);
        }
    }

}

若没有被测代码的源代码,但知道被测service的包名,可以用上面的方式构造一个测试类。

在testOnCreate测试方法中绑定这个service,最后拿到的iCommand对象就是我们的被测对象,接下来就可以对这个对象里面的api进行调用并检查是否运行正确。

startService的方式一样,在启动service后,通过getService()方法调用拿到这个service对象,再进行接下来的测试。

时间: 2024-10-12 03:08:02

Android自动化测试之路——Service的相关文章

Android自动化测试之路——Notification

在Android4.3以后较为方便,继承NotificationListenerService服务类, 该类继承至Service,是一个服务类,当通知栏有新的Notification消息送达.已有消息清除的时候,会回调通知到该类下面的方法. 所以需要重写它的两个方法,onNotificationPosted与onNotificationRemoved.使用该服务,需要在AndroidMenifest.xml中声明系统权限: 最后,因是系统服务,我们无法通过startService(Intent

Android自动化测试之路——Broadcasting

这里我所理解广播的测试对象主要通过两个渠道获得: 1.通过manifest.xml中静态注册的广播,用于收听系统广播后运行自己业务的这块逻辑: 2.通过动态注册形式的广播,对象是如何发送广播与接收广播后执行的逻辑: 其实,第一点跟这里所谈的广播测试无关系,主要测试对象是接收后的逻辑,需要设计相应的单元测试用例来测试:第二点,测试对象分为两部分,广播是否正确发送?接收后处理逻辑是否正确? 有个细节要说明下: 本人写了个接收器去接收被测应用所发送的广播,但需要注意的是:如果接收广播的应用自从安装就没

Android自动化测试之路——Provider(二)

再来说说第二种测试方式: 前提:需要你的测试工程与被测工程运行在统一进程中,使用InstrumentationTestcase相关的子类. 1.获取被测应用的db列表,通过调用ApplicationContext的databaseList: 2.自定义一个SQLiteOpenHelper的之类作为操作接口,如:public class DatabaseUtil extends SQLiteOpenHelper 3.根据第一步获取的db列表数组,获取被测db,调用DatabaseUtil的构造方法

[转] Android自动化测试之使用java调用monkeyrunner(五)

Android自动化测试之使用java调用monkeyrunner 众所周知,一般情况下我们使用android中的monkeyrunner进行自动化测试时,使用的是python语言来写测试脚本.不过,最近发现可以用java调用monkeyrunner Api,用java语言写测试脚本. 于是,就简单研究了一下.这里做一些总结.希望有对在研究的午饭可以有所用处. 开始时,搜素到一些零碎的教程,说使用java调用monkeyrunner时,需要导入android sdk  tools路径下的lib里

Android自动化测试之环境搭建

Android自动化测试之环境搭建 一.Android-sdk介绍? SDK(Software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合.Android是google公司推出的手机开发平台.Android-sdk就是指Android专属的软件开发工具包. Android-sdk中我们最常用的就是tools和Platformtools文件夹中的工具. 二.工具安装? 1.android-sdk只需

Android自动化测试之UIAutomator(三)---比对测试截图

系列回顾:本系列主要从开发的角度介绍UiAutomator的使用,总共包括三篇: 基础入门: Android自动化测试之UiAutomator(一) 技巧篇:     Android自动化测试之UiAutomator(二)(未完成) 比较工具篇 :Android自动化测试之UiAutomator(三)---比对测试截图 本文是第三篇. 转载请注明出处:http://blog.csdn.net/xzy2046/ 以下是正文: 1.简介: 本文适合所有以图片作为输出的自动化开发工具(不仅限于Andr

Android自动化测试之MonkeyRunner录制和回放脚本

Android自动化测试之MonkeyRunner录制和回放脚本(十一) 分类: 自动化测试 Android自动化 2013-02-22 10:57 7346人阅读 评论(2) 收藏 举报 androidAndroidANDROIDMonkeyRecordermonkeyrunnerMonkeyRunnerMonkeyrunner 对于MonkeyRunner,有些人可能会想,既然是Android自动化测试,离不开测试脚本,那么,我们可不可以录制测试脚本呢,答案是可以的. 我们先看看以下monk

Android自动化测试之Monkeyrunner学习笔记(一)【转】

因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyrunner.Athrun.appium,目前仍在了解学习android测试框架.CTS等.本文主要为前段时间学习总结,由于刚接触不久,故本文难免会有些肤浅,大神请绕走~ [目录] 1.Monkeyrunner简介 2.Monkeyrunner工具特性 3.Monkeyrunner工具同Monkey工具的差别 4.运行Monkeyrunner 5.实例 6.学习笔记

Android自学之路——Service与IntentService

A)MainActivity部分的代码1 package com.example.cms.intentservice; 2 3 import android.content.Intent; 4 import android.support.v7.app.AppCompatActivity; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.Button; 8 9 public class