Android单元测试

来源:互联网 发布:淘宝模特收费 编辑:程序博客网 时间:2024/05/17 21:47

我也是第一次接触单元测试,经过一段时间的学习,总结了一些资料,欢迎大家批评指正!

单元测试继承图如下:



Test API

Android提供了基于JUnit测试框架的测试API来书写测试用例和测试程序。与此同时,Android还提供了强大的Instrumentation框架,允许测试用例访问程序的状态及运行时的对象。

JUnit TestCase类

继承自JUnit的TestCase,不能使用Instrumentation框架.这些类包含访问系统对象的方法。使用Context,你可以浏览资源、文件等。基类是AndroidTestCase。

子类有:

  ①ApplicationTestCase--测试整个应用程序类。它允许你注入一个模拟的Context到应用程序,在应用程序启动之前初始化测试参数,并在应用程序结束之后销毁之前检查的应       用程序。

     * Lifecycle Support 每个Aoolication运行都遵循一定的顺序,ApplicationTestCase提供如下方法来支持对Application生命周期方法的测试:

    ·只有当测试用例调用createApplication()后才会执行Application的onCreate方法,从而是你有机会再Application的onCreate方法之前对测试       框架作调整。

    ·当测试用例结束后,测试用例的tearDown方法会被调用,然后会调用Application的onDestory()方法停止和销毁Application。

  *Dependency Injection 每个Application都和他运行的Context有一个固有的依赖。Android测试框架允许你注入一个Mock的或者孤立的context对      象, 以实现真实的单元测试,也可以通过getSystemContext()方法来获得一个真实的Context。你可以使用setContext()来注入你定义的Mock的      Context对象,setContext()必须在createApplication之前调用。测试框架提供了如MockContext、RenamingDelegatingContext、                  ContextWrapper来帮助你构造用于测试Application的Context对象。

  testPreconditions主要是在运行其它测试方法之前用来校验Application对象的初始化情况,和setUp类似,和setUp不同的是,testPreconditions   只会被运行一次,而setUp通常在执行每个测试方法之前都会运行一次,一般需把它作为Application第一个测试方法。

  ApplicationTestCase还提供了terminateApplication中止Application,可以测试Application的OnTerminate方法。

 ②ProviderTestCase2--测试单个ContentProvider类。

   这个测试案例需要设置如下模拟对象:

   ·IsolatedContext是找出可能影响运行系统其余部分的Context方法,允许测试真实的file和database

   ·MockContentResolver:提供了一个不变的content resolver功能,但是需要IsolatedContext。它给出notifyChange(Uri,ContentObserver,boolean)去组织测试影响运行系统

   ·测试中的provider实例运行在一个IsolatedContext

    该测试类提供了几个方法:

    getMockContentResolver() 获取初始化期间由该类创建的MockContentResolver

    getMockContext()获取初始化期间由该类创建的IsolatedContext

    getProvider返回有这个类的setUp()方法创建的content Provider

    newResolverWithContentProviderFromSql(Context targetContext,String filenamePrefix,Class<T>providerClass,String authoroty,String databaseName,int databaseVersion,String sql)创建一个和传到测试用例类同类型的content provider

 ③ServiceTestCase--测试单个Service。

   ServiceTestCase为测试Service提供了一个可控的测试环境,它提供对Service生命周期的基本支持,并可以通过注入一些依赖对象开控制测试环境以便测试Service。

   ServiceTestCase提供下面方法来支持对Service生命周期方法的测试:

   ·每个测试方法调用之前首先先会执行setUp方法,你如果要重载setUp的话,注意第一行加上super.setUp

   ·在调用startService(Intent)或bindService(Intent)之后,ServiceTestCase才会调用Service的onCreate方法,从而是你有机会在Service启动之前对测试环境做些调整。

   ·每个测试方法结束之后,调用tearDown方法,这个方法stop并destory被测试的service。如果你需要重载tearDown,注意第一行加上super.tearDown.

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

   对于ServiceTestCase有以下几点需要注意:

   ·ServiceTestCase.bindService()和Service.bindService()方法的不同之处在于其返回值的类型:

       ServiceTestCase.bindService()  ----->Intent

       Service.bindService()---->IBinder对象

    ·同其余的测试一样,ServiceTestCase也再每次测试的时候调用setUp()方法,该方法会通过复制当前系统的Context来建立测试平台,通过调用getSystemContext()方法获得      此Context

    ·setApplication()和setContext(Context)可以在启动服务前设定模拟的Context和模拟的Application

    ·在运行前,ServiceTestCase会默认的运行testAndroidTestCaseSetUpProperly()方法来确定测试类正确的搭建好了Context

 Instrumentation TestCase类

  继承自JUnit TestCase类,并可以使用Instrumentation框架,用于测试Activity。基类是Instrumentation TestCase。

  子类有:

              ·SingleLaunchActivityTestCase 用于测试单个Activity,和ActivityUnitTestCase不同的是,它只运行setUp和tearDown一次,而不是在运行tesCase中每个测试方法前后运行setUp和tearDown,它可以保证运行多个测试之间fixture不会被重置,从而可以用来测试一些有关联的方法.

              ·SyncBaseInstrumentation用于测试Content Provider同步性的类。继承自InstrumentationTestCase,重写了setUp,syncProvider和cancelSyncsandDisableAutoSync为保护方法。其中第一个保护方法是用于同步一个内容提供者,第二个保护方法是取消自动同步。

              ·ActivityTestCase是Activity测试的基类。其子类有ActivityInstrumentationTestCase2和ActivityUnitTestCase。

                            ActivityInstrumentationTestCase2用于测试一些功能性的测试,因此在一个正常的环境中测试单个Activity的类。你不能注入一个模拟的Context,但你可以注入一个模拟的Intent。而且还可以在Ui线程运行测试方法,并且可以给应用程序UI发送按键及触摸事件。它提供了几个方法:

                                           getActivity()可以取得被测试的Activity的实例对象

                                           setActivityInitialTouchMode(boolean)在启动Activity之前设置TouchMode

                                           setActivityIntent(Intent)可以设置启动Activity的Intent对象来测试Activity。

                            ActivityUnitTestCase设计用于单元测试(如果你想对一个Activity做回归测试的话可以使用),因此,它在一个孤立的系统环境中测试Activity,也就是说,当你使用这个测试类时,Activity不能与其它Activity交互。使用它,你可以注入模拟的Context或Application,或两者。这个测试类不能注入模拟的Intent。startActivity(Intent)和startActivityForResult(Intent,int)方法可以调用但一般不起任何作用,你可以使用getStartedActivityIntent()和getStartedActivityRequest()来检查参数值。finish()、finishFormChild(Activity)、finishActivity(int)方法可以调用,一般也无效果,可以使用isFinishCalled()和getFinishedActivityRequest检查传入的参数。

AndroidUITestRunner-- 查看项目中的一个布局文件的实际显示效果。提供了的两个方法:

         ·showView 显示一个View实例

         ·showLayout展示一个布局文件



0 0
原创粉丝点击