Documentation

You are viewing the documentation for the 2.1.x release series. 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) によって拡張することができます。

次ページ: 機能テスト


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。