sbtを使ってScalaを継続的テスト(ついでにmaven連携もすこし

James Strachan's Blog: Using SBT on your Scala Maven project for continous testingの意訳です。

本文

継続的テストは大事だ。ソースコードが変更されたらすぐにテスト。テストファーストはいいことだし、コードの変更への素早いフィードバックが得られる。

で、MavenScalaプロジェクトのビルド&実行を繰り返してるわけだ(しかも、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を動かすのもいい。