Play 2.1 のテスト中に、OutOfMemoryError などが出てテストが途中で止まる場合の対策

OutOfMemoryErrorでなくても、stacktraceにObjectOutputStreamがどうとか、java.net.SocketException: Socket closedとか、見慣れないよくわからないstacktrace出る場合もあります。かつ、テストが途中で止まっても、最終的な結果はsuccessと表示される場合もあります。

テスト用のサーバー起動させると簡単にメモリ不足になってこの現象に遭遇するので、必ずjavaOptions設定しておきましょう。*1

簡単に解説しておくと、Play2.1から*2最近sbtに入った
「完全に裏で別のJVMを立ちあげて、ObjectInputStreamやObjectOutputStream、Socketを使用して、テスト用に立ち上げたJVMと通信をする」
という、とても凝った仕組みを使っているからです。おそらく、シリアライズScalaのversion間の互換性問題がでないようにするため(?)、一部そのあたりがJavaで実装されてます。以下のあたりとか

https://github.com/sbt/sbt/blob/v0.12.2/testing/agent/src/main/java/sbt/ForkMain.java
https://github.com/sbt/sbt/blob/v0.12.2/testing/agent/src/main/java/sbt/ForkTags.java

裏で起動したテスト用のJVMがメモリ不足に陥り、どうしようもない状態になり、通信しているメインのsbtを起動したJVMが、その状態を判断できない(お前OutOfMemoryになったの?っていう判断がうまくできない(?) )ので、よくわからないエラーになるようです

*1:以下は、sbt起動時のメモリ関連の引数を引継ぐ場合の設定。自分で-Xmxとか-XX:MaxPermSizeとか-XX:+CMSClassUnloadingEnabledとかを設定してもよい

*2:forkしてテストするのはPlay2.1からなので、Play2.0.4以前を使ってる人はこれ必要ないです