一、前言
? 上篇文章讲述了单元测试Junit 的基本用法,在日常工作中,上篇的文章差不多就够用了。不过出于一些特殊的情况,这里对其它一些不常用的用法做下记录。
二、其它注解
-
@Ignore 忽略测试,标注在函数上那么运行时候就会在运行测试的时候忽略该函数,标注在类上就会忽略这个类的所有测试,简单示例如下: import org.junit.Test
import org.junit.Before
import org.junit.Ignore
@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)
}
}
只是需要注意以下几点:
- 创建一个空类作为测试套件的入口。
- 使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。
- 将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。
- 将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。
- 保证这个空类使用 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 。这个的作用如下:
- 创建虚拟对象的实例
- 在虚拟对象中设置状态和描述
- 结合虚拟对象调用域代码作为参数
- 在虚拟对象中验证一致性
七、参考链接
-
junit的教程 https://www.w3cschool.cn/junit/ -
Android 单元测试之Mockito https://blog.csdn.net/chennai1101/article/details/94633446 -
Mocktio https://site.mockito.org/
|