18250719963 在线客服 人才招聘 返回顶部
企业动态 技术分享 行业动态

怎样在 MVP 中进行单元测试

2017-10-27分享

  如何在 MVP 中进行单元测试

  众所周知,测试一般都是工程师的事,然而对于以下基本的技术方面还是必须要了解的

  1. 什么是单元测试

  我们先来做这么一个体验。假设现在我们有个开发者要完成某个功能的开发,现在我们从电脑屏幕的视角来观察他接下来的一序列行为:

  他创建了一个类:A。

  光标在同一个地方闪烁了好久,他应该在思考 ....

  他在 A 写了一个方法 a。

  接着写了方法b、c、d。

  写的有点多了,滚动条来回滑动,他在阅读代码梳理逻辑。

  他打开了启动器,运行了A。

  运行报错了。

  他继续修改方法。

  再次打开启动器,运行了A。

  运行成功了,他收获了满足感。

  ......

  在这个观察中,我们看到他每次启动运行 A 所做的事其实就是“测试”,所以单元测试这件事其实是每个开发都做得最多的一件事,只是怎么让这件事变得更高效、更有意义是接下来要讲的。最后给出一个官方性的定义:单元测试又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。 程序单元是应用的最小可测试部件。

  2. Android 开发中进行单元测试

  2.1 AndroidStudio 中配置

  Android 为我们提供了两种跑测试的方式:

  Unit Tests

  Android Instarumentaion Tests

  模式选择

  2.1.1 Unit Tests

  Unit Tests 这种方式,跑的测试代码运行在本机 JVM 上,不需要编译Apk ,不需要 Android 设备的支持,速度相对快,当然,测试的对象不能含有 Android 的 API,否则运行时会报错。这个模式下,测试代码的默认路径是 test/java。单元测试的基础框架是 Junit,需要配置依赖:

  testCompile "junit:junit:4.12"

  然后我们来写一个被测试类:Calculator.java

  public class Calculator {

  public int add(int a, int b) {

  return a - b;

  }

  }

  把Test Artifact 切换到 Unit Tests 模式,然后我们创建一个针对这个类的测试:CalculatorTest.java

  goto

  选择 create new test

  goto

  public class CalculatorTest {

  @Before

  public void setUp() throws Exception {

  }

  @After

  public void tearDown() throws Exception {

  }

  @Test

  public void testAdd() throws Exception {

  }

  }

  自动生成了选择的测试方法,@Before、 @After、@Test 这几个注解来自 Junit 的 API,@Before 标记的方法,在测试用例启动时最先执行,然后执行 @Test 标记的方法,最后执行 @After 标记的方法。一般会在 @Before 的方法中做初始化工作,例如:创建被测试的对象, @Test 标记的就是我们要测试的方法,在其中执行验证方法。完善我们的测试代码:

  public class CalculatorTest {

  private Calculator calculator;

  @Before

  public void setUp() throws Exception {

  calculator = new Calculator();

  }

  @After

  public void tearDown() throws Exception {

  }

  @Test

  public void testAdd() throws Exception {

  // 验证方法执行结果,1+1 是否等于 2

  assertEquals(2, calculator.add(1 , 1));

  }

  }

  然后在这个类上右键,我们就可以运行这个测试类了。

  2.1.1 Android Instarumentaion Tests

  Android Instarumentaion Tests 包的测试代码运行在 Android 设备上,速度相对慢一些。测试代码默认路径是 androidTest/java。为了让测试能跑在设备上,需要 AndroidJUnitRunner 的支持:

  defaultConfig {

  applicationId "com.dalimao.demoforunittest"

  minSdkVersion 15

  targetSdkVersion 23

  versionCode 1

  versionName "1.0"

  // support Instarumentaion Tests

  testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'

  }

  配置依赖:

  androidTestCompile "com.android.support.test:runner:0.4.1"

  同时也离不开 Junit 的支持,配置依赖:

  androidTestCompile "junit:junit:4.12"

  创建测试和 Unit Tests 的一样,运行的时候需要连接模拟器或手机。

  3.开源框架

  测试框架很多,这里只简单说说比较流行的组合以及本例子中要使用的框架:

  Junit 是最简单最基本的 Java 单元测试框架。

  Mockito 强大的 Java 测试框架,强大之处在于能很方便的模拟对象,改变对象行为,同时提供了很多验证API。

  espresso:google 提供的 U I测试框架。

  4.MVP 架构中如何写单元测试

  理解了 AndroidStudio 中如何写最基本的单元测试,再结合几个开源框架,我们可以来写一些更为贴近实际开发的测试用例了。 目前 MVP 是 Android 项目的比较流行的架构模式,它的优点在代码的易测性

  上也得到了极好的体现,对 MVP 不熟悉的考验参考我之前的几篇博客:

  Android 应用架构概述

  Android应用架构之MVP实现

  对于 MVP 个层次我们怎么来写测试代码? 先来看看框架的选型:

  View层

  View的测试自然依赖于Android环境,同时需要模拟U交互的能力,使用 Espresso + JUnit,Espresso用于模拟和验证各种各样的UI操作,使用 Android Instarumentaion Tests 运行,代码存放于AndroidTest中。

  Presenter层

  Presenter 上对UI,下对 Model 都是接口抽象,控制流程逻辑,不涉及 Android API,用 Junit + Mockito 测试即可,使用 Unit Tests 运行,代码存放于test中。

  Model层

  负责数据的存取,数据可能来自于网络、数据库和内存,如果涉及设备相关的API、依赖Android系统环境,则使用 Android Instarumentaion Tests 运行,代码存放于androidTest中;反之可以Junit+Mockito,使用 Unit Tests 运行,代码存放于test中。

在线咨询
Copyright © 2005-2017 厦门市安聚尼股份有限公司 版权所有 闽ICP备17018743号-24