Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have 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を組み合わせるだけでもいい感じに捗りそうな予感がしています。

idom
自動車流通業界の常識を覆すビジネスに挑戦し、ITを活用して移動という手段に新たな価値を創出することをミッションとしています。
https://221616.com/idom/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away