Android测试(四):Local 单元测试

Android测试(四):Local 单元测试

发布时间 2017年12月20日 虫师

原文:https://developer.android.com/training/testing/unit-testing/local-unit-tests.html

如果你的单元测试没有依赖或者只有简单的Android依赖,则应该在本地开发机器上运行测试。这种测试方法非常高效,因为它可以帮助你避免每次运行测试时将目标应用程序和单元测试代码加载到真机或模拟器上的开销。因此,运行单元测试的执行时间大大减少了。通过这种方法,你通常使用mock框架(如Mockito)来完成任何依赖关系。

设置测试环境



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

你还需要配置项目的测试依赖,以使用JUnit 4框架提供的标准API。如果你的测试需要与Android依赖关系进行交互,请包含Mockito库以简化本地单元测试。要了解有关在本地单元测试中使用模拟对象的更多信息,请参阅模拟Android依赖关系。

在你的App程序的目录下找到build.gradle文件中,将这些库指定为依赖项:

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

创建本地单元测试类



你的本地单元测试类应该写成一个JUnit 4测试类。 JUnit是Java最流行和广泛使用的单元测试框架。这个框架的最新版本,JUnit 4,允许你用比前一版本更清晰,更灵活的方式编写测试。与以前的基于JUnit 3的Android单元测试方法(使用JUnit 4)不同,你不需要扩展junit.framework.TestCase类。也不需要在测试方法名称前加上“test”关键字,或者使用junit.framework或junit.extensions包中的任何类。

要创建基本的JUnit 4测试类,请创建一个包含一个或多个测试方法的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("[email protected]"), is(true));
    }
    ...
}

要测试应用程序中的组件是否会返回预期的结果,请使用junit.Assert方法执行验证检查(或断言),以便将待测组件的状态与某个预期值进行比较。 为了使测试更具可读性,可以使用Hamcrest匹配器(如is()和equalTo()方法)将返回的结果与期望的结果进行匹配。

Mock Android依赖



默认情况下,针对Gradle的Android插件将针对android.jar库的修改版本执行本地单元测试,该库不包含任何实际的代码。 相反,从你的单元测试方法调用Android类抛出一个异常。 这是为了确保只测试你的代码,而不依赖于Android平台的任何特定行为(你没有明确地mock)。

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

要使用此框架将mock对象添加到本地单元测试中,请遵循以下编程模型:

1、在你的 build.gradle 文件中包含Mockito库依赖项,如设置上面的测试环境中所述。

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

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

4、为了Stub依赖的行为,可以通过使用when()return()方法来满足条件时,可以指定一个条件和返回值。

以下示例显示如何创建使用模拟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类。

Error: “Method … not mocked”



如果您运行测试,从Android SDK调用API,你不会使用mock,可能会收到一个错误,说这种方法没有被模拟。 这是因为用于运行单元测试的android.jar文件不包含任何当前代码(这些API仅由设备上的Android系统映像提供)。

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

如果抛出的异常说你的测试有问题,可以更改行为,以便通过在项目的顶级build.gradle文件中添加以下配置来返回null或零:

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

注意:将returnDefaultValues属性设置为true应该小心。 null / zero返回值可以在测试中引入回归,这些回调很难调试,并且可能允许失败的测试通过。只能用它作为最后的手段。

运行本地单元测试



要运行您的本地单元测试,请按照下列步骤操作:

1、通过单击工具栏中的“ Sync Project”,确保您的项目与Gradle同步。

2、以下列其中一种方式运行测试:

  • 要运行单个测试,请打开“Project”窗口,然后右键单击以进行测试,然后单击“Run”。
  • 要测试类中的所有方法,请右键单击测试文件中的类或方法,然后单击“Run”。
  • 要在目录中运行所有测试,请右键单击该目录并选择“Run Tests”。

原文地址:https://www.cnblogs.com/jason89/p/9034053.html

时间: 2024-10-23 13:08:24

Android测试(四):Local 单元测试的相关文章

Android测试:从零开始2——local单元测试

