Junit 单元测试

单元测试是开发人员需要自己完成的一个测试,可能有时候我们会觉得写测试会特别费时间,毕竟代码写下去并运行后我们还是可以保证它的正确性的。但是当项目被频繁的修改的时候就会有很多莫名奇妙的 bug 冒出来了,定位一个 bug 至少都需要经历重新编译一次程序然后再安装到手机上并重现 bug 的场景的流程,因此适当的写一些单元测试还是可以节省调试时间的。

什么是单元测试

  • 跟普通的代码相比,它是验证代码正确性的代码。
  • 它是由开发人员自己编写的测试代码。
  • 单元测试可便于后期的重构和维护
  • 可优化设计,单元测试能使开发人员的代码便于测试的方向优化,解除软件中的耦合。
  • 单元测试也是一种特殊的文档,它可展示函数或则类如何使用。

Android Studio 中生成好的单元测试

我们在 AS 新建的工程都会默认含有存放测试文件的包


简单的看下 ExampleUnitTest 文件里的代码

public class ExampleUnitTest {
    @Test
    public void addition_isCorrect() {
        assertEquals(4, 2 + 2);
    }
}

从以上代码就可以猜出 assertEquals 方法的作用就是用来判断其所传入的两个参数是否相等的,运行只需右键点击 run ,就可以得到一个结果,而这些都是毫秒级别的操作。

如何编写单元测试

在 Android 中虽然有很多的测试优秀的测试框架来替代 Junit ,但是由于 Junit 的简单性以及基础性,所以还是得先了解它再去学别的好一些,接下来看一个简单的例子 。

/**
 * 加法的接口
 */
public interface Adder {
    public int add (int a, int b);
}
/**
 * 加法实现类
 */
public class AdderImpl implements Adder {
    @Override
    public int add(int a, int b) {
        return a + b;
    }
}

选择对应的类,将光标停留在类名上,按下 ALT + ENTER ,在弹出的弹窗中选择Create Test 勾上图中的选项,就可生成一个文件。

我们在 setUp 函数初始化对象,在 tearDown 函数销毁对象,在 add 方法里测试该对象方法的正确性。

package cn.demon96.testandroidtest;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

public class AdderImplTest {
    Adder mAdder;

    @Before
    public void setUp() throws Exception {
        mAdder = new AdderImpl();
    }

    @After
    public void tearDown() throws Exception {
        mAdder = null;
    }

    @Test
    public void add() {
        assertEquals(0, mAdder.add(0,0));
        assertEquals(1, mAdder.add(-1,2));
        assertEquals(Integer.MAX_VALUE + 1, mAdder.add(Integer.MAX_VALUE,1));
    }
}

通过以上简单的操作,在一些重要的方法中适当的使用单元测试就可以在代码经过大量的修改的情况下只需要运行一下测试用例就可以在几秒中的时间里发现问题。

运行多个测试用例

当测试类多了的时候一个一个的运行反而会更浪费时间,这时候可以将测试类分组进行统一的运行,运行多个测试类用到的是 TestSuite 类,此类有两种用法。

  • 用法一:使用 JUnit4TestAdapter 包装测试类
package cn.demon96.testandroidtest;

import junit.framework.JUnit4TestAdapter;
import junit.framework.Test;
import junit.framework.TestSuite;

public class MainTest {
    public static Test suite() {
        TestSuite suite = new TestSuite("cn.demon96.testandroidtest");
        suite.addTest(new JUnit4TestAdapter(AdderImplTest.class));
        suite.addTest(new JUnit4TestAdapter(ExampleUnitTest.class));
        return suite;
    }
}
  • 用法二:使用注解
package cn.demon96.testandroidtest;

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
        AdderImplTest.class,
        ExampleUnitTest.class,
})
public class MainTest {

}

Junit 简介

Junit 是基于 java 语言的单元测试框架,已默认配置在安卓项目中。

testImplementation 'junit:junit:4.12'
  1. 使用时的注意事项
  • 测试的方法应该是 public
  • 可选用 setUp 进行初始化工作, 使用 tearDown 进行收尾工作。
  • 每个测试方法没有关联,执行的顺序也不一定是代码中的顺序,因此测试方法之间不要存在有依赖性。
  1. Junit 的断言和失败提示
  • 是否相等 assertEquals
    assertEquals(0, 0);

  • 是否为真 assertTrue
    assertTrue(true);

  • 是否为空 assertNull
    assertNull(null);

  • 是否为同一个对象 assertSame

       String s1 = "123";
       String s2 = s1;
       assertSame(s1, s2);
  • 失败提示
    assertNull("这个不是空的!", new Object());

更详细的用法可以看 Assert 类的源码。

测试哪些内容

  • 边界条件
  • 覆盖执行路径

参考

  • 《Android 开发进阶 从小工到专家》何红辉
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345