当前位置:文档之家› Android自动化测试工具简介

Android自动化测试工具简介

Android自动化测试工具简介随着Android的流行和发展,基于Android的应用开发越来越多,相应的测试方法和测试工具也越来越多,掌握好这些测试工具对测试团队提高工作效率有很大的帮助,本文将就Android平台上的几款常用的测试工具进行简单介绍。

InstrumentationInstrumentation是Android系统提供的基于junit的自动化单元测试框架,它提供了对Android系统API和对象的访问接口,可以控制和检查应用程序、模拟用户操作、获取系统状态,实现对应用程序或系统的功能、性能、UI、API 等的自动化测试。

Instrumentation框架通过将主程序和测试程序运行在同一个进程来实现这些功能。

图1:引用自:/guide/topics/testing/testing_android.html 1)测试类型要对Android应用程序进行单元测试有三种方法:第一,基于Junit的单元测试,这个测试运行在JDK下,测试一些和android 无关的东西,比如业务逻辑,数据封装,数值计算等等。

第二,基于AndroidTestCase,不使用Instrumentation框架,但可以访问系统对象如Context,通过Context可以访问到资源,文件,数据库等。

第三,基于InstrumentationTestCase,使用Instrumentation框架,入口是InstrumentationTestRunner,这是一个没有图形界面的,具有启动能力的,用于监控其他类的工具类。

2)主要测试类Android系统的单元测试框架位于包android.test中,其核心类图具有如下结构:图2:Instrumentation单元测试类结构1. Android的测试用例组织形式是和junit一样的,也是由TestSuite和TestCase组成,其中TestSuite的实现是InsturmentationTestSuite,而所有测试类都继承了两个类:AndroidTestCase和InstrumentationTestCase。

ApplicationTestCase用于测试应用程序,允许注入一个模拟的Context 到应用程序中。

ProviderTestCase2 用于测试ContentProvider,要求使用MockContentResolver,并注入一个IsolatedContext,因此Provider的测试是与OS孤立的。

ServiceTestCase 用于测试Service,可以注入一个模拟的Context或模拟的Application。

ActivityTestCase对Activity测试的基类ActivityUnitTestCase对单个Activity进行测试。

可以注入模拟的Context 或Application,不能注入模拟的Intent。

ActivityInstrumentationTestCase2在正常的系统环境中测试单个Activity,不能注入一个模拟的Context,但你可以注入一个模拟的Intent。

可以在UI线程运行测试方法,给UI发送按键和触屏事件。

2. Instrumentation在Assert的基础上提供了两个新的断言类:MoreAsserts和ViewAsserts。

MoreAsserts类包含更多强大的断言方法,如assertContainsRegex(String, String),可以作正则表达式的匹配。

ViewAsserts类包含关于Android View的有用断言方法,如assertHasScreenCoordinates(View, View, int, int),可以测试View在可视区域的特定X、Y位置。

3. Instrumentation有一些类可以方便的创建模拟的系统对象,如MockApplication,MockContext,MockPackageManager,MockResources 等等。

4. 在android.test.annotation包里定义了几个annotation,包括@LargeTest,@MediumTest,@SmallTest,@Smoke,和@Suppress。

你可以根据自己的需要用这些annotation来对自己的测试分类。

在执行单元测试命令时,可以在-e参数后设置“sizelarge”/“sizemedium”/“sizesmall”来执行具有相应标记的测试。

3)执行方法要运行Instrumentation测试需要在Manifest文件里加入下面代码(ADT 在创建测试工程时会自动添加)<uses-library android:name="android.test.runner" /><instrumentationandroid:name="android.test.InstrumentationTestRunner"android:targetPackage="com.android.yourpkg"android:label="Test Unit Tests"></instrumentation>Instrumentation是用adb命令完成的(在ADT下直接右键点击选取"Run As->Android Junit Test"即可),支持具体到测试方法的启动,如下面的例子:A. 运行某个package下所有TestCase:adb shell am instrument -wcom.android.foo/android.test.InstrumentationTestRunnerB. 运行某个TestCase:adb shell am instrument -w -e classcom.android.foo.FooTest **TestRunnerC. 运行一个TestCase中的某个功能:adb shell am instrument -w -e classcom.android.foo.FooTest#testFoo **TestRunnerD. 同时测试多个TestCase:adb shell am instrument -w -e classcom.android.foo.FooTest,com.android.foo.FooTest2 **TestRunner 4)例子一般Android单元测试要在setUp()中初始化Instrumentation环境和启动被测应用程序Activity,在测试方法中模拟事件,断言结果,然后在tearDown()中销毁应用程序。

public class QQLoginTest extends ActivityInstrumentationTestCase2<QQLogin> {Instrumentation instru = null;QQLogin loginActivity = null;public QQLoginTest() {super("qqpkg", QQLogin.class);}public void setUp(){super.setUp();instru = getInstrumentation();loginActivity = getActivity();}public void testOpenMenu() {instru.sendKeySync(KeyEvent);instru.sendKeyDownUpSync(KeyCode);instru.sendPointerSync(MotionEvent)instru.sendStringSync(String)instru.sendTrackballEventSync(MotionEvent) ......}public void tearDown() {if (loginActivity != null) {loginActivity.finish();loginActivity = null;}super.tearDown();}另外,Instrumentation可以触发方法在UI线程中运行,操作具体控件。

可以使用@UIThreadTest来声明线程,这将会在UI线程里运行方法里所有的语句。

也可以创建一个匿名的Runnable对象,把代码放到run()方法中,然后把这个对象传递给activity.runOnUiThread(),让方法中的一部分代码运行在UI 线程。

下面是一个例子:private Spinner mSpinner;protected void setUp() throws Exception {super.setUp();mInstrumentation = getInstrumentation();mActivity = getActivity();mSpinner = (Spinner) mActivity.findViewById(com.android.demo.myactivity.R.id.Spinner01);......public void uiThreadTest() {mActivity.runOnUiThread(new Runnable() {public void run() {mSpinner.requestFocus();}});mInstrumentation.waitForIdleSync();this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);......MonkeyMonkey可以运行在终端设备上,向系统发送伪随机的用户事件流,实现对应用程序进行压力测试。

Monkey通过开发机器上的命令行或脚本来启动,可以通过在每条命令前加上adb shell来达到目的,也可以进入Shell后直接输入Monkey命令。

如果不指定选项,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。

基本语法如下:$ adb shell monkey [options]下面是一个典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件:$ adb shell monkey -p -v 500运行Monkey需要许多选项,它们大致分为四大类:●基本配置选项,如设置尝试的事件数量。

●运行约束选项,如设置只对单独的一个包进行测试●事件类型和频率。

相关主题