Edited at

KotlinのテストをSpekで書いてwerckerでテストしてみる

More than 1 year has passed since last update.

最近話題のKotlin。せっかくならテストとCIをいい感じにやりたい :innocent:

ということで今回は、Spekでテストコードを書いて、werckerでCIするところまで試してみました。

どちらも使うのは初めてなので、バリバリで使っている方からは物足りない記事になってます...

※確認に使ったGitHubリポジトリはコチラです。


Spekでテストを書く


Spekとは?

SpekはKotlinの開発元であるJetBrainsが開発しているテスティングフレームワークです。

describeitといったワードを使うことでRSpecのような記述ができるのが特徴です。


テストの書き方

Spekのテストコードは


  • given, on, it

  • describe, it

の2種類の書き方ができます。


given, on, it

Spekの初期バージョンの基礎になった書き方です。

オブジェクト宣言のSpekコンストラクタ内に以下のコンポーネントを記述します。


  • given: テストの準備をするための箇所

  • on: どのようなアクションをするのかを定義する箇所

  • it: onで定義されたアクションを検証する箇所

コードは↓のような感じになります。


CalculatorSpec.kt

object CalculatorSpec: Spek({

given("計算のテスト") {
val calculator = SampleCalculator()
on("足し算") {
val sum = calculator.sum(2, 4)
it("第一引数の数値と第二引数の数値を足した結果を返す") {
assertEquals(6, sum)
}
}
on("引き算") {
val subtract = calculator.subtract(4, 2)
it("第一引数の数値から第二引数の数値を引いた結果を返す") {
assertEquals(2, subtract)
}
}
}
})


describe, it

JasmineやMochaスタイルの書き方をする書き方です。

describeのなかにテストを定義していきます。

このスタイルで必要なのは


  • describe: どのようなテストなのかを定義する箇所

  • it: onで定義されたアクションを検証する箇所

になります。

コードは↓のような感じになります。


SimpleSpec.kt

object SimpleSpec : Spek({

describe("計算のテスト") {
val calculator = SampleCalculator()

on("足し算") {
val sum = calculator.sum(2, 4)

it("第一引数の数値と第二引数の数値を足した結果を返す") {
assertEquals(6, sum)
}
}

on("引き算") {
val subtract = calculator.subtract(4, 2)

it("第一引数の数値から第二引数の数値を引いた結果を返す") {
assertEquals(2, subtract)
}
}
}
})



テストの実行(ローカル)

ローカルでテストを走らせるなら、gradle testをするだけでOKです。


werckerでCIする


werckerとは?

werckerはDockerコンテナベースのCIツールです。

werckerの世界ではstepという単位でコマンドをまとめ、それらのstepをBuildDeployといったフェーズ別にまとめ実行していきます。 ※ How Wercker Works

これらの設定はwercker.ymlに記述します。


事前準備

werckerの動きをローカルでも再現するために、wercker-cliというものが用意されているので、これを事前にインストールしておきます。


定義ファイル作成

プロジェクトルートにwercker.ymlという名前で、以下のような定義ファイルを準備します。

今回はgradle testしたいだけなので、werckerが事前に用意してくれているgradle用のstepを使います。

もちろん自分で書いたコマンドをステップとすることも可能です。


wercker.yml

box:

id: openjdk

build:
steps:
- java/gradle:
name: "spek_wercker test"
task: test
version: "4.4"
cache_project_cache: true



ローカルで実行

wercker buildを実行するとopenjdkイメージをpullしてgradle testコマンドを実行してくれます。

wercker-cliが問題なく動作したのでGitHubにpushしてしまいます。


werckerでテストする

werckerにログインし、 GitHubリポシトリを追加します。


GitHub上で変更を検知してCIできるか確認してみる

テストコードに以下のコードを追加してGitHubにpushします。


CalcuratorSpec.kt

on("掛け算") {

val multiplication = calculator.multiplication(4, 2)

it("第一引数の数値と第二引数の数値の積を返す") {
assertEquals(8, multiplication)
}
}



SimpleSpec.kt

on("掛け算") {

val multiplication = calculator.multiplication(4, 2)

it("第一引数の数値と第二引数の数値の積を返す") {
assertEquals(8, multiplication)
}
}



SampleCalculator.kt

fun multiplication(a: Int, b: Int) = a + b


MiyamotoTa spek_wercker   loading.png

無事に怒られました :innocent:

今回はgradle testだけでしたが、werckerには他にも色々なstepが用意されています。

これらのstepを組み合わせるだけでもいい感じに捗りそうな予感がしています。