03.01.Spec の始め方

Spec では、テストと、テストされているふるまいを記述したテキストを結合します。

describe 節でテストと仕様に関するサブジェクトを記述し、it 節で期待されるふるまいを説明するテキストを配置することができます。

テストのコードは、波括弧の中の it とそのテキストの後に続く括弧の後ろに現れます。

以下のような構造です。

import org.scalatest.Spec

class ExampleSpec extends Spec {

describe("スタックは") {

it("後入れ先出しの順序で、値をポップしなければならない") (pending)

it("スタックが空だった場合、NoSuchElementException を投げなければならない") (pending)

}

}

ここで仕様が記載され、テストされているサブジェクトは「スタック」です。

テストがまだ実行されていないことを示すために、"pending"となっています。

Spec をコンパイルするには、以下のように入力します。

$ scalac -cp scalatest-1.5.jar ExampleSpec.scala

実行するには、以下のように入力します。

$ scala -cp scalatest-1.5.jar org.scalatest.tools.Runner -p . -o -s ExampleSpec

Run starting. Expected test count is: 2

ExampleSpec:

スタックは

- 後入れ先出しの順序で、値をポップしなければならない (pending)

- スタックが空だった場合、NoSuchElementException を投げなければならない (pending)

Run completed in 61 milliseconds.

Total number of tests run: 0

Suites: completed 1, aborted 0

Tests: succeeded 0, failed 0, ignored 0, pending 2

All tests passed.

仕様に関するテキストが、読める形で出力されていることに注目してください。

テストは、以下のように書くことができます。

import org.scalatest.Spec

import scala.collection.mutable.Stack

class ExampleSpec extends Spec {

describe("スタックは") {

it("後入れ先出しの順序で、値をポップしなければならない") {

val stack = new Stack[Int]

stack.push(1)

stack.push(2)

assert(stack.pop() === 2)

assert(stack.pop() === 1)

}

it("スタックが空だった場合、NoSuchElementException を投げなければならない") {

val emptyStack = new Stack[String]

intercept[NoSuchElementException] {

emptyStack.pop()

}

}

}

}

または、ScalaTest のマッチャーシンタックスがお好みなら、ShouldMatchers や MustMatchers をミックスインすることができます。

import org.scalatest.Spec

import org.scalatest.matchers.MustMatchers

import scala.collection.mutable.Stack

class ExampleSpec extends Spec with MustMatchers {

describe("スタックは") {

it("後入れ先出しの順序で、値をポップしなければならない") {

val stack = new Stack[Int]

stack.push(1)

stack.push(2)

stack.pop() must be === 2

stack.pop() must be === 1

}

it("スタックが空だった場合、NoSuchElementException を投げなければならない") {

val emptyStack = new Stack[String]

evaluating { emptyStack.pop() } must produce [NoSuchElementException]

}

}

}

ExampleSpec を実行してみましょう。もう pending となっているテストはないはずです。

$ scala -cp scalatest-1.5.jar org.scalatest.tools.Runner -p . -o -s ExampleSpec

Run starting. Expected test count is: 2

ExampleSpec:

スタックは

- 後入れ先出しの順序で、値をポップしなければならない

- スタックが空だった場合、NoSuchElementException を投げなければならない

Run completed in 76 milliseconds.

Total number of tests run: 2

Suites: completed 1, aborted 0

Tests: succeeded 2, failed 0, ignored 0, pending 0

All tests passed.