Android测试之Junit(三)

本文深入探讨了Junit的高级特性,包括使用@Ignore忽略测试、@Test注解的异常和超时测试、套件测试的实现以及断言的多种方法。同时,介绍了Mockito插件在单元测试中的应用,帮助开发者更有效地进行测试和代码质量把控。
摘要由CSDN通过智能技术生成

一、前言

​ 上篇文章讲述了单元测试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进行记录。

序号方法和描述
1void assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否平衡
2void assertTrue(boolean condition) 检查条件为真
3void assertFalse(boolean condition) 检查条件为假
4void assertNotNull(Object object) 检查对象不为空
5void assertNull(Object object) 检查对象为空
6void assertSame(Object expected, Object actual) assertSame() 方法检查两个相关对象是否指向同一个对象
7void assertNotSame(Object expected, Object actual)** **assertNotSame() 方法检查两个相关对象是否不指向同一个对象
8void assertArrayEquals(expectedArray, resultArray) assertArrayEquals() 方法检查两个数组是否相等

六、Junit插件

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

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

七、参考链接

  1. junit的教程

    https://www.w3cschool.cn/junit/

  2. Android 单元测试之Mockito

    https://blog.csdn.net/chennai1101/article/details/94633446

  3. Mocktio

    https://site.mockito.org/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值