构建本地单元测试

本文翻译自:Building Local Unit Tests

水平有限自己感觉很多地方表达的并不到位,但找不到更好的表达方式,如果您觉着有更好的表达方式,帮助我改进!

构建本地单元测试

如果你的单元测试没有依赖或者仅有简单的Android依赖,你应该在你的本地开发机器上运行你的测试。这种测试是非常高效的,在你每次运行你的测试的时候,他可以帮助你避免加载整个待测试的App进入你的设备或者模拟器。因此,你的单元测试执行时间将大幅度的减少。这种测试,你通常需要使用mock框架,像Mockito,来满足任何的依赖关系。

设置你的测试环境

在你构建本地单元测试之前,确保你的工程按照开始你的测试中描述的那样配置了你的测试代码目录和工程依赖。

创建一个本地单元测试类

你的本地单元测试类应该按照JUnit 4 的测试类写法来写。JUnit 是Java平台使用最广泛的单元测试框架。最近发布的JUnit4框架相比之前的版本,可以让你编写出更干净,灵活的单元测试。不像之前基于JUnit3的Android单元测试,使用JUnit4 ,你不需要继承junit.framework.TestCase类。你也不需要在你的测试方法前添加test关键字,也不需要使用任何junit.framework或者是 junit.extensions包中的类。

为了创建一个基本的JUnit 4测试类,你需要创建一个java类,它包含一个或者多个测试方法。 一个测试方法使用@Test注解开始,同时包含你要测试和检验的单个功能的代码。

下面的实例向你展示了如何来实现一个本地单元测试类。测试方法emailValidator_CorrectEmailSimple_ReturnsTrue 验证正在测试中的App项目中的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));
    }
    ...
}

为了测试你的App中的那部分组件返回预期的结果,使用junit.Assert方法来进行预期结果的检验(或者断言)来比较正在测试下的组件的状态和预期的结果。为了让测试更具可读性,你可以使用 Hamcrest matchers (比如 is() 和 equalTo()方法)来将真实返回的结果和预期的结果进行匹配。

Mock Android 依赖

默认情况下, Android Plug-in for Gradle 执行你的本地单元测试借助一个修改过的android.jar 库,它不包含任何真实的代码。否则,如果你的单元测试如果调用了Android的具体方法,那么就会抛出一个异常来。

你可以使用mocking框架来让你的代码和外部依赖隔绝,以一种期待的方式和你的依赖进行交互这样会非常容易测试你的组件。通过mock对象替代Android依赖,当你在验证有Android依赖的方法调用时,可以让你的单元测试脱离android系统的一系列依赖。Java的Mockito框架(1.9.5 和更高版本)已经为Android的单元测试提供了完美的支持。使用了Mockito ,你可以配置mock对象当它被调用的时候让它返回一些指定的值。

为了使用该框架给你的本地单元测试添加一个mock对象,需遵从如下几步:

  1. 在build.gradle 文件中引入Mockito库的依赖,这在开始你的测试已经说过了。
  2. 在开始定义你的单元测试类之前,添加@RunWith(MockitoJUnitRunner.class)的注解。这个注解告诉Mockito测试运行器,你对该框架的使用是正确的,同时他可以简化mock对象的初始化。
  3. 为了对有Android 依赖的工程创建一个mock对象,在字段的定义前面,添加@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));
    }
}

To learn more about using the Mockito framework, see the Mockito API reference and the SharedPreferencesHelperTest class in the sample code.

学习更多关于Mockito框架,查看Mockito API reference和SharedPreferencesHelperTest 类在sample code

运行本地单元测试

按照开始你的测试中所描述的那样来运行你的本地单元测试。

时间: 2024-10-07 17:08:43

构建本地单元测试的相关文章

构建Instrumented单元测试

本文翻译自:构建Instrumented单元测试 水平有限自己感觉很多地方表达的并不到位,但找不到更好的表达方式,如果您觉着有更好的表达方式,帮助我改进! 构建Instrumented单元测试 Instrumented单元测试运行在你的物理设备或模拟器上,而不是你本地机器中的jvm.如果你需要获取instrumentation信息(比如目标App的Context)或者 你需要一个android framework 组件(比如Parcelable or SharedPreferences 对象)的

