开发测试篇-android测试-java测试(翻译自android training官网)

官网原文链接

Building Local Unit Tests

如果你的单元测试没有依赖或者只有android上的简单依赖,那么应该采用local test.这种方式高效,避免加载我们的app和单元测试代码到android设备或者模拟器上.会极大减少单元测试的运行时间.通过这种方式,一般会需要mocking framework,比如说Mockito来解决依赖关系

Set Up Your Testing Environment

测试的代码需要放置在 module-name/src/test/java/中,这个目录在我们创建工程时,已经存在

因为使用的是Jnit框架,因而也需要配置配置测试的依赖代码.如果还需要android的一些依赖,依赖Mockito库能够简化本地的测试.

Create a Local Unit Test Class

本地的测试类的写法,应该要像JUnit的测试类一样.Jnit的写法只需要在方法上添加一个 @Test 的注解即可,Jnit3的写法就比较复杂了.使用断言assert,如果没有达到预期,会抛出异常,但是为了使用更加方便,可以使用 Hamcrest matchers

import org.junit.Test;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class EmailValidatorTest {

    @Test
    public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
        assertThat(EmailValidator.isValidEmail("name@email.com"), is(true));
    }
    ...
}

Mock Android dependencies

默认情况下,Android Plug-in for Gradle会在我们执行本地测试时使用一个修改过的android.jar,这个jar并没有包含实际的代码,在我们的本地测试的代码中如果有调用到android的类的方法时,会抛出异常.这昂是用来保证我们的测试代码并没有依赖android平台的代码(在我们没有使用mocked时)

你可以使用mocking的framework调用外部的其他依赖,这样可以方便我的组件与依赖之间有预期的交互.你可以通过mock objects来替代android的依赖,从android的系统中独立的测试你的单元代码,同时验证你的代码在和依赖的调用中的正确性.Mockito*的模拟框架,java版本的(java 1.9.5 或者更高版本)提供了android单元测试的兼容性.通过Mockito,你可以配置mock objects在被调用时,返回特定的数值.

想要在本地测试时,使用Mockito框架, 需要以下的几个步骤:

  1. 在build.gradle中添加Mockito的library的依赖
  2. 在测试类的前面添加注解@RunWith(MockitoJUnitRunner.class).这个注解告诉Mockito test runner 验证你使用framework的正确性,并且简化你mock的object的初始化.
  3. 创建一个android依赖的mock的object,将注解@Mock添加到这个字段上.
  4. 为了模拟这个依赖的行为,你可以指定通过使用when()thenReturn()方法来指定特定的条件并且返回特定的值.

举例如下,mock Context对象

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import android.content.SharedPreferences;

@RunWith(MockitoJUnitRunner.class)
public class UnitTestSample {

    private static final String FAKE_STRING = "HELLO WORLD";

    @Mock
    Context mMockContext;

    @Test
    public void readStringFromContext_LocalizedString() {
        // Given a mocked Context injected into the object under test...
        when(mMockContext.getString(R.string.hello_word))
                .thenReturn(FAKE_STRING);
        ClassUnderTest myObjectUnderTest = new ClassUnderTest(mMockContext);

        // ...when the string is returned from the object under test...
        String result = myObjectUnderTest.getHelloWorldString();

        // ...then the result should be the expected one.
        assertThat(result, is(FAKE_STRING));
    }
}

如果android.jar的api抛出的异常对你的测试有问题时,你可以更改这个行为,通过返回null或者0.为了做到这个,可以在工程最顶底的build.gradle文件下,添加以下配置

android {
  ...
  testOptions {
    unitTests.returnDefaultValues = true
  }
}

警告: 设置returnDefultValues为true需要谨慎,因为null/0的返回值会引来测试的回归,这个是难以debug并且是容易使测试失败.设置为true的方式应该是你的最后一招.

Run Local Unit Tests ###

运行local test的方式,需要以下几步:

  1. 点击android studio的工具栏中的Sync Project按钮来同步Gradle
  2. 运行你的测试可以是以下的几种方式
    • 单个测试,直接打开Project 窗口, 右键 点击 test 并且点击 run
    • 测试一个类中所有的方法,右键点击文件的类或者方法,然后点击run
    • 测试一个文件夹中的所有测试, 右键点击目录,选择Run tests

android的gradle插件,编译本地代码的默认目录是 src/test/java/,构建一个测试的应用,然后使用默认的test runner类来运行. 然后Android studio 将结果展示在Run的窗口上

posted @ 2016-12-04 16:43  Panda Pan  阅读(4)  评论(0编辑  收藏  举报