上一篇分析了android项目的测试分类,这一篇讲local单元测试. 参考android官方文档. 测试前需要配置测试环境,新建项目后,目录下会出现app/src/test/java/文件夹,这个文件夹是用于存放local单元测试代码的(就是与androidAPI无关的测试). 在build.gradle配置文件中增加测试依赖: dependencies { // Required -- JUnit 4 framework testCompile 'junit:junit:4.12' // O

Android测试(三):Android 单元测试

Android测试(三):Android 单元测试 发布时间 2017年12月20日 虫师 原文:https://developer.android.com/training/testing/unit-testing/index.html 单元测试是你的应用程序测试策略的基本测试. 通过针对您的代码创建和运行单元测试,你可以轻松验证各个单元的逻辑是否正确. 在每次构建之后运行单元测试可帮助你快速捕获并修复由代码更改引入到应用程序的软件回归. 单元测试通常以可重复的方式实现尽可能小的代码单元(可以

(4.5.4)Android测试TestCase单元(Unit test)测试和instrumentationCase单元测试

Android单元和instrumentation单元测试 Developing Android unit and instrumentation tests Android的单元测试是基于JUnit的.可分为: 1.本地单元测试 - 可以在JVM上运行测试(速度快,优先考虑). 2.Instrumented单元测试 - 需要Android系统 Android的Gradle插件支持在JVM上执行Andr??oid单元测试.它使用特殊版本的android.jar(也称为 Android mocka

Android测试(五):Instrumented 单元测试

Android测试(五):Instrumented 单元测试 发布时间 2017年12月20日 虫师 原文:https://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html Instrumented 单元测试是在真机和模拟器上运行的测试,它可以利用Android框架API和支持的API(如Android测试支持库).如果你的测试需要访问工具信息(例如目标应用程序的Context),或者

Android测试:从零开始1——简介

参考文档:https://developer.android.com/training/testing/start/index.html 测试分类 使用android studio进行测试,首先需要先了解android测试的分类,新建工程后,项目会默认包含两个测试目录: 1.本地单元测试(Local unit tests) 测试代码位于module-name/src/test/java/,这些测试直接运行在本地JVM上,不需要使用Android框架的API. 2.设备测试(Instrumente

Android测试APP工具(一)

最近面试APP开发人员的时候,遇到了技术总监问 APP测试的概念性问题,后面感觉基本的项目流程.项目逻辑.屏幕适配. 测试是完全没有问题的,但是对于APP的性能测试.压力测试等高端的测试,还是存在着美中不足之处呀,毕竟是搞专业的APP开发 人员.但是,自己追求APP开发的流程是永不止境的,所以下定决心去了解深挖一下APP的测试,饿补一下APP的高端测试流程及其常 用工具.最近开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括android测试框 架.C

Android 测试、数据存储与访问、XML解析与生成

1.android测试 1.黑盒测试: 是以用户的角度,从输入数据与输出数据的对应关系出发进行测试的. 2. 白盒测试: 又称结构测试.透明盒测试.逻辑驱动测试或基于代码的测试. 3.单元测试: 又称模块测试,是开发者编写的一小段代码,用于检验被测代码的一个很小的.很明确的功能是否正确. 4.功能测试: 根据产品特性.操作描述和用户方案,测试一个产品的特性和可操作行为以确定它们满足设计需求. 5.压力测试: 主体向被观察者布置一定量任务和作业,借以观察个体完成任务的行为. 6.集成测试: 是单元

android产品研发(十九)-->android studio中的单元测试

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了webview中问题集锦,讲解了webview的性能优化.webview种入Cookie信息.activity退出的时候清除webview信息报错.如何通过java代码和js代码相互交互.webview如何下载文件以及腾讯的X5浏览服务等知识,这些都是我在使用webview中遇到的问题,难点,实践等,更多关于这些问题的说明,可以参考我的:android产品研发(十八)–>webview趟过的坑 本文我们将讲解如何在android studio

Android学习笔记-junit单元测试

我们都知道测试对于程序员来说是必不可少的,所以,做Android程序,也要学会使用junit,这里比着java的junit测试,要稍微复杂一点,需要一些配置,下面饿哦就介绍一下怎样使用junit的测试. 第一步: 1,新建包:包名是我们"要测试的业务方法报名后加+.test". 2,建类:类名是"test+要测试的类名". 3,建方法:方法名是"test+要测试的方法名". 当然这不是必须要遵守的,知识作为面向对象的开发,我们需要这样的规范. 比