AndroidTest学习(1)Android测试基础(部分搬运)

使用AndroidStudio创建工程的时候总会发现自动构建出一个同名的包后面括号标注(AndroidTest)或者(Test)
所以就上网查了一些关于AndroidTest的文章

原文地址:http://blog.chinaunix.net/uid-20771867-id-121133.html
AndroidStudio下使用AndroidTest的英文书籍:http://pan.baidu.com/s/1skbOBrn (本书的Chapter11)```

Testing和Instrumentation

Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试的框架,尽管你可以试用JUnit测试Android工程,但是Android工具允许你为应用程序的各方面进行更为复杂的测试,包括单元层面及框架层面.

Android测试环境的主要特征有:

  • 可以访问Android系统对象.
  • Instrumentation框架可以控制和测试应用程序.
  • Android系统常用对象的模拟版本.
  • 运行单个的Test或Test Suite的工具,带或不带Instrumentation

概要

Android测试环境的核心是一个Instrumentation框架,在这个框架下你的测试应用程序可以精确控制应用程序.试用Instrumentation,你可以在主程序启动之前,创建模拟的系统对象,如Context;控制应用程序的多个生命周期;发送UI事件给应用程序;在执行期间检查程序状态,.Instrumentation框架将通过主程序和测试程序运行在同一个进程来实现这些功能.

通通在测试工程的Manifest文件中添加元素来指定要测试的应用程序.这个元素的特性指明了要测试的应用程序包名,以及高速Android程序该如何运行测试程序,在InstrumentationTestRunner章节有更多的细节描述.

在Android中,测试程序也是Android程序,,因此它和被测试程序的书写方式,有很多相同的地方,SDK工具能帮助你同事创建主程序及它的测试工程,

TestingAPI

Android提供了基于JUnit测试框架的测试API来书写测试用例和测试程序.另外Android海提供强大的Instrumentation框架,允许测试用例访问程序的状态及运行时的对象.
下面的章节描述了Android测试中可利用的主要测试API.

JUnit TestCase类

继承自JUnit的TestCase,不能使用Instrumentation框架.但这些类包含访问系统对象(如Context)的方法,使用Context,你可以浏览资源,文件,数据库等等,基类是AndroidTestCase,一般常见的是它的子类,和特定的文件关联,
子类有

  • ApplicationTestCase:测试整个应用程序的类
    它允许你注入一个模拟的Context到应用程序中,在应用程序启动之前初始化测试参数,并在应用程序结束之后销毁之前检查应用程序.
  • ProviderTestCase2:测试单个ContentProvider的类
    因为它要求使用MockContentRosolver,并注入一个IsolateContext,因此Provider的测试是与OS孤立的
  • ServiceTestCase:测试单个Service类
    你可以注入一个模拟的Context或者Application(或者两者),或者让Android为你提供Context和MockApplication.

InstrumentationTestCase类

继承自Junit的TestCase,并可以使用Instrumentation框架,用于测试Activity,试用Instrumentation,Android可以向程序发送事件来自动进行UI测试,并可以精确控制Activity的启动,监测Activity的生命周期状态,

基类是InstrumentationTestCase,它的所有子类都能发送按键或者触摸事件给UI,子类还可以注入一个模拟的Intent,
子类有

  • ActivityTestCase:Activity测试类的基类
  • SingleLunchActivityTestCase:测试单个的Activity的类,它能出发一次setUp(),和tearDown(),而不是每个方法调用时都触发,如果你的测试方法都是针对同一个Activity的话,那就试用它吧
  • SyncBaseInstrumentation:测试ContentProvider同步的类,它用Instrumentation在启动测试之前取消已经存在的同步对象,
  • ActivityUnitTestCase:对单个的Activity进行单一测试的类,使用它,你可以注入模拟的Context或Application,或者两者.它用于对Activity进行单元测试,不同于其他的Instrumentation类,这个测试类不能注入模拟的Intent
  • ActivityInstrumentationTestCase2:在正常系统环境中测试单个的Activity的类.你不能注入一个模拟的Context,但你可以注入一个模拟的Intent,另外,你可以在UI线程(应用程序的主线程)运行测试方法,并且可以给应用程序UI发送按键和触摸事件.

Assert类

Android还继承了JUnit的Assert类,其中有两个子类:MoreAssertsViewAsserts:

  • MoreAsserts类包含更多强大的断言方法,如assertContainsRegex(String string),可以作正则表达式的匹配
  • ViewAsserts类包含关于AndroidView的有用断言方法,如asserHasScreenCoordinates(View view,int ,int),,可以测试View在可视区域的特定X,Y的位置,这些Assert简化了UI中几何图形和对其方式的测试,

Mock对象类