DOCKER构建本地局域网镜像

本人所使用的操作系统:CENTOS7 x64 DOCKER版本:1.12.5 实验机器: 192.168.88.101(DOKCER仓库机器) 192.168.9.71(用于开发的机器,二者虽不在统一网段,但是可以互通) 第一步,我是先从docker hub上拉了一个官方的centos镜像 [[email protected] ~]$ sudo docker pull centos 第二步,又拉了一个registry镜像用来构建本地仓库,同时本地目录同步到registry镜像中 [[email 

Jenkins构建本地项目到服务器上自动部署的方法

最近在用Jenkins做项目的自动部署,由于项目需求,现在要在本地构建后再放到Tomcat里.以下是本地构建步骤: 名称填写好,下面的选项是可选的. 源码管理这里选择none. 触发器这里,我的是在凌晨3点强制构建.可选. 这里是最重要的一步:选择Execute shell选项.可以使Jenkins执行一些shell命令. 点击之后会出现这个界面,在Command输入框里输入要执行的shell命令. 我指向的是/home/data/crm这个目录下,然后让其执行mvn打包指令. 在Build里输

spring boot?Swagger2文档构建及单元测试

首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建议先看一下快速入门的内容. @Controller:修饰class,用来创建处理http请求的对象 @RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Contro

使用webpack构建本地服务器

想不想让你的浏览器监测你代码的修改,并自动刷新修改后的结果,其实Webpack提供一个可选的本地开发服务器,这个本地服务器基于node.js构建,可以实现你想要的这些功能,不过它是一个单独的组件,在webpack中进行配置之前需要单独安装它作为项目依赖 npm install webpack-dev-server –g  在package.json里配置: "dev": "webpack-dev-server --port 8080 --colors --progress -

nodejs 构建本地web测试服务器 以及 解决访问静态资源的问题!

直接打开html文件,是以file:///方式打开的,这种方式很多时候会遇到跨域的问题,因此我们一般会搭建一个简易的本地服务器,来运行测试页面. 一.构建静态服务器 1.使用express模块 建立个js文件,命名server,内容代码如下: 1 var express = require('express'); 2 var app = express(); 3 var path = require('path'); 4 5 //指定静态资源访问目录 6 app.use(express.stat

docker学习-构建本地Registry

保存和分发镜像的最直接的方法就是使用Docker H u b,它是Docker公司维护的公共Regsitry,用户可以将自己的镜像保存到Docker H u b 免费的repository中.如果不希望别人访问自己的镜像,也可以购买私有repository.一般我们可以使用Docker H u b上传和下载镜像,虽然十分方便,但是还是有些限制,比如:1.需要外网连接,而且上传和下载速度慢2.上传到Docker H u b 的镜像任何人都能够访问,虽然可以用私人repositroy,但不是免费的3

Linux-测试环境构建本地YUM全类型仓库(Base,Extras,epel)

1.同步yum源的脚本 #cat /data/yum_repo/rsync_yum_shell/rsync_yumrepo.sh #!/bin/bash #script name:rsync_yumrepo.sh RsyncBin="/usr/bin/rsync" RsyncPerm='-avrt --delete --no-iconv --bwlimit=100000' Centos_7_base='/data/yum_repo/Centos-7/Base/' Centos_7_ep

构建本地yum源之rpmbuild

组内准备搭建内部yum源,在这之前需要规范软件的安装目录,并把现有的应用打包. 目前接触两种rpm打包工具,rpmbuild和fpm. - rpmbuild rpmbuild关键是spec文件编写. 环境搭建 yum -y install rpm-build rpmdevtools useradd rpm; su rpm 注: rpm打包需要特定目录下,在近期版本下rpmbuild可以在非root账号家目录下创建打包目录: rpmdev-setuptree [[email protected]