Documentation

You are viewing the documentation for the 2.1.5 release in the 2.1.x series of releases. The latest stable release series is 2.4.x.

§アプリケーションのテスト

テストのソースファイルは test フォルダに配置します。 Play コンソールで test (すべてのテストを実行します) や test-only (test-only my.namespace.MySpec のようにして、ひとつのテストクラスを実行します) タスクを実行すると、テストを実行することができます。

§specs2 を使う

Play 2 アプリケーションのテストは、デフォルトで specs2 を使います。

specs2 でクラス単体の仕様を記述する場合は、org.specs2.mutable.Specification trait を継承したクラス内で、 should/in のフォーマットを使って記述します。

import org.specs2.mutable._

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

class HelloWorldSpec extends Specification {

  "The 'Hello world' string" should {
    "contain 11 characters" in {
      "Hello world" must have size(11)
    }
    "start with 'Hello'" in {
      "Hello world" must startWith("Hello")
    }
    "end with 'world'" in {
      "Hello world" must endWith("world")
    }
  }
}

§フェイクアプリケーション上で実行する

起動中のアプリケーションに依存するコードをテストする場合は、WithApplication で囲まれたスコープで簡単にフェイクアプリケーションを実行することができます。

"Computer model" should {

  "be retrieved by id" in new WithApplication {
    val Some(macintosh) = Computer.findById(21)

    macintosh.name must equalTo("Macintosh")
    macintosh.introduced must beSome.which(dateIs(_, "1984-01-24"))  
  }
}

暗黙的に利用可能な app を使って、フェイクアプリケーションに直接アクセスすることができます。

このフェイクアプリケーションに対して設定値を追加 (または上書き) したり、プラグインをモックすることも可能です。例えば、 default という名前の インメモリデータベースに接続された FakeApplication を起動する場合は、次のように書きます。

  "be retrieved by id" in new WithApplication(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
    ...
  }

§同じ仕様で複数のテストを実行する

ユニットテスト仕様 (このページの最初の部分を見てください) において、should メソッドを使って Example のグループを作り、in メソッドを使って Result を含む Example を作ります。Play アプリケーションが起動している必要のある複数のテストのグループを作りたい場合、このアプリケーションを共有することはできず、以下のようにして、それぞれのテスト毎に新しいアプリケーションを提供しなければなりません:

"Computer model" should {

  "be retrieved by id" in new WithApplication {
    // テストコード
  }
  "be retrieved by email" in new WithApplication {
    // テストコード
  }
}

テストを実行する前に、起動済みのアプリケーションを使っていくつかの操作を実行したいケースもいくつかあります。Specs2 を使えば、以下のようにして組み込みの arounds を拡張することすらできる org.specs2.specification.Around を独自に実装することで、コードを取り出すことができます:

abstract class WithDbData extends WithApplication {
  override def around[T](t: => T)(implicit evidence: (T) => Result) = super.around {
    prepareDbWithData() 
    t
  }
}

"Computer model" should {

  "be retrieved by id" in new WithDbData {
       // テストコード
  }
  "be retrieved by email" in new WithDbData {
       // テストコード
  }
}

§コントローラのユニットテスト

Play においてコントローラはオブジェクトとして定義されているので、トリッキーなユニットテストを行うことができます。Play 2.1 では、この負担は DI で軽減することができます。コントローラのユニットテストを手際よく行う別の方法は、コントローラに対する 明示的で型安全な参照 と共にトレイトを使う方法です:

trait ExampleController {
  this: Controller =>

  def index() = {
     ...
  }
}

object ExampleController extends Controller with ExampleController

そして、このトレイトをテストします。

object ExampleControllerSpec extends Specification {

  class TestController() extends Controller with ExampleController

  "Example Page#index" should {
    "should be valid" in {
          val controller = new TestController()          
          val result = controller.index()          
          result must not beNull
      }
    }
  }
}

このアプローチは、モックをセットアップしてトレイトに差し込むために選択した DI フレームワーク (Subcut/Spring/Guice/Cake Pattern) によって拡張することができます。

次ページ: 機能テスト