自动化测试作为整个产品生命周期过程中必不可少的一部分,可以得到快速的反馈,提前发现错误进行改正,避免把错误暴露在用户手中,同时也可以较少项目开销、缩短项目周期。

Local JUnit 和 Instrumented JUnit

Android测试是基于JUnit,可以分为两大类:

  • 依赖本地JVM的JUnit测试(Local JUnit), 测试用例在module-name/src/test/java/ 目录下, 不能访问Android框架功能;
  • 依赖Android手机的设备化测试(Instrumented JUnit), 测试用例在 module-name/src/androidTest/java/ 目录下; 必须要运行在Android真机或虚拟机;

两者的对比如下:

local-and-instrumented-test

test types description
Local unit test/Small tests 测试用例只在本地JVM上运行, 当测试用例中没有Android框架或者可以mock Android框架时,这类测试用例可以最大化的减少运行时间
Instrumented unit test/
Medium tests
测试用例必须要运行在Android设备或者虚拟机上, 可以获取设备信息等一系列信息, eg: Contex;
Components within your app only/ Large tests 集成测试,UI测试,只能在一个app内部进行测试,eg:Espresso;
Cross-app Components /
Large tests
集成测试,UI测试,可以跨多个app进行测试,eg:UI Automator;

公共API

  • @Before: 测试用例初始化操作,在测试类内部的每个测试方法运行之前都会运行一次该初始化方法,可以定义多个以@Before注释的方法;
  • @After: 测试用例收尾,包括释放资源和内存等。在测试类内部的每个测试方法运行之后都会运行一次该初始化方法,可以定义多个以@After注释的方法;
  • @Test: 一条测试用例;
  • @Rule: 为了灵活并且重复定义每个测试方法的表现形式,Android测试中主要有ActivityTestRule 和 ServiceTestRule;
  • @BeforeClass: 测试的初始化方法,和@Before的区别在于:@BeforeClass注释的方法在整个测试类中只运行一次,主要用于一些比较耗时或者耗费资源的操作;
  • @AfterClass: 测试的初始化方法,和@After的区别在于:@AfterClass注释的方法在整个测试类中只运行一次,主要用来释放资源;
  • @Test(timeout=expectedTime): 超时测试,用例耗时超过一个确定的时间则判断该测试用例失败,eg: @Test(timeout=500);
  • @Test(expected ...): 异常测试,期望测试方法抛出异常;
  • @Ignore: 跳过某个测试方法不执行;

Android Testing Support Library

Android Testing Support Library提供了一组APIs,利用这些APIs可以快速的建立和运行测试用例,包括JUnit测试和UI测试,包括以下几类API:

  • Espresso: UI测试框架,只能在一个app内部进行测试,不能跨app;
  • UI Automator: UI测试框架,可以跨多个app进行测试;
  • AndroidJUnitRunner: 针对android的junit4 测试框架;

主要框架

  • Local JUnit 的测试框架主要有:
    • Robolectric:是一个可以在JVM上运行Android框架相关的框架,可以测试控件、组件、资源等;
    • mock:mock 是一个可以模拟类、接口、方法等的框架,可以模拟android框架相关的部分;
    • powerMock:和 mock 功能类似,但是比 mock 更强大,可以 mock 私有、静态、final等类和方法;
  • Large tests 的测试框架主要有:
    • Android JUnit4 Rules:可以测试 Activity 或者 Service 等;
    • Espresso:UI 测试框架,只能在同一个 App 内部进行测试,不能和其它 App 进行交互;
    • UI Automator:UI 测试框架,可以和系统应用、其它应用进行交互;