文章目录

  • 一、前言
  • 二、其它注解
  • 三、执行测试
  • 四、套件测试
  • 五、断言
  • 六、Junit插件
  • 七、参考链接


一、前言

上篇文章讲述了单元测试Junit的基本用法,在日常工作中,上篇的文章差不多就够用了。不过出于一些特殊的情况,这里对其它一些不常用的用法做下记录。

二、其它注解

  • @Ignore 忽略测试,标注在函数上那么运行时候就会在运行测试的时候忽略该函数,标注在类上就会忽略这个类的所有测试,简单示例如下:
import org.junit.Test

import org.junit.Before
import org.junit.Ignore

/**
 * Example local unit test, which will execute on the development machine (host).
 *
 * See [testing documentation](http://d.android.com/tools/testing).
 */
@Ignore
class ExampleUnitTest {

    @Before
    fun before(){

    }
    @Ignore
    @Test
    fun test1() {
        println("这是测试函数1")
    }
    @Test
    fun test2() {
        println("这是测试函数2")
    }
}
  • @Test(expected = NullPointerException::class)这个是对异常进行测试,如果测试用例没有抛出该异常则测试不通过,简单示例如下:
@Test(expected = NullPointerException::class)
    fun test1() {
        val str: String ?= null
        val size = str!!.length
    }
  • @Test(timeout = 500)这个注释是对超时进行测试,倘若函数运行时间超过指定时间则会抛出异常,示例如下:
@Test(timeout = 500)
    fun test1() {
        Thread.sleep(300)
    }

三、执行测试

一般来说IDE都可以自动识别被@Test标注的代码,可以很方便的进行运行。但是不排除一些开发工具用不了这种方式,所以这里使用最原始的代码方式进行运行,熟悉命令行的,可以使用命令行运行一个java文件。对于java来说入口为main函数。需要注意的是在Android Studio中,新版本和比较旧的几个版本可以在类中直接运行main函数,中间有几个版本是无法运行main函数的。示例如下:

class TestRunner {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            val result: org.junit.runner.Result = JUnitCore.runClasses(TestExampleJunit::class.java)
            for (failure in result.getFailures()) {
                println(failure.toString())
            }
            System.out.println(result.wasSuccessful())
        }
    }
}

class TestExampleJunit {
    var message = "Hello World"

    @Test
    fun testPrintMessage() {
        Assert.assertEquals(message, "Hello "+"World")
    }
}

可以看出这里是通过main函数的运行来看到结果。其运行结果依然在Run运行的窗口。只是会缺少很多测试的工具可以使用,被当做了一个纯粹的普通java函数来处理

四、套件测试

套件测试可以一次运行多个测试类,如果不依赖于IDE的话可以使用这种方式进行多个单元测试类的测试。如下:

@RunWith(Suite::class)
@Suite.SuiteClasses(value = [JunitTestOne::class, JunitTestTwo::class])
class AllTests {
}

class JunitTestOne {
    @Test()
    fun test() {
        println("测试一。。。")
        Assert.assertTrue(true)
    }
}

class JunitTestTwo {
    @Test
    fun test() {
        println("测试二。。。")
        Assert.assertTrue(true)
    }
}

只是需要注意以下几点:

  1. 创建一个空类作为测试套件的入口。
  2. 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。
  3. 将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。
  4. 将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。
  5. 保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数

五、断言

对于日常开发来说,想要观察某个结果,常常喜欢使用Log日志工具。但是在测试中使用断言会更好一点,因为断言会记录在测试记录中,但是Log日志却不会,对于测试统计会比较有用。断言有很多中,各个测试框架都有自己的断言方式。这里对Junit的断言Assert进行记录。

序号

方法和描述

1

void assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否平衡

2

void assertTrue(boolean condition) 检查条件为真

3

void assertFalse(boolean condition) 检查条件为假

4

void assertNotNull(Object object) 检查对象不为空

5

void assertNull(Object object) 检查对象为空

6

void assertSame(Object expected, Object actual) assertSame() 方法检查两个相关对象是否指向同一个对象

7

void assertNotSame(Object expected, Object actual)** **assertNotSame() 方法检查两个相关对象是否不指向同一个对象

8

void assertArrayEquals(expectedArray, resultArray) assertArrayEquals() 方法检查两个数组是否相等

六、Junit插件

Mock是跟Junit配合使用的测试插件,主要是虚拟对象,目前使用较多的是Mocktio。这个的作用如下:

  • 创建虚拟对象的实例
  • 在虚拟对象中设置状态和描述
  • 结合虚拟对象调用域代码作为参数
  • 在虚拟对象中验证一致性

七、参考链接

  1. junit的教程
    https://www.w3cschool.cn/junit/
  2. Android 单元测试之Mockito
  3. Mocktio
    https://site.mockito.org/