Android测试框架介绍

本文主要介绍android测试框架的特性包含测试的结构用来创建测试的api用来运行测试和查看结果的工具
本文不免有硬翻译sdk之嫌,只是用来对android的测试框架做个大致介绍,具体的示例代码正在整理,下月blog记录下Android测试框架介绍
 
一、测试框架特性
android测试框架作为android开发环境的一个重要部分,可以用来测试应用的各个方面,从单元测试到框架测试。这个测试框架拥有如下特性:
1、基于junit:android的测试套件是基于JUnit 3的(所以不完全兼容JUnit 4),因而你可以使用普通的junit而不调用android的测试api来进行测试,当然我们推荐使用android的测试api更高效全面的进行测试。
2、组件的测试:android的junit扩展提供了针对组件的测试用例类,这些类提供了mock对象和方法的辅助方法,进而控制组件生命周期。
3、测试工程同应用工程类似:测试用例类包含在类似主程序包的测试包中,所以无需学习其他的技术和工具。
4、自动创建测试工程:用于自动构建和运行测试的sdk工具在eclipse adt中可用,其他ide中可以使用命令完成。它们可以读取源项目的信息自动完成测试类的创建。
5、自动事件流模拟工具monkeyrunnermonkey:可以用来进行ui测试,都可以向设备发送事件流(键盘、touch、手势)对程序进行压力测试,其中monkeyrunner需要编写python程序调用api发送事件流,monkey通过adb的命令行发送。更详细的可以见七的介绍。
 
 
二、测试框架结构
下面为测试框架的结构图:
Android测试框架介绍
通过上图我们发现了以下几点
a. 测试package和应用package运行在同一个进程中,通过InstrumentationTestRunner进行交互。而一般情况下应用是运行在自己独立的dalvik进程中,而测试package和应用package为两个工程,它们如何运行在同一个进程中的呢?InstrumentationTestRunner的作用呢?这些稍后我们都将解释。
b. 测试工具以及monkey和monkeyrunner都运行在进程之外。并且也是通过InstrumentationTestRunner进行交互。
c. 测试package由test case classed和mock objects组成。
 
三、android 测试用例结构
android 测试用例结构同Junit差不多,比较显著的差别就是测试用例会单独放在一个工程中进行管理,并且可以通过自动化的方式(ide插件或者命令行)建立好测试工程。可以参考:
 
四、用于测试的api
4.1 Junit
JUnit3 的api可以在android中使用。android的 AndroidTestCase 也是继承自JUnit的TestCase。其他像assert也类似
 
4.2 Instrumentation
instrumentation是android系统一系列控制函数和钩子的集合。这些钩子使得android控件独立于其正常的生命周期以及系统如何加载程序。说的俗点,就是android自己给自己开的后门。。
 
a. 显式控制系统组件生命周期。通常情况下,组件的生命周期是由系统控制的,例如大家熟悉的activity生命周期的相应函数onCreate、onResume、onStop等函数都是由系统自行调用,并且android应用框架并没有提供权限让用户直接调用,但是在instrumentation中却可以调用。
 
b. 测试和程序运行在同一进程中。android应用的组件(除content providers等外)都运行在同一个dalvik进程中,并且无法让应用同另外一个应用运行在同一个进程中。但是instrumentation能让测试程序和相应应用运行在同一进程中,这样就可以方便的进行组件生命周期控制和数据访问。现在我们知道了上面结构图中的第一个疑问。
 
4.3 测试用例类
4.3.1  AndroidTestCase 继承自TestCase,功能类似JUnit的TestCase,含有经典的setUp和tearDown函数。同时提供了测试权限以及通过解除类引用防止内存泄漏的方法。
 
4.3.2 Component-specific test cases 面向组件的测试用例。包括Activity Testing,Content Provider Testing、Service Testing。并没有单独提供BroadCastReceiver,因为它可以通过传递intent进行测试。
 
4.3.3 ApplicationTestCase
使用 ApplicationTestCase测试应用对象的setUp和tearDown。这些对象维护着应用的全局状态。这些测试用例可以校验manifest文件中的application元素的配置。
 
