Specsの事前処理と事後処理

Specsではスペック毎、グループ毎、テストケース毎に事前処理、事後処理を実行することができます。
スペックの開始前、終了後に事前処理、事後処理を行う場合は以下のようにします。doSpecBeforeとdoSpecAfterはスペックの実行前と実行後に一度だけ実行されます。

class AddActionTestSpec extends Specification {
  // スペックの事前処理
  doSpecBefore {
    ...
  }
  "execute()" should {
    "set result to request attribute" in {
      ...
    }
  }
  // スペックの事後処理
  doSpecAfter {
    ...
  }
}

テストケース毎に事前処理、事後処理を行うには以下のようにします。グループ単位で指定できるのでJUnitのsetup()メソッドやtearDown()メソッドと同じような用途で利用することができます。

class AddActionTestSpec extends Specification {
  "execute()" should {
    // テストケース毎の事前処理
    doBefore(){
      ...
    }
    "set result to request attribute" in {
      ...
    }
    // テストケース毎の事後処理
    doAfter(){
      ...
    }
  }
}

また、以下のようにするとグループ内のテストケースの実行前、実行後に1度ずつ呼び出される事前処理、事後処理を定義することができます。

class AddActionTestSpec extends Specification {
  "execute()" should {
    // グループの事前処理
    doFirst(){
      ...
    }
    "set result to request attribute" in {
      ...
    }
    // グループの事後処理
    doLast(){
      ...
    }
  }
}

それぞれ実行される順番をまとめると以下のような感じ。

- doSpecBefore  : テストスペック開始
  - doFirst     : グループ開始
    - doBefore  : テストケース開始
    - doAfter   : テストケース終了
    - doBefore  : テストケース開始
    - doAfter   : テストケース終了
    - ...
  - doLast      : グループ終了
  - doFirst     : グループ開始
    - doBefore  : テストケース開始
    - doAfter   : テストケース終了
    - doBefore  : テストケース開始
    - doAfter   : テストケース終了
    - ...
  - doLast      : グループ終了
  - ...
- doSpecAfter   : テストスペック終了

ちなみに事前処理、事後処理が特定の関数を呼び出すだけであれば「関数名.before」「関数名.after」「関数名.beforeSpec」「関数名.afterSpec」「関数名.doFirst」「関数名.doLast」などのように記述することもできます。

class AddActionTestSpec extends Specification {
  def setup(){
    ...
  }
  "execute()" should {
    setup.before
    "set result to request attribute" in {
      ...
    }
  }
}