sbt (Simple Build Tool)の導入とscalatest

TDDBC名古屋で多少使える用になったsbt + scalatestが便利なので、簡単に使い方をまとめておこうと思います。

導入

http://code.google.com/p/simple-build-tool/wiki/Setup
ココを参考に。
Windowsだと、batファイルを作って、適切なjarファイル名に変えます。
最初にbatを走らせた時には、プロジェクトを作成します。
二回目以降は、このbatを走らせればsbtが起動します。

何してくれるの?

プロジェクト管理とか自動コンパイル/自動テスト実行とか。
コマンドによっては、ファイルを保存しただけでコンパイル/テスト実行まで行ってくれるので、いちいちコンパイルコマンドを叩く手間が省けます。

あれ、テスト出来ないんだけれど?

まず、scalatestパッケージをダウンロードしてきます。
http://blog.8-p.info/2010/5-sbt-scala を参考に、作られたプロジェクト内のprojectディレクトリにbuildというディレクトリを作って、中にMyProject.scalaを記述したファイルをおきます。
そしてアップデートすれば、テストできるようになります。

ファイルは何処に置くノ?

プロジェクト内のsrcの中にある

  • テストソースファイル - test/scala/の中
  • ソースファイル - main/scala/の中

コマンドはー?

http://code.google.com/p/simple-build-tool/wiki/RunningSbt のアクション参考。
よく使うと思うのが、

  • test - テストの実行(1回のみ)
  • ~test - テストの自動実行。ファイルの更新(保存)に合わせて、自動でテストを実行する。
  • trace on/off - テスト時の例外トレースを出すかどうか。*1
  • info / error - 表示するメッセージレベルの変更

あたりだと思う。
自分に使いやすい環境をどうぞ。

Scalatest

http://www.scalatest.org/quick_start
この辺りで、どんな使い方ができるのかを見て下さい。
いくつか使ってみて、自分がTDDをするなら、scalatest.Spec + MustMatchersが好きかなーと、個人的に思いました。
使ってみるとこんな感じ。

// SampleTest.scala
import org.scalatest.Spec
import org.scalatest.matchers.MustMatchers

class SampleTest extends Spec with MustMatchers {
  describe("Sampleは") {
    val s = Sample(10)
    it("数値を聞ける") {
      s.say must be (10)
    }
    it("平方根を聞ける") {
      s.sqrt must be (3.1622 plusOrMinus 0.001)
    }
  }
  describe("計算") {
    it("0除算は例外が返る") {
      evaluating{ 10 / 0 } must produce [ArithmeticException] 
    }
  }
}
// Sample.scala
case class Sample(val n: Int) {
  def say() = n
  def sqrt() = Math.sqrt(n: Double)
}

// sbtが出力するメッセージの一部
[info] == test-start ==
[info] == test-start ==
[info]
[info] == SampleTest ==
[info] Sampleは
[info] Test Starting - Sampleは 数値を聞ける
[info] Test Succeeded - Sampleは 数値を聞ける
[info] Test Starting - Sampleは 平方根を聞ける
[info] Test Succeeded - Sampleは 平方根を聞ける
[info] 計算
[info] Test Starting - 計算 0除算は例外が返る
[info] Test Succeeded - 計算 0除算は例外が返る
[info] == SampleTest ==
[info]
[info] == test-complete ==
[info] == test-complete ==
[info]
[info] == test-finish ==
[info] Passed: : Total 1, Failed 0, Errors 0, Passed 1, Skipped 0
[info]
[info] All tests PASSED.
[info] == test-finish ==
[info]
[info] == test-cleanup ==
[info] == test-cleanup ==
[info]
[info] == test ==
[info] == test ==
[success] Successful.

より詳しい使い方は
http://www.scalatest.org/scaladoc/doc-1.0/org/scalatest/matchers/MustMatchers.html
を参照してください。

*1:sbtのテストエラー時のメッセージは例外のスタックトレースなので長い。何か良い方法は無いのかしら