sbtを使ってScalaを継続的テスト(ついでにmaven連携もすこし
James Strachan's Blog: Using SBT on your Scala Maven project for continous testingの意訳です。
本文
継続的テストは大事だ。ソースコードが変更されたらすぐにテスト。テストファーストはいいことだし、コードの変更への素早いフィードバックが得られる。
で、MavenでScalaプロジェクトのビルド&実行を繰り返してるわけだ(しかも、IDEだとちょっと遅い)。
Infinitestプラグインを買ってもいいとは思うけど、ScalaTestsをコンソールビューで動かすのはキツい。failなコードを参照しにくい。しかも、ビルドコマンドを叩かなきゃいけない。テストは、自動で実行しつづけたいんだよ。
で、sbtだ。Simple Build Tool for Scala。
インストール
ダウンロードしてスクリプト作ってパス通す(詳しくは省略
mavenプロジェクト用にセットアップ
sbt初心者としては、mavenビルドをsbtでやってみるのが一番の近道だ。mavenを使ってなければここは飛ばしていい。
まず、project/build ディレクトリにscalaファイルを作る。sbtはprojectディレクトリを作って、下にbootディレクトリを作るが、buildディレクトリはないはず。
ファイル名は何でもいいので、例えばproject/build/Foo.scalaとして下を定義する:
import sbt._ class FooProject(info: ProjectInfo) extends DefaultProject(info) { val mavenLocal = "Local Maven Repository" at "file://"+Path.userHome+"/.m2/repository" }
これだけで、sbtシェルでupdateするとmaven dependenciesをprojectに取り込むことができる。
$ sbt [info] Building project hellosbt 1.0 against Scala 2.8.0 [info] using sbt.DefaultProject with sbt 0.7.4 and Scala 2.7.7 > update ...(略) > compile ...(略)
まず、'sbt'でsbtシェルを起動する。次に'update'タスクでpom.xmlで定義した依存ライブラリを落とす。詳細はrepositories and dependenciesを参照。
さて、これで継続的テストの準備ができた。
継続的テスト
sbtシェルからタイプ:
> ~test
で、コードを監視し、変更されれば、ビルド&テストする。しかも結果は色つきだ。
もし、Scala interactive shell (REPL)で遊んでる場合は:
> console-project
いい感じだろ?
IntelliJ IDEAで継続的テストなんてアリエナイだろ?
JRebel plugin for Maveでscala::ccゴールを使っても同じようなことをしてる人もいる。JRebelも自動でコードの変更を監視して、継続的テスト用プラグインが走ってクラスをリロードしてテストケースを適当に再実行してくれるはず。
似たようなテクニックとして、jetty:runやscala:consoleでプロジェクトを実行してるときは、scala:cc経由でJRebelを動かすのもいい。