Service Testing

ServiceTestCase相关

1   Service Testing(服务测试)
Android  系统提供了一个可以独立测试Service并给service提供可注入模拟对象的框架类—ServiceTestCase。
这里所谓的独立就是指被测的Service 可以不依附于它所在的应用。例如我们可以模拟某个Service 的运行环境等。
由于Service 是在后台运行的,所以测试Service不能用instrumentation 框架。这篇文档描述了怎样测试Service。
 
2   Service Design and Testing
当你设计一个Service 的时候, 你就应该考虑你应该怎样验证Service 各种生命周期的状态. onCreate() 和onStartCommand()方法可以启动一个Service ,但是android没有设置一个全局的变量表明他们是否启动成功。因此当我们测试Serivice 的时候(测试Service 是否能够正常被启动),也许我们就需要这样的一个变量。
ServiceTestCase提供了很多方法可以帮助我们更好的测试。例如, getService ()方法返回被测试的Serivce 的引用(文档中是handle, 句柄)。这样我们就可以利用返回的引用去确认被测试Service的各种运行状态。

3   ServiceTestCase
 ServiceTestCase 继承于Junit 框架中的TestCase.该类中包含有测试 应用的许可,控制被测试的应用和Service 等大量方法。同时也提供了模拟的应用和上下文(Context)方便我们可以使Service 对立于系统进行测试。


ServiceTestcase不会初始化测试环境直到你调用ServiceTestCase.startService()或者ServiceTestCase.bindService. 这样的话,你就可以在Service 启动之前可以设置测试环境,创建你需要模拟的对象等等。


需要注意的是ServiceTestCase .bindService() 方法和Service.bindService()方法的参数不同的。ServiceTestCase.bindService() 方法只提供了以个intent对象。返回值方面ServiceTestCase.bindService()方法返回的是一个IBinder对象的子类, 而Service.bindService ()返回的是布尔值。


Service TestCase.setUp()方法在每个测试用例调用之前执行,该方法执行的时候配置测试数据通过复制并获得当前系统提供的Context.  你可以通过getSystemContext()取得系统的当前Context. 如果你重写setUp()方法的话,第一条语句应该是super.setUp();
setApplication()方法和setContext(Context)方法允许你在Service启动之前设置模拟的Context 和模拟的Application.关于这些模拟的对象。请参考相关文档。

ServiceTestCase 默认的执行testAndroidTestCaseSetupProperly()方法。用于验证该测试类是否在跑其他测试用例之前成功地设置了上下文。


4  Mock object classes
 ServiceTestCase 默认情况下认为你会使用模拟的上下文对象(Context)或者Application生成测试环境。这些模拟的对象使该环境独立与其他的系统.(能理解为减少耦合性吗) 一旦你在被测试Service启动之前不为该其提供模拟的对象实例,ServiceTestCase会自动创建它内部提供的实例并将他们注入Service. 


为被测试的Service 注入一个模拟的Application ,首先需要继承MockApplication. 该类 是Application d的一个子类。在该类
(MockApplication)中的所有的方法都跑出异常。为了有效地利用该类我们必须继承该类,并重写我们需要的方法。然后通过setApplication() 方法注入到Service 中。该模拟的对象允许你控制被测试Service可以看到的应用程序对象,并且使它对立与其他的系统。In addition, any hidden dependencies your Service has on its application reveal themselves as exceptions when you run the test. 你可以向被测试的Service 通过setContext()方法注入模拟的context.


 5  what  to  test              
下面关于android  Service 测试列出了一些建议 :
•     验证Context.StartService()方法和Context.bindService() 方法调用后,onCreate() 方法是否被正确调用了。同样, 你需要确认在Context.StopService(),Cotext.unbindService(),stopSelf(),或者stopSelfResult()调用后onDestory()方法是否被正确调用。


•    服务能够正确地处理Context.startService()的多次调用,只有第一次调用才会触发Service.onCreate()方法,但是每次都会调用Service.onStartCommand()方法。还要注意的是startService()不会嵌套调用,因此对Context.stopService()或者 Service.stopSelf() ( stopSelf(int)不再此列)的一次调用就应该能够终止服务。


•     测试服务在逻辑上的正确性



                 ServiceTestCase  方法说明
                 getApplication()  :返回被测试的Service所用的Application.
                 getSystemContext():返回在setUp()方法中被保存的真的系统Context.
                 setApplication (Applicaition application) 设置测试被测试Service 所用的Application.
                 setUp() :得到当前系统的上下文并存储它。若要重写该方法的话,第一句必须是
                 super.setUp(). 该方法在每个测试方法被执行前都执行一遍。
                 setupService():生成被测试的Service , 并向其中注入模拟的组件(Appliocation ,Context)。
                 该方法会被StartService(Intent )或者bindService(Intent)自动调用。
                 shutdownService(): 调用相应的方法停止或者解除Service,然后调用ondestory().
                 通常该方法会被teardown()方法调用。   
                 startService(Intent intent): 启动被测试的Service.如果用这个方法启动一个服务,那么
                 该服务在最后回自动被teardown()方法关掉。
                 tearDown():关闭被测试的服务, 确认在执行下个用例前所有的资源被释放,所以的
                 垃圾被回收。 这个方法在每个方法执行完后调用。重写该方法上的话, 必须将
                 super.tearDown()作为最后一条语句。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值