読者です 読者をやめる 読者になる 読者になる

はわわーっ

はわわわわっ

sbtとかspecs2とか

scalaのビルドにsbtってのが便利らしい。
ついでにテストにspecs2ってのを使ってみるよ。

とりあえず、sbtインストール。
archにはパッケージがあった。さすがや。

% yaourt -S sbt

Hello, World — sbt Documentationを参考に。。

とりあえず練習用に hello というディレクトリを作ってその中に hello.scala を作る。
中身は適当。

// hello/hello.scala

object Hello {
  def main(args: Array[String]) = println("hello")
}

そしたら動かしてみる。

% sbt run
[info] Set current project to default-a543dd (in build file:/home/yomi/tmp/hello/)
[info] Running Hello 
hello
[success] Total time: 2 s, completed Feb 1, 2013 7:13:48 PM

こんな感じに実行できる。

コンパイルだけするときは

% sbt compile

でできるらしい。

適当に作るやつならこのままでいいかもしれないけど、
一般的(?)らしいディレクトリ構成にあわせておく。

src/
  main/
    resources/
       <files to include in main jar here>
    scala/
       <main Scala sources>
    java/
       <main Java sources>
  test/
    resources
       <files to include in test jar here>
    scala/
       <test Scala sources>
    java/
       <test Java sources>

デフォルトレイアウトがこうなっているらしいので、
hello/hello.scala を hello/src/main/scala/ の中に移動する。

ついでにテストフレームワークの specs2 を使ってみる。
etorreborre/specs2 @ GitHubを参考に。
上のディレクトリ構成にあわせて hello/src/test/scala/ の中にファイルを作る。

// hello/src/test/scala/hello.scala

import org.specs2._

class HelloSpec extends Specification {
  def is =
    "test test" ^
    "'hello world' string should" ^
    "contain 11 characters" ! e1^
    "start with 'hello'" ! e2^
    "end with 'world'" ! e3^
    end

  def e1 = "hello world" must have size(11)
  def e2 = "hello world" must startWith("hello")
  def e3 = "hello world" must endWith("world")
}

こんな感じ。
sbt からテストを実行できるようにする。
hello/build.sbt に設定とかを書けばいい。
specs2のリンクのページにあるので真似して書く。

scalaVersion := "2.10.0"

scalacOptions ++= Seq("-deprecation", "-unchecked")

libraryDependencies ++= Seq("org.specs2" %% "specs2" % "1.13" % "test")

resolvers ++= Seq(
  "snapshots" at "http://oss.sonatype.org/content/repositories/snapshots",
  "releases" at "http://oss.sonatype.org/content/repositories/releases"
)

scalacOptions はついでにつけてみた。

テストを実行する時は

% sbt test
[info] Set current project to default-a543dd (in build file:/home/yomi/tmp/hello/)
[info] Updating {file:/home/yomi/tmp/hello/}default-a543dd...
[info] Resolving org.scala-lang#scala-library;2.10.0 ...
[info] Resolving org.specs2#specs2_2.10;1.13 ...
[info] Resolving org.specs2#scalaz-core_2.10;7.0.0 ...
[info] Resolving org.specs2#scalaz-concurrent_2.10;7.0.0 ...
[info] Resolving org.specs2#scalaz-effect_2.10;7.0.0 ...
[info] Done updating.
[info] Compiling 1 Scala source to /home/yomi/tmp/hello/target/scala-2.10/classes...
[info] Compiling 1 Scala source to /home/yomi/tmp/hello/target/scala-2.10/test-classes...
[info] HelloSpec
[info] 
[info] test test
[info]   'hello world' string should
[info]   + contain 11 characters
[info]   + start with 'hello'
[info]   + end with 'world'
[info]
[info] Total for specification HelloSpec
[info] Finished in 91 ms
[info] 3 examples, 0 failure, 0 error
[info]
[info] Passed: : Total 3, Failed 0, Errors 0, Passed 3, Skipped 0
[success] Total time: 27 s, completed Feb 1, 2013 7:52:14 PM

こんな感じで結果が表示される。