hyoromoのブログ

最近はVRSNS向けに作ったものについて書いています

Rubyでのテスト方法

Rubyのテストフレームワークを使ってみようと思います。
今回使ってみるのは Unit と RSpec です。Unit は有名ですが、 RSpec は知る人ぞ知るって感じがしますね。

テスト対象コード

#! /usr/bin/ruby
# encoding: utf-8

class Foo
  def foo
    "foo"
  end
  def bar
    "bar"
  end
  def same
    ["foo", "bar"]
  end
end

ごく平凡なコードです。説明するまでもありません。
では、このソースコードに対してテストコードを書いていきます。

Unit で書いたテストコード

#! /usr/bin/ruby
# encoding: utf-8

require 'test/unit'
require 'foo'

class TC_Foo < Test::Unit::TestCase
  def setup
    @obj = Foo.new
  end
  
  def test_foo
    assert_equal("foo", @obj.foo)
  end
  
  def test_bar
    assert_equal("bar", @obj.bar)
  end
  
  def test_same
    assert_equal(["foo", "bar"], @obj.same)
  end
end

Test::Unit::TestCase を継承してコードを書いていきます。
setup メソッドが始めに呼ばれ、その後に他メソッドが順番に呼ばれていきます。
詳しい使い方はドキュメントを参照するのと分かりやすかったです。

RSpec で書いたテストコード

#! /usr/bin/ruby
# encoding: utf-8

require 'foo'

describe Foo do
  before do
    @foo = Foo.new
  end
  
  it '"foo"が返ってきませんでした' do
    @foo.foo.should == "foo"
  end

  it '"bar"が返ってきませんでした' do
    @foo.bar.should == "bar"
  end
  
  it '正しく配列が返ってきませんでした' do
    @foo.same.should == ["foo", "bar"]
  end
end

こちらは特に継承とかしません。ただし、実行方法が Unit と異なります。

spec spec_code.rb

テスト構成は Unit と同じですが、チェック方法などが異なり、spec で書いたほうが分かりやすい気がします。ここらは好みの問題じゃないですかね。


ちなみに、TextMate で実行させたかったのですが、上手く実行できませんでした。
ここら辺は調査して、いつか使えるようになりたいですね。

まとめ

私はどちらを使ってもいいかなぁと思いました。
しかし、基本的TextMate を使ってプログラミングしていくので、今のところ実行できない TextMate ではなく、実行できる Unit の方を使っていく予定です。
RSpec は TestMate 側で実行できる環境を整えられたら使っていきたいと思います。