本文主要介绍android测试框架的特性,包含测试的结构、用来创建测试的api、用来运行测试和查看结果的工具。
本文不免有硬翻译sdk之嫌,只是用来对android的测试框架做个大致介绍,具体的示例代码正在整理,下月blog记录下
一、测试框架特性
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、自动事件流模拟工具monkeyrunner和monkey:可以用来进行ui测试,都可以向设备发送事件流(键盘、touch、手势)对程序进行压力测试,其中monkeyrunner需要编写python程序调用api发送事件流,monkey通过adb的命令行发送。更详细的可以见七的介绍。
二、测试框架结构
下面为测试框架的结构图:
通过上图我们发现了以下几点
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。其中
MoreAsserts
提供了更强大的assert功能,比如正则表达式的比较、顺序比较、更丰富对象的equal判断等。ViewAsserts
提供了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依赖的目的。包括
MockApplication
, MockContext
, MockContentProvider
, MockCursor
, MockDialogInterface
, MockPackageManager
, and MockResources
。b.Resolver mock objects
通过提供独立的解析器将数据提供商和测试分离,可以自己增加数据并经行解析以满足需要。见
MockContentResolver
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完成。
相关推荐
本文主要介绍了Android测试框架的一些关键特性和结构。 首先,Android测试框架基于JUnit 3,虽然不完全兼容JUnit 4,但仍然允许开发者使用基本的JUnit功能进行测试。不过,为了更高效地利用Android平台的特性,推荐...
本文将深入探讨Android测试框架,并介绍与"自动化"相关的技术。 首先,我们要了解Android自带的测试支持库,如JUnit和Espresso。JUnit是Java编程语言中的一个单元测试框架,被广泛用于Android应用的单元测试。它...
3. Robolectric:在Java虚拟机上运行的Android测试框架,它可以模拟Android系统,使得测试可以在没有实际设备的情况下进行。 4. Appium:跨平台的自动化测试框架,支持Android和iOS。它基于WebDriver协议,允许使用...
RoboSpock 是一个开源的 Android 测试框架。提供简单的编写 BDD 行为驱动开发规范的方法,使用 Groovy 语音,支持 Google Guice 库。RoboSpock 合并了 Robolectric 和 Spock 的功能。 示例代码: def "should ...
### Android单元测试框架搭建手册 #### 一、前言 随着移动互联网的快速发展,Android应用的质量成为了用户体验的关键因素之一。为了提高应用的质量,确保代码的可靠性和稳定性,单元测试成为了必不可少的一部分。...
七、Android测试 1. 单元测试:针对应用中的各个组件进行测试,确保其功能正确。 2. UI测试:检查用户界面的行为和外观是否符合预期。 3. 性能测试:测量应用在不同设备和网络条件下的表现。 4. 回归测试:每次修改...
Cafe 测试框架是一款来自百度QA部门的具有开创性意义的Android平台的自动化测试框架,框架覆盖了Android自动化测试的各种需求。框架致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中的诸多难题...
Python结合Appium与Android自动化测试框架的构建是一个高效且强大的测试解决方案,尤其在移动应用测试领域。本框架的核心是利用Python作为编程语言,Appium作为跨平台的自动化测试工具,以及Android SDK为运行环境,...
本文将详细介绍几个常用的Android自动化测试框架,包括Monkey、MonkeyRunner、UIAutomator、Robotium和Appium。 1. **Monkey** Monkey是Android SDK自带的一个命令行工具,主要用于压力测试。它通过向系统发送随机...
本项目“Android mvvm 框架,最流行的mvvm demo”旨在提供一个无bug的示例,帮助开发者深入理解并实践MVVM框架在Android应用中的应用。 MVVM模式源于微软的WPF开发,近年来在Android开发中逐渐流行,它通过解耦视图...
开源自动化测试框架testng包,用于appium+java+android测试
本文主要介绍基于Android开发框架的新闻类APP的设计与实现,旨在解决当前移动应用开发中存在的高开发成本、开发效率低、应用程序页面开发重复度大、服务功能较多等问题。文章首先对基于Android的国内外应用开发框架...
为了在Android环境中运行这些测试,我们需要配置Android测试框架,例如JUnit4或AndroidX Test。然后,可以使用`@RunWith`注解指定Scalatest的运行器,例如`io.kotlintest.runner.junit4.KotlinTestRunner`。同时,还...
3. **Android测试支持** Spring框架提供了一套测试工具,包括`Robolectric`和`Spring Android Test`,可以帮助开发者进行单元测试和集成测试。`Robolectric`模拟Android环境,使得测试可以在JVM上运行,而无需实际...
6. **InterfaceTest**:这个压缩包中的"InterfaceTest"可能是Droid Fu框架中关于接口测试的部分,它可能包含了一些用于测试框架内接口功能的类和测试用例,这对于理解和验证框架的正确性至关重要。 总的来说,Droid...
KBUnitTest是一款轻量级DAO单元测试框架,开发者可以通过此框架,在Android Studio运行SQLiteDatabase、SharedPreference单元测试。KBUnitTest支持原生SQLiteDatabase操作及GreenDAO、Afinal、XUtils、DbFlow第三方...
Robolectric 是一款Android单元测试框架,示例代码: @RunWith(RobolectricTestRunner.class) public class MyActivityTest { @Test public void clickingButton_shouldChangeResultsViewText() throws ...
在Android应用开发中,构建一个实用的项目框架是至关重要的,它可以帮助开发者高效地组织代码,提高项目的可维护性和可扩展性。以下是对标题、描述和标签中的知识点的详细解释: 1. **自定义Android项目底部任务栏*...