当前位置:   article > 正文

Android单元测试(一):JUnit框架的使用_junit 不使用模拟器

junit 不使用模拟器


在开始之间先介绍一下单元测试框架之间的关系:
java单元测试框架:Junit、Mockito、Powermockito等;Android:Robolectric、AndroidJUnitRunner、Espresso等。
最开始建议先学习Junit & Mockito。junit运行在jvm上,所以只能测试纯java,若要测试依赖android库的代码,可以用mockito隔离依赖(下面会谈及)。
Junit官网
Mockito官网
之后学习AndroidJUnitRunner,Google官方的android单元测试框架之一,使用跟Junit是一样的,只不过需要运行在android真机或模拟器环境。由于mockito只在jvm环境生效,而android是运行在Dalvik或ART,所以AndroidJUnitRunner不能使用mockito。
然后可以尝试Robolectric & Espresso。Robolectric运行在jvm上,但是框架本身引入了android依赖库,所以可以做android单元测试,运行速度比运行在真机or模拟器快。但Robolectric也有局限性,例如不支持加载so,测试代码也有点别扭。当然,robolectric可以配合junit、mockito使用。Espresso也是Google官方的android单元测试框架之一,强大就不用说了,测试代码非常简洁。Espresso本身运行在真机上,因此android任何代码都能运行,不像junit&mockito那样隔离依赖。缺点也是显而易见,由于运行在真机,不能避免“慢”。
Robolectric官网

其实espresso应该是几款框架中最简单的,但笔者还是建议先学习junit&mockito。因为新手很可能会因为espresso的强大、简单,而忽略了junit做单元测试带来的巨大意义。例如,前文提到“快速定位bug”、“提高代码质量”,espresso慢,有违“快速”;用espresso不用修改工程任何代码,这不利于提高代码质量。

前言

以前工作中,没有写过测试用例,每次功能做完之后,都是运行在手机上或是模拟器上,进行测试。最近看了一些公司的招聘信息,部分公司要求会单元测试,于是了解了一下android单元测试的资料,我去,单元测试用起来真是好处多多,得抓紧时间学习一下了。

工程介绍

新建android项目,模板代码会默认在build文件中添加JUnit的依赖,而单元测试代码是放在src/test/java下面的,如下图
在这里插入图片描述

JUnit介绍

什么是JUnit

Unit是Java编程语言的单元测试框架,用于编写和可重复运行的自动化测试。

JUnit引入

使用时在app的build文件中添加依赖(新建工程时,会默认在build文件中添加JUnit的依赖)

    testCompile 'junit:junit:4.12'

    JUnit注解

    注解 描述
    @Test 测试注解,标记一个方法可以作为一个测试用例 。
    @Before Before注解表示,该方法必须在类中的每个测试之前执行,以便执行某些必要的先决条件。
    @BeforeClass BeforeClass注解指出这是附着在静态方法必须执行一次并在类的所有测试之前,这种情况一般用于测试计算、共享配制方法(如数据库连接)。
    @After After注释表示,该方法在每项测试后执行(如执行每一个测试后重置某些变量,删除临时变量等)。
    @AfterClass 当需要执行所有测试在JUnit测试用例类后执行,AlterClass注解可以使用以清理一些资源(如数据库连接),注意:方法必须为静态方法。
    @Ignore 当想暂时禁用特定的测试执行可以使用这个注解,每个被注解为@Ignore的方法将不再执行
    @Runwith @Runwith就是放在测试类名之前,用来确定这个类怎么运行的。也可以不标注,会使用默认运行器。
    @Parameters 用于使用参数化功能。
    @SuiteClasses 用于套件测试

    执行顺序:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

    JUnit断言

    断言 描述
    void assertEquals([String message],expected value,actual value) 断言两个值相等。值类型可能是int,short,long,byte,char,Object,第一个参数是一个可选字符串消息
    void assertTrue([String message],boolean condition) 断言一个条件为真
    void assertFalse([String message],boolean condition) 断言一个条件为假
    void assertNull([String message],java.lang.Object object) 断言一个对象为空(null)
    void assertNotNull([String message],java.lang.Object object) 断言一个对象不为空(null)
    void assertSame([String message],java.lang.Object expected,java.lang.Object actual) 断言两个对象引用相同的对象
    void assertNotSame([String message],java.lang.Object unexpected,java.lang.Object actual) 断言两个对象不是引用同一个对象
    void assertArrayEquals([String message],expectedArray,resultArray) 断言预期数组和结果数组相等,数组类型可能是int,short,long,byte,char,Object

    JUnit使用

    我们通过对下面的类进行简单类的测试,来说明JUnit是怎么使用的。

    package com.app.wayee.androidunittest;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    
    public class DateUtil {
       
        //日期转换
        public static DateUtil INSTANCE = new DateUtil();
         private SimpleDateFormat sdr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
    
        /**
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/591331
    推荐阅读
    相关标签
      

    闽ICP备14008679号