RSpecのbefore、afterフック内で例外が起きるとどうなるのか調べてみた

RSpecのbefore、afterフック内で例外が起きるとどうなるのか調べてみた。なんでかというと、そこでとあるサーバプロセスを開いたり、テストデータ作成をやっていたりして、万が一例外が起きてしまったときに、サーバが立ち上がりっぱなしになっていたり、テストデータの残骸ができてしまったり、後処理が必要だと感じたから。

それぞれのフックの中でログを出しておき、どの処理が呼ばれるのかを調査してみた。全部呼ばれると以下になるはず。

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

config.before(:suite) doで例外発生

  • config.before(:suite) do => 例外発生
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

例外発生箇所以降は呼ばれないパターン。こういうときにプロセスのクローズとかを考えないとだめなんですね。

before(:all) do で例外発生

  • config.before(:suite) do
  • before(:all) do=> 例外発生
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

all 内の例外発生パターンだと after が呼ばれてる。

config.before(:each) do で例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do => 例外発生
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

before(:each) do だけ呼ばれない。

before(:each) do で例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do => 例外発生
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

before(:each) do 内までくると全メソッド通る。

Itで例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do => 例外発生
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

before(:each) do で例外発生と同じ。全部呼ばれる。

after(:each) do で例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do=> 例外発生
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

after で例外発生しても、結局全部呼ばれている。

config.after(:each) do で例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do => 例外発生
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do

全部呼ばれている。

config.after do |example| で例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example| => 例外発生
  • after(:all) do
  • config.after(:suite) do

こちらも全部呼ばれている。

after(:all) doで例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do => 例外発生
  • config.after(:suite) do

config.after(:suite) do が呼ばれない。

config.after(:suite) do で例外発生

  • config.before(:suite) do
  • before(:all) do
  • config.before(:each) do
  • before(:each) do
  • after(:each) do
  • config.after(:each) do
  • config.after do |example|
  • after(:all) do
  • config.after(:suite) do => 例外発生

全部呼ばれる。