テスト実行前後に処理を挟む場合はbefore、afterを使用します。
それぞれ:suite、:context、:exampleを指定してテストのどの部分に処理を挟むかを指定します。
※RSpecのバージョンはRspec3を想定しています。

以下のファイルを使用して、before/afterの動きを確認します。
[spec/test1_spec.rb]

describe 'describe 1' do
  context 'in context 1' do
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
  context 'in context 2' do
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
end
$ rspec -fd spec/test1_spec.rb
describe 1
  in context 1
    is hello
    is bye
  in context 2
    is hello
    is bye

before(:context)、after(:context)

記述されたgroup(describe、context)スコープ内の最初と最後に実行されます。

  • before(:context) groupスコープの最初に実行されます。
  • after(:context) groupスコープの最後に実行されます。

[spec/test1_spec.rb]を以下のように変更して実行します。

describe 'describe 1' do
  before(:context) do
    p 'describe 1 before(:context)'
  end
  after(:context) do
    p 'describe 1 after(:context)'
  end
  context 'in context 1' do
    before(:context) do
      p 'context 1 before(:context)'
    end
    after(:context) do
      p 'context 1 after(:context)'
    end
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
  context 'in context 2' do
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
end
$ rspec -fd spec/test1_spec.rb
describe 1
"describe 1 before(:context)"
  in context 1
"context 1 before(:context)"
    is hello
    is bye
"context 1 after(:context)"
  in context 2
    is hello
    is bye
"describe 1 after(:context)"

“describe 1″内部のbefore(:context)/after(:context)は”describe 1″の最初と最後に、”context 1″内部のbefore(:context)/after(:context)は”context 1″の最初と最後に実行されているのがわかります。

before(:example)、after(:example)

記述されたgroup(describe、context)スコープ内のすべてのexample(it)の前後に実行されます。

  • before(:example) groupスコープ内のすべてのexample(it)の前に実行されます。
  • after(:example) groupスコープ内のすべてのexample(it)の後に実行されます。

※groupが入れ子になっていた場合、その内部のexampleの前後でも実行される。

[spec/test1_spec.rb]を以下のように変更して実行します。

describe 'describe 1' do
  before(:example) do
    p 'describe 1 before(:example)'
  end
  after(:example) do
    p 'describe 1 after(:example)'
  end
  context 'in context 1' do
    before(:example) do
      p 'context 1 before(:example)'
    end
    after(:example) do
      p 'context 1 after(:example)'
    end
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
  context 'in context 2' do
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
end
$ rspec -fd spec/test1_spec.rb
describe 1
  in context 1
"describe 1 before(:example)"
"context 1 before(:example)"
"context 1 after(:example)"
"describe 1 after(:example)"
    is hello
"describe 1 before(:example)"
"context 1 before(:example)"
"context 1 after(:example)"
"describe 1 after(:example)"
    is bye
  in context 2
"describe 1 before(:example)"
"describe 1 after(:example)"
    is hello
"describe 1 before(:example)"
"describe 1 after(:example)"
    is bye

“describe 1″内部のbefore(:context)/after(:context)が”context 1″内のexample(it)前後でも実行されているのがわかります。

before(:suite)、after(:suite)

  • before(:suite) テスト全体の最初に実行されます。
  • after(:suite) テスト全体の最後に実行されます。

※テストファイルが複数あっても実行されるのは一度だけです。

:suiteは特定のgroupスコープに属するものではないのでRSpec.configureブロック内に記述します。

[spec/test1_spec.rb]の先頭に以下を追加します。

RSpec.configure do |config|
  config.before(:suite) do
    p 'before(:suite)'
  end
  config.after(:suite) do
    p 'after(:suite)'
  end
end

複数ファイルでテストしたいので、以下のファイルも追加します。
[spec/test2_spec.rb]

describe 'describe 2' do
  context 'in context 1' do
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
  context 'in context 2' do
    it 'is hello' do
      expect('hello').to eq('hello')
    end
    it 'is bye' do
      expect('bye').to eq('bye')
    end
  end
end

ファイルを指定せずに実行します。

$ rspec -fd spec
"before(:suite)"

describe 1
  in context 1
    is hello
    is bye
  in context 2
    is hello
    is bye

describe 2
  in context 1
    is hello
    is bye
  in context 2
    is hello
    is bye
"after(:suite)"

:contextや:exampleもRSpec.configureブロック内に記入できます。

以下は全ての一番外側のgroupスコープ(describe、context)の最初と最後に実行されます。

RSpec.configure do |config|
  config.before(:example) do
    p 'before(:example)'
  end
  config.after(:example) do
    p 'after(:example)'
  end
end

以下はgroupスコープに関係なくすべてのexample(it)前後に実行されます。

RSpec.configure do |config|
  config.before(:example) do
    p 'before(:example)'
  end
  config.after(:example) do
    p 'after(:example)'
  end
end