進化を使用します。SQL でフィクスチャのセットアップおよびティアダウン スクリプトを作成するか、mysqldump (または DB に相当するもの) を使用して、既存のテスト DB を sql としてエクスポートします。
http://www.playframework.org/documentation/1.2/evolutions
テストを行う最もストレスのない方法は、メモリ内データベースにすべてをセットアップすることです。これは、テストが高速に実行され、JUnit を使用して Java からテストを実行できることを意味します。私は H2DB を使用していますが、注意が必要な問題がいくつかあります。私はこれらを難しい方法で学んだので、これで時間を節約できるはずです。
Play には、running( FakeAplication() ) { .. } を使用して、統合テストのためにアプリケーションをセットアップおよび破棄するための優れたシステムがあり、 FakeApplication(additionalConfiguration = inMemoryDatabase()) を使用してメモリ内データベースを使用するように構成できます。 :
http://www.playframework.org/documentation/2.0/ScalaTest
OutOfMemory エラー:しかし、私のマシンでかなり大きなテスト フィクスチャを数回実行すると、OutOfMemory エラーが発生しました。これは、inMemoryDatabase() 関数のデフォルトの実装が新しいランダムな名前のデータベースを作成し、テスト実行の間に古いデータベースをクリーンアップしないためと思われます。進化分解スクリプトを正しく記述していれば、これは必要ありません。各テストの間にデータベースが空になり、再入力されるからです。そのため、同じデータベースを使用するようにこの動作をオーバーライドし、メモリの問題は解消されました。
DB Dialect:もう 1 つの問題は、本番データベースが MySQL であり、H2DB との非互換性が多数あることです。H2DB には多数のデータベース用の互換モードがあり、これにより問題の数が減るはずです。
http://www.h2database.com/html/features.html#compatibility
これをすべてまとめると、各テストの前に追加するのが少し扱いにくくなるため、関数に抽出しました。
def memDB[T](code: =>T) =
running( FakeApplication( additionalConfiguration = Map(
"db.default.driver" -> "org.h2.Driver",
"db.default.url" -> "jdbc:h2:mem:test;MODE=MySQL"
) ) )(code)
その後、次のように使用できます(仕様の例):
"My app" should {
"integrate nicely" in memDB {
.....
}
}
すべてのテストは、偽のアプリケーションを起動し、フィクスチャ セットアップの進化スクリプトを実行し、テストを実行してから、再びすべてを破棄します。幸運を!