Ruby でのテストについてですが、今回は RSpec でのテスト環境についてです。
RSpec は gem パッケージ作成時のテスト環境として使用するつもりです。

ちなみに、以前 Test, Minitest について簡単に記録しています。

0. 前提条件

  • OS は Linux Mint 14 Nadia(64bit) を想定。(OS やディストリビューションはこだわらないはず)
  • Ruby 1.9.3-p385 を使用。
  • RSpec の導入から簡単なテスト実行までを説明する。
    RSpec については現在勉強中なので、詳細はここでは説明しない。(後述の参考サイトを参照)

1. RSpec インストール

gem パッケージ RSpec が未インストールならインストールする。

1
2
3
4
$ sudo gem install rspec

$ rspec -v
2.12.2

2. テストコード作成

テストコード(スペックファイル)を作成する。
サフィックス(接尾辞)を _spec とするのが一般的のようだ。
また、 describeit に渡す文字列には日本語も使えるようだ。
以下は一例で、未定義のクラス Stack について記述している。(日本を使用したり、 it の代わりに specify を使用したり)

stack_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# -*- coding: utf-8 -*-
describe "Stack" do
  context "新しく生成した時" do
    before(:all) do
      # 振舞レベルで一度だけ実行される前処理
    end

    before(:each) do
      # 各exampleについての前処理
    end

    before do
      # 各exampleについての前処理
      # before(:each) と同義
      @stack = Stack.new
    end

    it "should be empty" do
      @stack.should be_empty
    end

    specify "サイズが0であること" do
      @stack.size.should == 0
    end

    after(:each) do
      # 各exampleについての後処理
    end

    after do
      # 各exampleについての後処理
      # after(:each) と同義
      @stack = nil
    end

    after(:all) do
      # 振舞レベルで一度だけ実行される後処理
    end
  end
end

3. RSpec 実行

作成してたスペックファイルを引数に指定して RSpec を実行する。
以下の例では -c オプションでカラー表示するようにしている。(実際はカラー表示)

File: lang.bash

 1 $ spec -c stack_spec.rb
 2 FF
 3 
 4 Failures:
 5 
 6   1) Stack 新しく生成した時 should be empty
 7      Failure/Error: @stack = Stack.new
 8      NameError:
 9        uninitialized constant Stack
10      # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'
11 
12   2) Stack 新しく生成した時 サイズが0であること
13      Failure/Error: @stack = Stack.new
14      NameError:
15        uninitialized constant Stack
16      # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'
17 
18 Finished in 0.00157 seconds
19 2 examples, 2 failures
20 
21 Failed examples:
22 
23 rspec ./stack_spec.rb:18 # Stack 新しく生成した時 should be empty
24 rspec ./stack_spec.rb:22 # Stack 新しく生成した時 サイズが0であること

-fd オプションで仕様書形式で結果表示される。

File: lang.bash

 1 Stack
 2   新しく生成した時
 3     should be empty (FAILED - 1)
 4     サイズが0であること (FAILED - 2)
 5 
 6 Failures:
 7 
 8   1) Stack 新しく生成した時 should be empty
 9      Failure/Error: @stack = Stack.new
10      NameError:
11        uninitialized constant Stack
12      # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'
13 
14   2) Stack 新しく生成した時 サイズが0であること
15      Failure/Error: @stack = Stack.new
16      NameError:
17        uninitialized constant Stack
18      # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'
19 
20 Finished in 0.00164 seconds
21 2 examples, 2 failures
22 
23 Failed examples:
24 
25 rspec ./stack_spec.rb:18 # Stack 新しく生成した時 should be empty
26 rspec ./stack_spec.rb:22 # Stack 新しく生成した時 サイズが0であること

その他、 rspec のオプションは rspec -h で確認可能。

4. プロダクトコード作成

テストで失敗した箇所を成功させるべく、プロダクトコードを作成する。
(スペックファイル stack_spec.rb と同じディレクトリに配置している)

stack.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
class Stack
  def initialize
    @stack = []
  end

  def empty?
    @stack.empty?
  end

  def size
    @stack.size
  end
end

5. スペックファイル再編集

作成したプロダクトコードを読み込むようスペックファイルを編集する。

stack_spec.rb
1
2
3
4
# -*- coding: utf-8 -*-
require './stack'  # <= 追記

describe "Stack" do

6. RSpec 再実行

プロダクトコードが正常かどうか再度 RSpec テストを実行してみる。

File: lang.bash

1 $ spec -c stack_spec.rb
2 ..
3 
4 Finished in 0.00163 seconds
5 2 examples, 0 failures

テストに成功した。

7. 参考サイト


今回は簡単なテストの例でしたが、実際にはテストコードをバリバリと書いていくことになります。

また、 gem パッケージを作成する際などは、頻繁に作成した Ruby スクリプトを動かしてテストすることが困難なため、こういったテストユニットを利用することが重要になってきます。

以上。