mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - RSpec でテスト!

[ プログラミング ] [ RSpec, Ruby, テスト ]

こんばんは。

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 オプションでカラー表示するようにしている。(実際はカラー表示)

lang.bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ spec -c stack_spec.rb
FF

Failures:

  1) Stack 新しく生成した時 should be empty
     Failure/Error: @stack = Stack.new
     NameError:
       uninitialized constant Stack
     # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'

  2) Stack 新しく生成した時 サイズが0であること
     Failure/Error: @stack = Stack.new
     NameError:
       uninitialized constant Stack
     # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'

Finished in 0.00157 seconds
2 examples, 2 failures

Failed examples:

rspec ./stack_spec.rb:18 # Stack 新しく生成した時 should be empty
rspec ./stack_spec.rb:22 # Stack 新しく生成した時 サイズが0であること

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

lang.bash
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
Stack
  新しく生成した時
    should be empty (FAILED - 1)
    サイズが0であること (FAILED - 2)

Failures:

  1) Stack 新しく生成した時 should be empty
     Failure/Error: @stack = Stack.new
     NameError:
       uninitialized constant Stack
     # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'

  2) Stack 新しく生成した時 サイズが0であること
     Failure/Error: @stack = Stack.new
     NameError:
       uninitialized constant Stack
     # ./stack_spec.rb:15:in `block (3 levels) in <top (required)>'

Finished in 0.00164 seconds
2 examples, 2 failures

Failed examples:

rspec ./stack_spec.rb:18 # Stack 新しく生成した時 should be empty
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 テストを実行してみる。

lang.bash
1
2
3
4
5
$ spec -c stack_spec.rb
..

Finished in 0.00163 seconds
2 examples, 0 failures

テストに成功した。

7. 参考サイト


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

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

以上。

Comments