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

版权声明:著作权归作者所有。

相关推荐

使用Robolectric写Android单元测试

Robolectric是一个单元测试框架,运行在jvm上。相对于在Android模拟器或设备上运行测试需要花费一分甚至更长时间,Robolectric只需要几秒钟。这里简单介绍下使用Robolectric做单元测试。添加依赖首先在build.gradle添加Robolectric依赖,并设置android的测试选项unitTests.includeAndroidResources为truetest

Java 8使用parallel Stream测试StringBuilder线程安全

我们知道StringBuilder不是线程安全的,但如何证明它非线程安全呢?测试StringBuilder是否线程安全一个简单的思路如下:模拟多个线程并发向StringBuilder实例添加字符,最后检测builder.toString().length()的值是否为添加字符的次数,如果非线程安全会出现builder.toString().length()的值与添加字符的次数不一致。Java&nb

Kotlin使用kotlin-kapt插件支持Android的注解处理

在Kotlin可以使用kapt插件来支持Android的注解处理。在Gradle配置kotlin-kapt插件如下:在app的build.gradle添加插件apply plugin: 'kotlin-kapt' 使用kapt添加注解依赖java使用annotationProcessor 添加的依赖改为使用kapt。例如添加dagger依赖dependencies {

Android使用Kotlin新特性Parcelize序列化对象

Android对对象序列化主要有两种方式:Serializable和Parcelable。Serializable实际是使用Java的放射机制对对象做序列化和反序列化,其性能远低于使用Parcelable。但是使用Java写的Parcelable有点繁琐,需要我们实现Parcelable接口,手写很多模板代码。Java版Parcelable示例public class User

Android使用CountDownTimer实现倒计时示例(Kotlin)

CountDownTimer是一个抽象类,它的构造函数为CountDownTimer(long millisInFuture, long countDownInterval) millisInFuture:倒计时的总时间,从调用start()方法开始。毫秒数countDownInterval:倒计时的时间间隔。毫秒数。CountDownTimer主要有四个方法:syn