Android有一些类可以方便的创建模拟的系统对象,如Application,Context,ContentProvider和Resource,Android还在一些测试类中提供了一些方法来创建模拟的Intent,因为这些模拟器的对象比实际对象更容易使用,因此,试用它们能简化依赖注入,你可以在android.testandroid.test.mock中找到这些类
它们是

  • IsolateContext:模拟一个Context,这样应用程序可以孤立运行,与此同时,还有大量的代码帮助我们完成与Context的通信,这个类在单元测试时很有用,
  • RenamingDelegatingContext:当修改默认文件和数据库名时,可以委托大多数的函数到一个存在的,常规的Context上,试用这个类来测试文件和数据库与正常系统Context之间的操作
  • MockApplication,MockContentResolver,MockContext,MockDialogInterface,MockPackageManager,MockResources:创建模拟的系统对象的类,它们只暴露那些对对象的管理有用的方法,这些方法的默认实现只是抛出异常,你需要继承这些类,并重写这些方法.

InstrumentationTestRunner

Android提供了自定义的运行测试用例的类,叫做InstrumentationTestRunner.这个类控制应用程序处于测试环境中,在同一个进程中运行测试程序和主程序,,并将测试结果输出到合适的地方,InstrumentationTestRunner在运行是对整个运行环境的控制能力的关键是试用Instrumentation,注意,如果你的测试类不使用Instrumentation的话,你也可以用这个TestRunner,
当你运行一个测试程序时,首先会运行一个系统工具叫做ActivityManager,ActivityManager使用Instrumentation框架,来启动和控制TestRunner,这个TestRunner反过来又使用Instrumentation来关闭任何主程序的实例,然后启动测试程序和主程序(在同一个进程中,),这样能确保测试程序和主程序的直接交互,

在测试环境中工作

对Android程序的测试都包含在一个测试程序里,它本身也是一个Android应用程序,测试程序以单独的Android工程存在,与正常的Android程序有相同的文件和文件夹,测试工程在Manifest中指定要测试的Android应用程序,

每个测试程序包含一个或多个针对特定类型组件的测试用例.测试用例里定义了测试应用程序某些部分的测试方法,当你运行测试程序,Android会在相同的进程里加载主程序,然后出发每个测试用例里的测试方法,

测试工程

为了开始对一个Android程序测试,你需要使用Android工具创建一个测试工程,工具会创建工程文件夹,文件和所需要的子文件夹,工具还会创建一个Manifest文件,指定被测试的应用程序,

测试用例

一个测试程序包含一个或多个测试用例,它们都继承自AndroidTestCase类,选择一个测试用例取决于你要测试的Android组件的类型以及你要作什么样的测试,一个测试程序可以测试不同的组件,但每个测试用例类类设计时只能测试单一类型的组件,

一些Android组件有多个关联的测试用例类,在这种情况下可以选择,类间,你需要判你要进行的测试类型,例如对于Activity来说,你有两个选择,ActivityInstrumentationTestCase2,和ActivityUnitTestCase,

AndroidInstrumentationTestCase2设计用于设计一些功能性的测试,因此它在一个正常的系统环境中测试Activity,你可以注入Intent,但不能是模拟的Context,一般来说你不能模拟Activity之间的以来关系,

相比而言,ActivityUnitTestCase设计用于单元测试,因此它在一个孤立的系统环境中测试Activity,换句话说,当你用这个测试类时,Activity不能与其他的Activity交互,
作为一个经验法则,如果想测试Activity与Android之间的交互的话,使用AndroidInstrumentationTestCase2,如果想对一个Activity作回归测试的话,使用AndroidUnitTestCase,

测试方法

每个测试用例提供了可以建立测试环境和控制应用程序的方法,例如所有的测试用例类都提供了JUnit的setUp()方法,来搭建测试环境,另外,你可以添加方法来定义单独的测试,,当你运行测试程序时,每个添加的方法都运行一次,如果你重写了setUp方法,它会在每个方法运行前运行,相似的tearDown()方法会在每个方法运行后运行,

测试用例提供了大量的对组件启动和停止控制的方法,由于这个原因,在运行测试之前,你需要明确告诉Android启动一个组件,例如你可以用getActivity()来启动一个Activity,在整个测试用例期间,你只能调用这个方法一次,或者每个测试方法一次,甚至你可以在单个的测试方法中,用它的finishing()来销毁Activity,然后再调用getActivity()重新启动一个,

运行测试并查看结果

编译完测试工程后,你就可以使用系统工具Activity Manager来运行测试程序。你给Activity Manager提供了TestRunner的名(一般是InstrumentationTestRunner,在程序中指定);名包括被测试程序的包名TestRunner的名。Activity Manager加载并启动你的测试程序,杀死主程序的任何实例,然后在测试程序的同一个进程里加载主程序,然后传递测试程序的第一个测试用例。这个时候,TestRunner会接管这些测试用例,运行里面的每个测试方法,直到所有的方法运行结束

测试什么

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容