2013年6月14日金曜日

sbt-Play parallelExecution in test と parallelExecution in Test がscctで致命的に挙動が違って泣きそうなので調べてみた

こちらのブログ http://ikeike443.hatenablog.com/entry/2012/12/10/000000
(ちなみに元上司です、今は某球団持ってる会社さんにいらっしゃいます)
にあるとおり、 playやsbtのテスト(実体同じだけど)で並列化を止めるためには

parallelExecution in test := false

がBuild.scalaに必要なのですが、ネットの情報やPlayのドキュメントみると

parallelExecution in Test := false
が正しいのかなと思い、

 http://www.playframework.com/documentation/2.0.3/SBTSettings


一文字だけ直してローカルでplay test してOkでPullRequest出して
いざJenkinsでテスト実行してって、やれやれ、、と思ってたら

テストこけてるー!

なんでやねん、ってみてみたらplay test はOKだけど、 カバレージとるための
scct:test でこけてるみたいす。

しかもなんかド派手というか、ぐちゃぐちゃなこけかた。

で、 ローカルでためしてみるとやっぱりこける。。

このプロジェクトにはScct系の設定いれてないし、変えてもないんで気にしてなかったけど、どうやら「test」と「Test」の違いが、scct:testに影響してるみたいです。

再現率100%で test だとOK、 Testだと失敗。

まあ、 戻せばとりあえずいいんだけど、 別のプロジェクトでやはりscct:testがうまく動いてないので、色々試してみました。


parallelExecution in test := false  -> OK
parallelExecution in Test := false  -> Failure
//parallelExecution in test := false (コメント化) -> Failure
parallelExecution in test := true  -> Failure
parallelExecution in Test := true  -> Failure

ってことで test := false しか成功しないんですけど、うーんてなってたら
同じチームの同僚が下記のsbtのリンク教えてくれて

http://www.scala-sbt.org/release/docs/Detailed-Topics/Testing

よくよむと、

scala parallelExecution in Test := false Test can be replaced with IntegrationTest to only execute integration tests serially. Note that tests from different projects may still execute concurrently.
とか、書いてあって、 it:test のテストだけ直列化するぽい。。

だから、 全部のテスト直列化には in test が正解なのか。


※ちなみに、 sbtのソースコード自体のテストは in test ってなってるみたいです。

でも、 とにかく紛らわしいです。。。

ちなみに、 うまくいかないほうのプロジェクトは

parallelExecution in Scct := false
parallelExecution in ScctTest := false

つけてもダメ。 

ていうか、 play test 自体は

parallelExecution in test := true

でもとおちゃうんだよなー。

とかおもってるんと、そういえば、強制的に並列実行阻止するため、
def running[T](fakeApp: FakeApplication)(block: => T): T = {
    synchronized {
      try {
        Play.start(fakeApp)
        block
      } finally {
        Play.stop()
        play.core.Invoker.system.shutdown()
        play.core.Invoker.uninit()
      }
    }
  }

みたいなoverride他のメンバーがいれてるんだった。

あれ、じゃあそもそも並列実行しないはずじゃ。と思って、このoverride外して
parallelExecution in test := true

とかにするとテストこけた。

逆にいうと、 runningつかってるとこは排他きいてるってことか。

scct:compileでなにかコードがつけたされて挙動がかわってるのかな?


うーん、 結局もやもやのままだなー。 どっかで腰すえてやんないとわけわからん。