使用Kotlin Spek 2来做Android的行为驱动测试

时间:2022-06-01 16:34:28

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"
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通过把情景分为三部分,这样我们就可以很容易定义个基于行为驱动的开发的测试用例,具有很高的可读性。