发布于 5年前

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

©2020 edoou.com   京ICP备16001874号-3