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 { ... } } }