7

Playで統合テストを実行しようとしています。Scalaアプリケーションの場合は2。このために、各テストの前にDBを既知の状態にするために、いくつかのフィクスチャをロードする必要があります。

現時点では、一連のSquerylステートメントを実行してデータをロードするメソッドを呼び出しています。ただし、Scala DSLを使用するか、JSONやYAMLなどの言語でフィクスチャを宣言的に宣言する方が、読みやすく、管理も簡単です。

このJavaアプリケーションのでは、フィクスチャがYAMLファイルからロードされていることがわかりますが、同等のScalaアプリは、現在行っているように、マヌラのロードに頼っています。

また、このプロジェクトは十分に文書化されておらず、私が望むよりも少し複雑に思えます。フィクスチャデータが実際にどこで宣言されているかさえわかりません。

Playにフィクスチャをロードする他のオプションはありますか?応用?

4

2 に答える 2

15

進化を使用します。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 {
    .....
  }
}

すべてのテストは、偽のアプリケーションを起動し、フィクスチャ セットアップの進化スクリプトを実行し、テストを実行してから、再びすべてを破棄します。幸運を!

于 2012-09-16T09:33:31.627 に答える
0

Scala で Java の例を使用しないのはなぜですか? その正確なコードも、Scala で変更しなくても機能するはずです...

于 2012-09-14T10:26:34.253 に答える