使用Kotlin Spek 2来做Android的行为驱动测试
Spek是Kotlin一个很强大的行为驱动测试(behavior-driven testing)的框架。在android里使用spek2,我们可以很容易地定义一个清晰的,可读性高的测试用例。
地址:https://www.spekframework.org/
Spek2是在JUnit 5上运行的一个框架。在使用之前需要安装JUnit5.
安装JUnit 5
打开project级别的build.gradle,添加JUnit 5的仓库以及依赖:
repositories {
maven { url "http://dl.bintray.com/jetbrains/spek" }
}
dependencies {
classpath "de.mannodermaus.gradle.plugins:android-junit5:1.5.1.0"
}
接着打开app级别的build.gradle,添加junit 5插件:
apply plugin: "de.mannodermaus.android-junit5"
依赖如下:
testImplementation "org.junit.jupiter:junit-jupiter-api:5.5.1"<br></br>testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.5.1"
安装Spek 2
在app级别的build.gradle,添加junitPlatform到testOptions中,如下:
android {
testOptions {
junitPlatform {
filters {
engines {
include 'spek2'
}
}
}
}
}
接着添加spek2的依赖:
testImplementation "org.spekframework.spek2:spek-dsl-jvm:2.0.7"
testImplementation "org.spekframework.spek2:spek-runner-junit5:2.0.7"
添加测试用例
如下是一个简单的数学类以及函数:
class Math {
fun multiplication(x: Int, y: Int) = x.times(y)
fun division(x: Int, y: Int) = x.div(y)
}
添加测试用例如下:
package com.project.myapplication
import org.junit.jupiter.api.Assertions.assertEquals
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.gherkin.Feature
object MathTest : Spek({
Feature("math") {
val math = Math()
Scenario("do multiplication") {
var a = 0
var b = 0
var multiple = 0
val result = 21
Given("initial a and b") {
a = 3
b = 7
}
When("multiple a with b") {
multiple = math.multiplication(a, b)
}
Then("it should return multiplication between a and b") {
assertEquals(result, multiple)
}
}
Scenario("do division") {
var a = 0
var b = 0
var division = 0
val result = 3
Given("initial a and b") {
a = 21
b = 7
}
When("division a with b") {
division = math.division(a, b)
}
Then("it should return division between a and b") {
assertEquals(result, division)
}
}
}
})
右键选择执行测试用例就可以看到结果了。
说明:
Spek通过GWT (Given When Then)的方式来书写测试用例,或者叫做情景。也就是说GWT分别代表了测试用例的三部分:
- Given:是测试用例的预设状态,可以认为是此情景下的预置条件。
- When:表示行为执行的部分,可以认为执行逻辑的部分
- Then:用于描述判断由于指定行为而您期望的更改
Spek通过把情景分为三部分,这样我们就可以很容易定义个基于行为驱动的开发的测试用例,具有很高的可读性。