4.3.4 InstrumentationTestCase
如果想在测试用例中使用instrumentation方法,必须使用 InstrumentationTestCase 或其子类,比如Activity的测试用例就继承自InstrumentationTestCase,并且扩展了其他在Activity测试中实用的功能。
 
4.4 Assertion classes
同Junit测试一样,android测试中也可以使用assert展示测试结果。除了Junit的assert类可用外,android测试api还提供了MoreAsserts和ViewAsserts。其中
<a style="color: #006699;" href="http://developer.android.com/reference/android/test/MoreAsserts.html">MoreAsserts</a>提供了更强大的assert功能,比如正则表达式的比较、顺序比较、更丰富对象的equal判断等。
<a style="color: #006699;" href="http://developer.android.com/reference/android/test/ViewAsserts.html">ViewAsserts</a>提供了Views即UI的几何和对齐测试。如位置、对其、views包含判断。
 
4.5 Mock object classes
依赖注入可以方便测试,android提供了类,用于mock  Context、ContentProvider、ContentResolver、Service等系统对象,有些还提供intent对象的mock。你可以使用这些mocks将某个测试点独立出来或是方便测试的依赖注入。这些类可以在android.test和android.test.mock的包中找到。
android提供了两类mock对象的类
a.Simple mock object classes
这些类提供了一个简单的mock策略,他们废止了对应的系统对象,如果调用相应系统对象就会抛出异常。通过重写方法达到mock依赖的目的。包括<a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockApplication.html">MockApplication</a><a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockContext.html">MockContext</a><a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockContentProvider.html">MockContentProvider</a><a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockCursor.html">MockCursor</a><a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockDialogInterface.html">MockDialogInterface</a><a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockPackageManager.html">MockPackageManager</a>, and <a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockResources.html">MockResources</a>
b.Resolver mock objects
通过提供独立的解析器将数据提供商和测试分离,可以自己增加数据并经行解析以满足需要。见<a style="color: #006699;" href="http://developer.android.com/reference/android/test/mock/MockContentResolver.html">MockContentResolver</a> 
 
4.6 上下文测试
android提供了两个上下文测试类
这个类允许你在不影响设备真实展现的数据情况下测试应用的数据操作。提供了独立的context、文件、目录和数据库操作可以在测试中使用。 
这个类快速为数据操作提供了独立的数据,并且保持了其他context操作正常的功能
 
五、 测试执行
test runner是用来执行测试用例的,可以加载测试类、set ups、runs和销毁每个测试用例。
为了执行测试,需要在manifest文件中指定test runner.
InstrumentationTestRunner支持所有类型的测试,可以运行所有的测试用例。可以在manifest文件的instrumentation节点中指定其或其子类。InstrumentationTestRunner代码在公共类库android.test.runner中, 而没有包含在android代码中。所以为了使用它,需要在uses-library节点中声明。这些都不需要手动完成,通过ide或是命令行创建工程已经自动完成。这里解决了上面结构图中始终通过InstrumentationTestRunner交互的原因。
系统加载和启动test包之后会kill原来的应用进程,重启实例,然后将控制权交给InstrumentationTestRunner
 
六、 查看测试结果
android测试结果会返回给启动它的工具,可以查看运行的测试用例名和方法名以及具体出错的行。对于eclipse会在junit新的面板中展现,对于命令行在标准输出中展示
 
七、 monkey and monkeyrunner
sdk提供了两个函数级的应用测试工具
a. UI/Application Exerciser Monkey经常叫做monkey。通过adb运行的一个命令行工具,通过向设备发送表示keystrokes、touches或者gestures  的事件流,对系统或具体应用进行压力测试,并且能自动报告遇到的错误。用法示例如下:
adb shell monkey -p your.package.name -v 500
 
b. monkeyrunner 提供了用于编写python 程序的api和执行环境,通过自己编写的程序可以在android代码外可以控制android设备,比如安装、运行应用程序和测试包,向程序发送事件流,页面截图并保存。
 
monkeyrunner工具不同于monkey(UI/Application Exerciser Monkey)。monkey是运行在adb的命令行工具,用来产生用户和系统的事件流,可随机性很大;而monkeyrunner 通过api发送特定的命令和事件,一般需要自己编写python程序调用api完成。
 
 

相关推荐