きままにものづくり

日々の気付いたことなんかを書いてます。

PlayのScalaアプリケーションでテストを実行してみる

こんにちは、even_ekoです。
今日は、play frameworkでのユニットテストの実行の仕方について書きます。

play frameworkのユニットテスト

play frameworkには、ユニットテストをするための環境が組み込まれています。
なので、簡単にユニットテストを実行できます。
使用できるテストフレームワークに制限はないですが、Javaの場合はJUnitScalaの場合はSpecs2が、本家(ScalaTest)で説明されています。


ScalaアプリケーションをSpecs2でユニットテスト

Specs2(etorreborre/specs2 @ GitHub)はBDDを促進させるツールです。
BDDの詳しい概念は理解してないですが、文章を書くような感覚でコードを書きます。
実際のコードを見たほうが、分かりやすいので以下に書きます。
テストの内容は、モデルからList[Map[Symbol,Any]]型の変数を取り出し、それのキーを確認するという内容です。
まずは、モデルのソースコードです。
APP_ROOT/app/models/users.scala

package models

case class Users()

object Users {
  def get() : List[Map[Symbol,Any]] = {
    List(Map('name -> "猫", 'message -> "にゃ〜"),
         Map('name -> "犬", 'message -> "わん"),
         Map('name -> "牛", 'message -> "もぉ〜")
        )
  }
}

次に、テストコードです。
APP_ROOT/test/UsersSpec.scala

package test

import org.specs2.mutable._

import play.api.test._
import play.api.test.Helpers._

import models._

class UsersSpec extends Specification {
  "Users Model" should {
    "be get all users" in {
      running(FakeApplication(additionalConfiguration = inMemoryDatabase("hellowtest"))) {
        val users = Users.get()
        users.map { users =>
          users must have key('name)
          users must have key('message)
        }
      }
    }
  }
}

これで、モデルからの情報usersがnameとmessageというキーを持っているかどうかテストできます。

ScalaアプリケーションをJUnitユニットテスト

本家(ScalaTest)では、specs2でのテスト方法しか書かれていませんでしたが、JUnitを用いてテストを実行することもできます。
以下がテストコードになります。
APP_ROOT/test/UsersTest.scala

package test

import org.junit._
import Assert._

import models._

class UserSpecJunit {
	@Test def UsersModelHasKey() {
		val users = Users.get()
		users.map { user =>
			val key = user.keys
			assertEquals(key,Set('name,'message))
		}
		assertEquals(users.head.apply('name),"Mario")
	}
}

specs2は、あまり使ったことがないのでJUnitの方がしっくりきます。

参考
[1]http://www.playframework.com/documentation/2.1.0/Home
[2]http://etorreborre.github.com/specs2/