Android Studio 单元测试

android studio 下载 | 2018-08-20 15:27

Android项目开发,随着迭代速度提高,除了黑盒测试、集成测试外,非常需要更可靠的质量保障。单元测试周期性对项目进行函数级别的测试,在良好的覆盖率下,能够持续维护代码逻辑,一定程度保障代码质量。

与Java单元测试相同,Android单元测试也是维护代码逻辑的白盒工程,但由于Android运行环境的不同,Android单元测试的环境配置以及实施流程均有所不同。

在Java中,编写代码面对的只有类、对象、函数,编写单元测试时可以在测试工程中创建一个对象出来然后执行其函数进行测试,而在Android中,编写代码需要面对的是组件、控件、生命周期、异步任务、消息传递等,需要JUnit之外的框架支持。

1、主流框架

Java单元测试框架:Junit、Mockito、Powermockito等;

Android单元测试框架:Robolectric、AndroidJUnitRunner、Espresso等。

RobolectricRobolectric运行在jvm上,但是框架本身引入了android依赖库,它的设计思路便是通过实现一套JVM能运行的Android代码,从而做到脱离Android环境进行测试。Robolectric做android单元测试,运行速度比运行在真机or模拟器快。Robolectric也有局限性,例如不支持加载so。当然,robolectric可以配合junit、mockito使用。Robolectric仅支持API21及以下,并且不支持jni库。

EspressoEspresso也是Google官方的android单元测试框架之一,在2013年的GTAC上首次提出,目的是让开发人员能够快速地写出简洁,美观,可靠的AndroidUI测试。很强大,测试代码非常简洁。Espresso本身运行在真机上,因此android任何代码都能运行,不像junit&mockito那样隔离依赖。缺点是,由于运行在真机,不能避免“慢”。

2、两种运行方式

在JVM中运行

在设备上运行

Android测试支持库提供了大量用于测试Android应用的框架:(1). AndroidJUnitRunner:适用于Android且与JUnit4兼容的测试运行器;(2). Espresso:UI测试框架;适合应用中的功能性UI测试;(3). UIAutomator:UI测试框架;适合跨系统和已安装应用的跨应用功能性UI测试。

1、AndroidJUnitRunnerAndroidJUnitRunner类是一个JUnit测试运行器,可让您在Android设备上运行JUnit3或JUnit4样式测试类,包括使用Espresso和UIAutomator测试框架的设备。测试运行器可以将测试软件包和要测试的应用加载到设备、运行测试并报告测试结果。

2、EspressoEspresso测试框架提供了一组API来构建UI测试,用于测试应用中的用户流。利用这些API,您可以编写简洁、运行可靠的自动化UI测试。Espresso非常适合编写白盒自动化测试。Espresso测试框架的主要功能包括:

(1). 灵活的API,用于目标应用中的视图和适配器匹配。(2). 一组丰富的操作API,用于自动化UI交互。(3). UI线程同步,用于提升测试可靠性。

3、UI AutomatorUI Automator测试框架提供了一组API来构建UI测试,用于在用户应用和系统应用中执行交互。利用UI Automator API,您可以执行在测试设备中打开“设置”菜单或应用启动器等操作。UI Automator测试框架非常适合编写黑盒自动化测试,其中的测试代码不依赖于目标应用的内部实现详情。UI Automator 测试框架的主要功能包括:

(1). 用于检查布局层次结构的查看器。(2). 在目标设备上检索状态信息并执行操作的API。(3). 支持跨应用UI测试的API。(4). 要求Android 4.3(API 18)或更高版本。

在编写单元测试案例的过程中,有一个重要的指标就是代码覆盖率。编写单元测试并不是为了追求100%覆盖率,但覆盖率在单元测试中仍占据着不可或缺的地位。

经典的JavaCoverageTool:Emma、Eclemma(Eclipse推荐使用)、Cobertura,感兴趣的同学可以自行查阅资料。

接下来,我们来看AndroidStudio支持的CoverageTool:jacoco、IntelliJ IDEA。

在AndroidStuido新建过工程的同学,应该有注意到,该工程默认会新建androidTest及test的测试包。在Android Stuido中,在androidTest编写的单元测试,默认使用jacoco插件生成包含代码覆盖率的测试报告;而test包下的单元测试代码,则直接使用Android Studio已有工具IntelliJ IDEA生成覆盖率,也可以通过自定义gradletask使用jacoco插件生成与androidTest相同格式的测试报告。

Android Studio 以简化测试为设计宗旨。只需完成几次点击,便可建立一个在本地JVM 上运行的JUnit测试,或建立一个在设备上运行的仪器测试。

测试代码的位置取决于您要编写的测试的类型。Android Studio为以下两种测试类型提供了源代码目录(源集):

1、本地单元测试module-name/src/test/java/这些测试在计算机的本地Java虚拟机(JVM)上运行,速度快。当您的测试没有Android框架依赖项或当您可以模拟Android框架依赖项时,可以利用这些测试来尽量缩短执行时间。test包则一般只存放与Model(数据层)相关的单元测试案例,但Android几乎无法实现MV完全解耦,所以目前在test包下可能也会涉及到View的测试。框架:Robolectric+Mockito+其他。

2、仪器测试module-name/src/androidTest/java/这些测试在硬件设备或模拟器上运行。这些测试有权访问InstrumentationAPI,让您可以获取某些信息(例如测试的应用的Context),并且允许您通过测试代码来控制受测应用。androidTest是存放一些与View(UI界面层)相关的单元测试案例的测试代码集。框架:Instrumentation、Espresso。运行方式从AndroidStudio2.0版本开始,已经能够智能检测当前的测试是androidTest还是test了,低版本的可以在BuildVariants中设置TestArtifact或者AddNewConfiguration时选择UnitTests(对应test),AndroidInstrumentationTests(对应androidTest)。

1、Espresso提供的基本API(1).ViewMatchers(2).ViewActions(3).ViewAssertions

2、Espresso测试基本流程(1).找到到具体的View

(2).执行一个操作

ViewActions

ViewMatchers

3、Android测试支持库配置

在Gradle项目中使用Android测试支持库,需在build.gradle文件中添加依赖关系,在AndroidStudio2.2+的版本,新建的Project中会自动为开发者添加Espresso自动化测试库的依赖: