测试与指令(Instrumentions)
Android包含了一组丰富的测试工具,它针对Android环境扩展了行业标准的JUnit测试框架。你仍可以使用JUnit测试你的Android应用,但是Android工具却允许你写出更加精密复杂的测试你的应用的每个方面,不论是单元测试还是框架层次的测试。
Android的测试环境包含以下关键功能:
Android对JUnit框架的扩展,通过了访问Android系统对象的功能。
指令框架可以使测试代码控制并检查应用
模拟常用的Android系统对象。
提供了运行当个测试或一组测试的工具,可以使用指令也可以不使用
支持通过命令行或Eclipse的ADT插件管理测试用例及测试工程。
本文概述了Android测试环境以及它的使用方法。本文假设你了解Android应用编程及JUnit测试方法的基础知识。
概述
Andorid测试环境的核心是指令框架,使用它在测试时你可以精确地控制程序。使用指令,你可以在主程序启动前建立模拟的系统对象如Context,可以控制程序的生命周期,可以像应用发送UI时间,可以在应用运行时检查它的状态。指令框架通过使主应用和测试应用运行于同一个进程来实现这些功能。
在测试应用的manifest文件中定义<instrumentation>元素,可以使测试应用在测试时连接到主应用。这个元素的属性指定了主应用的package名字,并告诉Android如何运行测试应用。关于指令的更加详细的描述请参考Instrumentation Test Runner。
下图简要描述了Android测试环境
<!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75"
alt="android_test_framework" style='width:385.5pt;height:248.25pt;
visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png"
o:title="android_test_framework"/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]-->
在Android中,测试应用是Android应用本身,因此,编写测试应用的方式与被测应用的一样。SDK工具帮你创建主程序的工程的同时也创建它的测试工程。你可以通过Eclipse的ADT插件或者命令行来运行Android测试,也可以使用adb工具或者内置的Ant target运行测试。
如何在Eclipse中设置并运行测试,请参考Testing in Eclipse, with ADT, 如果是其他IDE,请参考Testing in Other IDEs。
如果希望一份手把手的Android测试介绍,请尝试一下的测试例程:
Hello,Testing例程以Hello, world应用为例介绍了基本的测试概念和程序。
Activity Testing例程比Hello, Testing例程更加深入。它指导你在一个更加真实的应用中开发一个更加复杂的测试场景。
测试API
为了使用JAVA编写测试级测试应用,Android提供了一套扩展自部分JUnit测试框架的测试API。除此之外,Android提供了强大的指令框架,它允许开发人员的测试代码访问应用的状态以及运行时对象。
以下章节描述了Android中可用的测试API的主要部件。
JUnit测试用例类
测试API中的一些类扩展了JUnit的TestCase类,但是没有使用指令框架。这些类包括测试中访问系统对象的方法,比如程序的上下文Context。使用Context,开发人员可以查看资源,文件,数据库等等。基类是AndroidTestCase,通常使用一个与特定部件关联的子类。
这些子类是:
ApplicationTestCase:用于测试整个应用。它可以注入一个模拟Context到应用中,在程序启动前设置初始的测试参数,以及在应用结束后销毁前检查相关数据。
ProviderTestCase2:用于独立地测试单个的ContentProvider。因为限制使用模拟的MockContentResovlver,并且注入一个独立的IsolatedContext,使得这个provider测试独立于操作系统的其余部分。
ServiceTestCase:用于独立地测试单个的Service。开发人员可以使用它注入一个模拟的Context或者更模拟的应用(或者两者都注入),或者要求Andorid提供一个完全的Context和一个MockApplication。
指令测试用例类
这些测试activities的API扩展了JUnit TestCase类,并使用了指令框架。使用指令, Android可以向测试中的应用程序发送时间进行自动化的界面测试,可以精确地控制activity的启动,以及在activity的整个生命周期中监测它的状态。
基类是InstrumentationTestCase。它的所有子类都可以向测试应用发送键盘敲击时间和屏幕触摸事件,也可以注入一个模拟的Intent。
这些子类是:
ActivityTestCase:activity测试用例的基类。
SingleLaunchActivityTestCase:用于测试单个的activity。它仅调用一次setUp()和tearDown,而非每次方法调用就调用一次。在同一个activity上测试所有的方法时可以使用这个类。
SyncBaseInstrumentation:用于测试content provider的同步操作。它可以使用指令在开始被测同步操作前取消或禁止已经存在的同步操作。
ActivityUnitTestCase:用于独立测试单个的activity。使用它,可以注入一个模拟的上下文或应用或者两者都模拟。
与其它指令类不同,这个测试类不会注入一个模拟的Intent。
ActivityInstrumentationTestCase2:这个类用于在正常的系统环境下测试单个的activity。你不能注入模拟的Context,但可以注入模拟的Intent。同样的,你可以在UI线程(被测程序的主线程)中运行测试方法,这允许你向应用界面发送按键与触摸事件。
断言类
Android同样也扩展了JUnit的Assert类,这是测试代码中assert()的基础。这个类有两个扩展MoreAsserts和ViewAsserts:
MoreAsserts包含了更加强大的断言,例如支持正则表达式匹配的assertContainsRegex(String,String)。
ViewAsserts包含了用于Android Views的断言,例如只可以检测在屏幕的某个位置是否存在某个View控件的assertHasScreenCoordinates(View,View,int,int)。这些断言简化了UI的形状位置和排列的测试。
Mock对象类
Android提供了创建模拟的系统对象,例如应用程序、上下文、content resovlers和resources。Android也提供了一些创建模拟Intent的测试类。这些对象使依赖关系注入更加容易,因为使用它们比创建真实的对象简单。这些类定义在android.test和android.test.mock中。
IsolatedContext:模拟了一个上下文,应用程序使用它可以独立运行。同时,它还有足够的桩代码来处理与上下文通信的OS代码。这个类用于单元测试。
RenamingDelegatingContext:当一个已经存在的普通上下文改变它的默认文件和数据库名时,将大多数上下文的功能委托这个上下文。这样可以使用一个普通的系统上下文和测试名称测试文件和数据库操作。
MockApplication,MockConentResolver,MockContent,MockDialogInterface,MockPageManager,MockResource:测试中使用的创建模拟系统对象的类。它们仅仅暴露那些用于管理对象的接口。这些方法的默认实现是简单的抛出一个异常。当测试应用调用这些方法时,你应该扩展这些类并覆写这些方法。
指令测试执行器
Android提供了一个定制类用于运行带有指令调用的测试,叫做InstrumentationTestRunner。这个类控制测试中的程序,在同一个进程中运行测试程序以及主程序,并将测试输出发送到适当位置。InstrumentationTestRunner在运行时控制整个测试环境的关键是指令的使用。注意,即使在你的测试类中没有使用指令,也会使用这个测试执行器。
当你运行一个测试程序时,你首先运行系统组件Activity管理器。它使用指令框架启动和执行测试执行器,测试执行器反过来使用指令关闭所有运行的主程序的实例,启动测试程序,然后在同一进程中启动启动主程序。这允许测试程序从不同的角度与主程序交互。
如果你使用Eclipse开发,ADT插件可以帮助你设置InstrumentationTestRunner或其它测试执行器。插件会提示你指定使用哪个测试执行器和被测试应用的package名称,插件会自动添加一个<instrumentataion>元素到测试程序的manifest文件,并填充适当的属性。Eclipse的ADT插件会自动在使用指令的Activity管理器的控制下启动测试应用,并将测试输出重定向到Eclipse的JUnit视图窗口中。
如果你使用命令行,你可以使用Ant和android工具帮助你设置你的测试工程。可以使用adb工具访问Activity管理器运行带指令的测试,并将输出定向到标准输出上。
使用测试环境
测试程序包含了对一个Android应用的测试代码,它本身也是一个Android应用。测试应用存放于一个独立的Android工程中,它和标准的Android应用一样拥有文件和目录。测试程序通过它的manifest文件链接到被测应用。
每个测试应用包含一个或多个测试用例类,它们派生于特定类型组件的Android类。这些测试用例类包含了一些方法,它们定义了对被测应用的某部分的测试。当你运行测试应用,Android会启动测试应用,加载被测试应用到同一个进程中,然后调用这个测试用例类中的每个方法。
测试所需的工具和流程取决于你使用的开发环境。如果你使用Eclipse,ADT插件会提供工作帮助你开发和运行测试。请参考主题Testing in Eclipse, with ADT。 如果使用其它开发环境,你需要使用命令行工具,请参考Testing in Other IDEs 。
使用测试工程
要开始测试一个Android应用,你要使用Android工具为它建立一个测试工程。工具会建立工程文件夹和需要的文件和子目录。工具也会建立一个连接到被测试程序的manifest文件。使用Eclipse ADT插件建立测试工程的步骤在Testing in Eclipse, with ADT 中有描述,使用其它开发工作的步骤描述在文档Testing in Other IDEs中。
使用测试用例类
一个测试应用包含一个或多个扩展自Android测试用例类的测试用例类。选择哪个测试用例类,取决于你要测试的Android组件的类型和要测试的内容。一个测试应用可以测试不同的组件,划每个测试用例被设计成只能测试单个类型的组件。Android测试用例类的描述在章节The Testing API 中。
待续。。。
分享到:
相关推荐
根据提供的内容,我们可以看到一系列的测试指令,这些指令可以帮助用户快速地获取关于设备的信息,并进行基本的功能检测。下面我们将逐一解读这些指令: 1. **通用模式指令**: - **\*#3646633#\***:进入工程模式...
手机测试指令是手机维修、调试和验证设备功能的重要工具,主要针对手机的硬件、软件以及通信性能进行检查。这些指令通常是由制造商隐藏的,通过输入特定的数字代码,用户可以获取设备的详细信息或者执行特定的功能。...
4. 布尔变量处理指令(17个):这些指令用于设置或测试位变量。`SETB C`用于设置进位标志C为1,`CLR C`则用于清除。此外,还可以对RAM中的可位寻址区或特殊功能寄存器的位进行操作。 5. 控制转移指令(17个):这些...
2. **计算8乘以3**:这可以通过`MUL`(Multiply)指令实现,但更常见的是使用`MOV`指令与左移操作结合,因为8是2的三次幂。示例指令如下: ``` MOV R0, #3 ; 将3移动到R0 LSL R0, #3 ; R0 = R0 ``` 3. **计算...
### 8051、ARM和DSP指令周期的测试与分析 #### 一、引言 在实时嵌入式控制系统中,微控制器的指令周期直接影响系统性能和响应速度,是评估微控制器性能的关键指标之一。本文针对三种主流的微控制器——AT89S51...
ASM为Assembly的简写,ASM指令的含义为汇编指令(泛指Intel 80X86 CPU中的...ASM的优点在于指令广泛和丰富,处理大型数据游刃有余,但是缺点也是显而易见的,由于指令的长度不等与指令的复杂,其耗能大,CPU体积也大。
威纶宏指令探测工具的应用意义远不止于检测宏指令那么简单。在进行程序优化时,能够快速找到使用宏指令的位置,对提高程序运行效率有很大帮助。在处理旧项目时,这一工具的使用可以帮助开发者深入理解原有代码结构,...
### 指令周期与执行时间分析 根据测试程序的实际运行情况,我们可以通过分析得到以下几点重要的结论: 1. **平均计数时间**:从测试数据来看,每次计数的时间约为2.45秒左右,这表示了在软核CPU上执行指定次数指令...
在IT行业中,打印机指令测试工具是工程师们进行硬件设备调试和软件开发不可或缺的辅助软件。这类工具主要用于确保打印机与计算机之间的通信正常,特别是在涉及到LPT(Line Printer Terminal,行式打印机端口)和COM...
这个“31条指令CPU测试集合”很可能是针对MIPS架构设计的一系列基准测试,用于评估CPU对于不同指令集的处理能力。 测试集合通常包含各种类型的指令,以全面检验CPU的性能、稳定性和兼容性。这31条指令可能涵盖了...
STL指令集覆盖了广泛的指令类型,包括位逻辑指令、比较指令、转换指令、计数器指令、数据块指令、逻辑控制指令、数学运算指令(包括整型和浮点数)、装载和传送指令、程序控制指令、移位和循环指令、定时器指令、字...
- **功能:** 包括音频循环控制、LCD测试、旋律测试、装置测试(如振动、亮度)、触控屏幕版本与测试、接近感应器测试、背光灯感应器测试、内存版本、实时时钟测试、声音测试模式、通用测试、ADC读数、加密信息、射频...
台达PLC的DTM指令,全称为Data Transfer and Move指令,主要用于数据转换与搬移。在实际应用中,特别是当涉及到MODBUS RTU通信时,这个指令显得尤为重要。MODBUS RTU通信协议中,数据通常是以16位寄存器的形式传输,...
R&S®CMW-KM61x/-KS60x/-KS61x蓝牙固件应用手册是一份详尽的文档,其内容涵盖了使用R&S®CMW500测试设备进行蓝牙相关测试的各个方面的知识和指令。该手册由Rohde & Schwarz公司出版,是该公司CMW系列测试仪器的操作...
- **功能**:与LDB=指令相似,但支持与其他指令组合使用。 **2.4 LDB指令:载入字节不等于** - **功能**:用于比较两个字节数据是否不相等。 - **用法**:如果不相等,则输出为真。 **2.5 AB指令:与运算字节不...
它展示了如何使用AT指令与GSM模块进行交互,实现短信发送、信号检测和拨打电话。同时,通过MFC框架,我们可以学习到如何构建一个具有这些功能的桌面应用程序。对于学习嵌入式通信、GSM模块应用和MFC编程的开发者来说...
PLC 基本指令表与指令解释 PLC(Programmable Logic Controller,程序化逻辑控制器)是一种常用的工业自动化控制设备,广泛应用于制造业、能源、交通、建筑等领域。PLC 的主要功能是通过编程来控制和监控外部设备,...
2. **边缘检测指令** - **UP**:上升沿微分指令,检测信号的上升沿。 - **DOWN**:下降沿微分指令,检测信号的下降沿。 - **LDTST**、**LDTSTN**:位测试指令,用于检查特定位的状态,前者为正向测试,后者为取反...
《开源处理器Rocket的自定义指令研究与测试》 本文主要探讨了开源处理器Rocket,它基于RISC-V指令集架构,实现了RISC-V的三条自定义指令:custom0、custom1和custom2。RISC-V是一种由加州大学伯克利分校设计并发布...