3、构建本地单元测试

构建本地单元测试

如果您的单元测试没有依赖关系或者仅仅简单的依赖 Android ,你应该将你的测试运行在本地的开发机器上。这种测试方式是高效的,因为他避免了每次将目标应用和单元测试代码运行到物理设备或者模拟器上的开销。因此运行单元测试的时间将大大减少。使用这种方法,你通常使用一种模拟框架像 Mockito 来实现任何依赖关系。

设置你的测试环境

在你的 Android Studio 项目中,你必须将本地单元测试的源文件存储在 module-name/src/test/java/ 目录下,当你创建一个新的工程时这个文件夹已经存在。

你也需要为你的工程配置测试依赖以使用 JUnit4 框架提供的标准 API。如果的测试需要与 Android 依赖交互,Mockito 库会简化你的本地单元测试。

在你的App级 build.gradle 文件中,你需要将这些库指定为依赖关系:

dependencies {
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}

创建一个本地的单元测试类

你本地的单元测试类应该被写成一个 JUnit4 测试类,JUnit 是最受欢迎和广泛使用的 Java 测试框架。这个框架最新的版本,JUnit4 ,允许你使用比以前版本更简介更灵活的方式编写测试。与基于 JUnit3 的 Android 单元测试方法不同的是,使用 JUnit4 ,你不需要继承 junit.framework.TestCase 类。你也不需要在你的测试方法上加上 ‘test’ 关键字前缀,或者使用 junit.frameworkjunit.extensions 包中的任何类。

要创建一个基本的 JUnit4 测试类,请创建一个或多个测试方法的 Java类,测试方法以 @Test 注解开始,并包含用于执行和验证你想测试的组件的单个功能的代码。

下面的例子展示了你应该如何实现一个本地的单元测试类,测试方法 emailValidator_CorrectEmailSimple_ReturnsTrue 验证被测试程序中 isValidEmail() 方法是否返回正确的结果。

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));
    }
    ...
}

为了测试你的App组件是否返回期盼的结果,使用 junit.Assert 方法来执行验证检查(或断言)比较被测试组件的状态与某些预期值。为了让测试可读性更强,你可以使用 Hamcrest matchers (例如is()和equalTo()方法)来比较返回结果和期望结果。

Mock Android依赖

默认情况下,Android Plug-in for Gradle 针对不包含任何实际代码的 android.jar 库的修改版本执行本地单元测试。相反,从单元测试中调用 Android 类的方法会抛出异常。这是为了保证你只是测试你自己的代码而不依赖任何 Android 平台的特殊行为。

你可以使用一个模拟框架来清除你代码中的外部依赖,以便轻松地测试你你的组件是否以一个期望的方式与依赖交互。通过用模拟对象来替代 Android 依赖,你可以将单元测试从 Android 系统的其余部分分离,同时验证这些依赖项的正确项是否被调用。Mockito Java 模拟框架(1.95版本或更高)提供了与 Android 单元测试的兼容性。使用 Mockito ,你可以配置模拟对象以便在调用时返回特定的值。

要使用此框架给你的本地单元测试添加一个模拟对象,请遵循此编程模型:

  1. 在你的 build.gradle 文件中添加 Mockito 依赖

  2. 在开始定义你的单元测试类时,添加 @RunWith (MockitoJUnitRunner.class) 注解。这个注解告诉 Mockito 测试运行器验证你框架的使用是否是正确的并且简化了你的模拟对象的初始化。

  3. 要为 Android 依赖创建一个模拟对象,请在字段声明之前添加 @Mock 注解。

  4. 为了存储依赖关系的行为,可以制定一个条件和一个返回值,当条件满足时使用 when()thenReturn() 方法。

下面的例子展示了你应该怎么使用一个模拟的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));
    }
}

要了解更多关于 Mockito 框架的信息,请看 Mockito API 参考示例代码 中的 SharedPreferencesHelperTest 类。

错误:”Method … not mocked”

如果你运行的测试调用了你没有模拟的 Android SDK 的 API,你将会收到一个错误说这个方法没有被模拟。那是因为用于执行单元测试的 android.jar 文件不包含任何实际的代码(这些 API 仅由设备上的 Android 系统镜像提供)。

相反,所有的方法都会默认抛出异常,这是为了确保你的单元测试仅仅是用来测试你的代码的,而不依赖于任何特定行为的 Android 平台(没有明确的模仿,例如使用 Mockito )。

如果这个抛出的异常对你的测试造成了影响,你可以通过在你的 app 的 build.gradle 文件中添加下面的配置来改变行为,这样方法就会返回 null 或者 0。

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

注意: 将 returnDefaultValues 属性设为true应该小心使用,值为 null/0 可能给你的测试带来坏处,这很难去调试,并且可能使失败的测试通过。 所以将它作为最后的解决方案。

运行本地的单元测试

要运行本地的单元测试,请参考这些步骤:

  1. 确保你的项目的Gradle是同步的,通过点击工具栏的 Sysc Project 按钮。

  2. 以下面方式之一运行测试:

    • 要运行一个简单的测试,请打开 Project 窗口,然后右键单击一个测试,并点击 Run 选项。

    • 要测试一个类中的所有方法,请右键点击一个类或者测试文件中的一个方法然后点击 Run 选项。

    • 要运行一个文件夹中所有的测试,请右键点击这个文件夹,并选择 Run tests 选项。

Android Gradle 插件编译本地单元测试代码位于默认的文件夹 (src/test/java/) ,构建一个测试应用,然后使用默认的测试执行类本地执行。Android Studio 将会在 Run 窗口显示结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值