Android测试教程(9):ApplicationTestCase示例

本文从Android测试的理论知识出发,通过结合ApiDemoTest示例深入讲解实际测试过程。首先介绍如何创建测试项目,接着展示测试项目的结构及关键类的作用,包括AllTests.java、ApiDemosApplicationTests等。重点阐述了测试方法的分类标注(@SmallTest、@MediumTest)、测试预条件校验(testPreconditions)以及Application生命周期测试(testSimpleCreate)。此外,还详细解释了如何利用Android测试框架进行依赖注入和模拟上下文环境,以及如何终止应用程序以测试其onTerminate方法。

前面介绍了Android测试的一些理论知识,从本篇开始的几篇将结合ApiDemoTest示例来介绍Android测试的实例。在此之前可以参照Android测试教程(3):测试项目 创建ApiDemos->tests 测试项目,本项目测试用来测试ApiDemos,主要目的是介绍Android测试框架的使用方法。

当然要测试ApiDemos,事先要创建好项目ApiDemos。下图显示了创建好ApiDemos->Tests后,ApiDemos->Tests中所含的Java类:

Android测试项目也是一个Android应用项目,其基本使用方法和开发一般的Android应用非常类似,Android测试项目主要是利用Android测试框架编写测试用例来测试对应的Android应用的各个方面。

其中AllTests.java 定义如下:

public class AllTests extends TestSuite {
 
 public static Test suite() {
 return new TestSuiteBuilder(AllTests.class)
 .includeAllPackagesUnderHere()
 .build();
 }
}

使用TestSuiteBuilder 指明所有该包和其子包中定义的TestCase都为最终TestSuite 的一部分(需要被运行的测试)。

AllTests.java 一般可以不用修改的应用到大部分的测试项目中,如果有特殊需要,可以使用android.test.suitebuilder 的类定义那些Testcase 需要包含到最终的测试包(Test Suite)中.

ApiDemosApplicationTests 测试介绍ApplicationTestCase的基本使用方法。

下图为ApplicationTestCase 的继承关系:

ApplicationTestCase 主要用来测试Application 类,提供了对Application类生命周期方法的基本支持,并可以支持一些dependency injection 以帮助构造测试Application的的环境。

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

  • 只有当测试用例调用createApplication()后才会执行Application 的onCreate 方法,从而使得你有机会在调用Application的onCreate方法之前对测试框架做些调整。
  • 当测试用例结束时,测试用例的tearDown 方法会被调用,然后会调用Application 的onDestroy()方法停止和销毁Application.

Dependency Injection 每个Application都依赖于运行它的Context 对象,Android测试框架允许你注入一个Mock的或者孤立的context 对象,以实现真正的单元测试,如果只是想做一般的测试,你的Application方法将被注入全功能的Context对象,你可以使用setContext 来注入你定义的Mock 的Context对象,setContext 必须在createApplication 之前调用。测试框架提供了如MockContext, RenamingDelegatingContext, ContextWrapper 来帮助你构造用于测试Applicaton的Context对象。

本例的代码如下:


public class ApiDemosApplicationTests
 extends ApplicationTestCase<ApiDemosApplication> {
 
 public ApiDemosApplicationTests() {
 super(ApiDemosApplication.class);
 }
 
 @Override
 protected void setUp() throws Exception {
 super.setUp();
 }
 
 @SmallTest
 public void testPreconditions() {
 }
 
 /**
 * Test basic startup/shutdown of Application
 */
 @MediumTest
 public void testSimpleCreate() {
 createApplication();
 }
 
}


有几个新知识

1. @SmallTest 和@MediumTest标注

Android测试框架可以使用@SmallTest,@MediumTest和@LargeTest 来标注测试方法,这些分类划分主要是根据测试访问数据的位置,如本地,SD卡,网络,下表为通常划分测试等级的基本方法:

FeatureSmallMediumLarge
Network accessNolocalhost onlyYes
DatabaseNoYesYes
File system accessNoYesYes
Use external systemsNoDiscouragedYes
Multiple threadsNoYesYes
Sleep statementsNoYesYes
System propertiesNoYesYes
Time limit (seconds)60300900+

2. testPreconditions

testPreconditions 测试主要用来运行其它测试方法之前来校验Application 对象的初始化情况,和setUp类似,但和setUp 不同的是,testPreconditions只会被运行一次,而setUp通常在执行每个测试方法之前都会运行一次,一般需把它做为Application第一个测试方法,但由于JUnit使用Reflection 来取得测试方法,因此并不一定能保证testPreconditions一定在其它测试方法之前运行。

testSimpleCreate 为测试Application 的测试方法,调用createApplication 会触发Application 的onCreate 方法,测试结束后,执行tearDown ,然后调用Application 的onDestroy 方法,如果Application 的onCreate, onDestroy 运行抛出异常的话,则本测试方法失败,否则表示测试通过。

ApplicationTestCase 还提供了一个terminateApplication 中止Application,可以测试Application 的onTerminate 方法

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值