浅谈Android单元测试的作用以及简单示例

 更新时间:2017年08月16日 09:00:05   作者:许佳佳233  
本篇文章主要介绍了浅谈Android单元测试的作用以及简单示例,具有一定的参考价值,有兴趣的可以了解一下

前提概要

受人嫌弃的单元测试

对于单元测试这个知识点,其实很多开发者是不太接触的,包括笔者,在实习之前也并未实用过单元测试,或者说并没感受到单元测试的好处。

对于bug的调试,笔者之前更倾向于使用log和断点调试,可以说会了这两个,大部分的逻辑bug都能自己解决了。这两个与看似臃肿的单元测试代码相比更受大家的喜爱。

但是,使用log和断点调试的前提是开发人员较少,甚至是单人开发的情况。如果我自己开发,我完全可以每次都使用集成测试,我知道每一个功能会涉及哪些模块的代码,然后根据逻辑设置log或者断点调试。

多人开发难以处理的问题

然而,如果是多人开发呢?每一个模块的代码很可能是由不同的人分开负责的,bug的产生由不同模块共同产生。每一个模块的代码可能都比较复杂,产生bug后,阅读其他人的模块本身比较浪费时间,其次基本不可能让你去修改其他人的代码,这可能会破坏他人的代码结构。

而且错误可能也并不在其他人的代码中,也可能是你们的交互方式有问题。产生bug的原因有太多,并且由单人直接log或者断点调试难以处理,那么这种情况怎么办呢?

单元测试就一定程度上处理了这种困难的情况:给每一个模块加上单元测试,如果该模块可以通过单元测试,就代表没有问题。

在这种情况下,程序员们面对的问题不再是要让整个项目到达理想的效果,而是让自己所面对的单元测试可以通过。这样就大大减少了多人开发中的交互成本。

简单示例

主要就两个文件:

这里写图片描述

package com.example.xujiajia_sx.myexpressotest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

  }

  public static int calculate(int a,int b){
    return a+b+1;
  }

}

package com.example.xujiajia_sx.myexpressotest;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 * Created by xujiajia_sx on 2017/8/14.
 */

public class SimpleTest {

  @Test
  public void CalculateTest() throws Exception {
    assertEquals(4, MainActivity.calculate(1,2));
  }
}

这个例子是测试了MainActivity.calculate()方法。可以在不运行这个app的情况下直接通过按SimpleTest .CalculateTest()左边的小三角测试,如下图:

这里写图片描述

我们calculate()方法的逻辑是返回a+b+1,所以是4,最终不会报错,如果我们把assertEquals中的4改成3,效果如下:

这里写图片描述

如图,测试会直接报错,并且定位到错误的那一行,然后我们就可以看到是MainActivity.calculate()输出的值不等于3所造成的。

Assert方法

示例本身比较简单,但是对于刚刚接触单元测试读者可能对assertEquals()比较陌生,这是Assert这个类中的静态方法,单元测试中一般就是通过它来判断是否达到理想的效果。

笔者此处使用了int之间的判断,Assert中还有很多其他的用法,笔者可以去AndroidDevelpers上自己查看,此处为了方便,笔者为了方便就直接复制了。

static void assertEquals(boolean expected, boolean actual)

static void assertEquals(String message, long expected, long actual)

static void assertEquals(short expected, short actual)

static void assertEquals(String message, String expected, String actual)

static void assertEquals(String message, int expected, int actual)

static void assertEquals(Object expected, Object actual)

static void assertEquals(String message, boolean expected, boolean actual)

static void assertEquals(String expected, String actual)

static void assertEquals(String message, short expected, short actual)

static void assertEquals(String message, Object expected, Object actual)

static void assertEquals(char expected, char actual)

static void assertEquals(byte expected, byte actual)

static void assertEquals(double expected, double actual, double delta)

static void assertEquals(String message, char expected, char actual)

static void assertEquals(float expected, float actual, float delta)

static void assertEquals(String message, double expected, double actual, double delta)

static void assertEquals(String message, byte expected, byte actual)

static void assertEquals(String message, float expected, float actual, float delta)

static void assertEquals(long expected, long actual)

static void assertEquals(int expected, int actual)

static void assertFalse(String message, boolean condition)

static void assertFalse(boolean condition)

static void assertNotNull(Object object)

static void assertNotNull(String message, Object object)

static void assertNotSame(String message, Object expected, Object actual)

static void assertNotSame(Object expected, Object actual)

static void assertNull(String message, Object object)

static void assertNull(Object object)

static void assertSame(String message, Object expected, Object actual)

static void assertSame(Object expected, Object actual)

static void assertTrue(String message, boolean condition)

static void assertTrue(boolean condition)

static void fail(String message)

static void fail()

static void failNotEquals(String message, Object expected, Object actual)

static void failNotSame(String message, Object expected, Object actual)

static void failSame(String message)

static String  format(String message, Object expected, Object actual)

 总结

这篇文章主要介绍了Android单元测试的作用和简单的示例。但是简单的对方法的测试相信并不能满足求知欲强烈的读者。

下一篇文章笔者会讲述android单元测试中对Activity的测试方法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android Activity的生命周期与启动模式全面解读

    Android Activity的生命周期与启动模式全面解读

    虽然说我们天天都在使用Activity,但是你真的对Activity的生命机制完全了解了吗?Activity的生命周期方法只有七个,但是其实那只是默认的情况。也就是说在其他情况下,Activity的生命周期可能不会是按照我们以前所知道的流程,这就要说到Activity的启动模式
    2021-10-10
  • kotlin源码结构层次详解

    kotlin源码结构层次详解

    这篇文章主要为大家介绍了kotlin源码结构层次详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 深入Android HandlerThread 使用及其源码完全解析

    深入Android HandlerThread 使用及其源码完全解析

    这篇文章主要介绍了深入Android HandlerThread 使用及其源码完全解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Android开发之Android.mk模板的实例详解

    Android开发之Android.mk模板的实例详解

    这篇文章主要介绍了Android开发之Android.mk模板的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • Android自定义可循环的滚动选择器CycleWheelView

    Android自定义可循环的滚动选择器CycleWheelView

    Android自定义可循环的滚动选择器CycleWheelView替代TimePicker/NumberPicker/WheelView,很实用的一篇文章分享给大家,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 了解Android OpenGLES2.0(一)

    了解Android OpenGLES2.0(一)

    OpenGLES2.0是一个功能强大,调用方便的底层图形库,这篇文章主要为大家详细介绍了Android OpenGLES2.0的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • SimpleCommand框架ImageLoader API详解(三)

    SimpleCommand框架ImageLoader API详解(三)

    这篇文章主要为大家详细介绍了SimpleCommand框架ImageLoader API,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android应用的Material设计中图片的相关处理指南

    Android应用的Material设计中图片的相关处理指南

    这篇文章主要介绍了Android应用的Material设计中图片的相关处理指南,除了介绍新的方法外文中还给出了一些设计标准样例仅供参考,需要的朋友可以参考下
    2016-04-04
  • Android定时开机的流程详解

    Android定时开机的流程详解

    这篇文章给大家分享了Android定时开机及其实现流程,对此知识点有兴趣的朋友,可以学习参考下。
    2018-07-07
  • Android Binder入门学习笔记

    Android Binder入门学习笔记

    这篇文章主要给大家介绍了关于Android Binder入门学习的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02

最新评论