Hatena::Grouprubyist

payaparaの日記 このページをアンテナに追加 RSSフィード

2009-09-29

RubyのTestCaseの便利さを実感。

23:54 | RubyのTestCaseの便利さを実感。 - payaparaの日記 を含むブックマーク はてなブックマーク - RubyのTestCaseの便利さを実感。 - payaparaの日記 RubyのTestCaseの便利さを実感。 - payaparaの日記 のブックマークコメント

マーチンファウラー著のリファクタリングの中でJavaのTestCaseを構築方法が載ってありましたが、

正直コードが理解しにくく、TestCaseを書いてもあまり利益があるのかと疑問でした。

でも、RubyのTestCaseはとてもわかりやすかったので、少しTestCaseについて書きます。

TestCaseの書き方


 require "test/unit"
    
  require "テストしたい物"
   
   class テストしたい物のテストケース < Test::Unit::TestCase
  
    def setup
      @obj = テストしたい物の中のクラス.new
    end

    def test_メソッド名
      assert_equal(メソッドの実行結果を比較する物, @obj.メソッド名())
    end
 end

例えばObj.rbにこんなメソッドがあったとします。

## Obj.rb
 #リストを抽出する。
210   def list(value)
211     value.split(',')
212   end

このメソッドはどういうことをするのか知りたいときは

      @obj = Obj.new
      puts @obj.list("1,2,3")

表示してくれて挙動が分かった。

ていうのは今まで...

ちゃんとtestCaseを書く。

#! /usr/bin/env ruby

## ObjTestCase.rb

 require "test/unit"
    
  require "Obj.rb"
   
   class ObjTestCase < Test::Unit::TestCase
  
    def setup
      @obj = Obj.new
    end

    def test_list
      assert_equal("", @obj.list("1,2,3"))
    end
 end

ここでテストしてみます。

% ObjTestCase.rb

Loaded suite /home/user/ruby/ObjTestCase

Started

.F.

Finished in 0.029616 seconds.

1) Failure:

test_list(ObjTestCase) [/home/user/ruby/ObjTestCase.rb:22]:

<""> expected but was

<["1", "2", "3"]>.

1 tests, 1 assertions, 1 failures, 0 errors, 0 skips

listメソッドは["1","2","3"]を返しているようです。

失敗しているのはassert_equalの結果で

["1","2","3"] が "" と違うと言ってくれている。

だから["1","2","3"]を入れてみる

   def test_list
       assert_equal(["1","2","3"], @obj.list("1,2,3"))
   end

すると

% ObjTestCase.rb

Loaded suite /home/user/ruby/ObjTestCase

Started

...

Finished in 0.030652 seconds.

1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

成功する。

こんな感じでTestCaseを増やしていく。

  def test_coexist
      assert_equal([1, 2, 3..6, [1, 3, 5], [0, 2, 4], [3, 6, 9]],
                                  @Obj.coexist("1,2,3-6,1-5/2,0-5/2,3-9/3"))
      assert_equal([1, 3, 4], @Obj.coexist("1,3,4"))
  end

  def test_list
    assert_equal(["1", "2", "3", "45", "55"], @Obj.list("1,2,3,45,55"))
    assert_equal(["1","2","3"], @Obj.list("1,2,3"))
  end
 
  def test_range
    assert_equal([1,3,5], @Obj.range("1-5/2"))
    assert_equal([], @Obj.range("6-5/2"))
  end

assert_equalばかりですが、

他のメソッドもあります。http://doc.okkez.net/191/view/library/test.unit

http://doc.okkez.net/191/view/class/Test=Unit=Assertions

書くのはめんどくさいかもしれないですが、書いてる内にプログラムの内容が

頭に整理されていくような気がします。それとわざと失敗を誘うと

メソッドの挙動が分かるのでそれを利用すればよいかもしれません。