欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android单元测试(一):JUnit框架的使用

程序员文章站 2024-03-15 18:50:12
...

前言

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

工程介绍

新建android项目,模板代码会默认在build文件中添加JUnit的依赖,而单元测试代码是放在src/test/java下面的,如下图
Android单元测试(一):JUnit框架的使用

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);

    /**
     * 將時間格式如(2020-03-25 13:26:22)转化成时间戳
     * @param time
     * @return
     * @throws ParseException
     */
    public long dateToStamp(String time) throws ParseException {
       return sdr.parse(time).getTime();
    }

    /**
     * 将时间戳转化成时间
     * @param stamp
     * @return
     */
    public String stampToDate(long stamp){
        Date date = new Date(stamp);
        return sdr.format(date);
    }
}

基础用法

  • 首先测试方法stampToDate
public class ExampleUnitTest1 extends TestCase {

    //    private String time = "2020-03-25 15:00:00"; //1585119600000
    private String time = "2020-03-25";
    private long timeStamp = 4242511254555L;//2104-06-10 11:20:54
    /**
     * 测试将时间戳转成时间
     */
    @Test
    public void stampToDateTest(){
        String timeResult = DateUtil.INSTANCE.stampToDate(timeStamp);
        assertEquals(timeResult,"2104-06-10 11:20:54");
    }

    @Test
    public void dateToStampTest() throws ParseException {
        long data = DateUtil.INSTANCE.dateToStamp("2020-03-25");
        assertEquals(data,"1585119600000");
    }
}

测试步骤如下及测试结果展示如下图:
Android单元测试(一):JUnit框架的使用

  • 接下来测试 dateToStamp

我们知道在dateToStamp方法中,有抛出一个解析异常(ParseException)。也就是当参数没有按照规定格式去传,就会导致这个异常。Android单元测试(一):JUnit框架的使用
那我们怎么验证一个方法是否抛出了异常呢?可以给@Test注解设置expected参数来实现,如下:
Android单元测试(一):JUnit框架的使用
这样,如果抛出了异常,则测试用例通过。

参数化测试

按照以上方法进行测试,没进行一次测试都要修改参数及相应的值,使用以下方法可以避免这种麻烦