概要
KotlinのテスティングフレームワークのSpekを試してみたメモ
Kotlin Fest 2018 のセッションの How to Test Server-side Kotlin で、2系を待って使ったほうが良いとあったので、現時点でalphaの2系で試してみる
セットアップ
spek公式の setup-jvm のページ通りにgraldeを設定する
注意点
- intelliJプラグインのセットアップも忘れずに
- https://spekframework.org/setup-jvm/#intellij-plugin
- インストール後にIntelliJでテストクラスを開くと、テスト実行ボタンが表示されるようになる
-
Migrating to 2.x のサンプルコード のアサーションは
org.jetbrains.kotlin:kotlin-test'
を使っていると思われる- gradleの依存に
testImplementation 'org.jetbrains.kotlin:kotlin-test'
を追加する
- gradleの依存に
テストの書き方
下記のような三角形クラスのverifyメソッドのテストコード
三角形クラス
class Triangle(private val x: Int, private val y: Int, private val z: Int) {
enum class Type {
// 正三角形
EQUILATERAL,
// 二等辺三角形
ISOSCELES,
// 通常三角形(不等辺三角形)
NORMAL
}
fun verify() = when {
(x == y && y == z && z == x) -> Type.EQUILATERAL
(x == y || y == z || z == x) -> Type.ISOSCELES
else -> Type.NORMAL
}
}
describe - context - it
- describe
- 大項目
- 直下に複数定義することができる
- context
- 中項目
- 直下には書けない
- describeの中に複数定義することができる
- 省略可能
- it
- ここで assert をする
- describeかcontextの中に複数定義することができる
object TriangleTest : Spek({
describe("三角形の種類を判定") {
context("3辺がすべて等しい") {
it("verifyは正三角形を返す") {
assertEquals(Triangle.Type.EQUILATERAL, Triangle(1, 1, 1).verify())
}
}
}
})
Feature - Scenario - When - Given - Then
1系にあったgiven,on,it
は使えなくなり、代わりにGherkin
のような形式が使える
Gerkinについては、リファレンスを参照
Feature("三角形の種類を判定") {
lateinit var triangle: Triangle
Scenario("正三角形判定") {
Given("3辺がすべて等しい三角形") {
triangle = Triangle(1, 1, 1)
}
lateinit var result: Triangle.Type
When("verifyを実行") {
result = triangle.verify()
}
Then("結果は正三角形") {
assertEquals(Triangle.Type.EQUILATERAL, result)
}
}
}
所感
どちらの形式でもテストコードを書いたことがなかったので、分類分けしやすそうなdescribe - context - it
のほうが自分には使いやすそう
Feature - Scenario - When - Given - Then
も、文字通り機能ごとのシナリオを考えてテストコードを書いていけば、仕様書のようなテストコードが書けそう。ただ、TDDみたいに開発しながら書くのには向いてなさそう。