マーチンファウラー著のリファクタリングの中で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]:
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
書くのはめんどくさいかもしれないですが、書いてる内にプログラムの内容が
頭に整理されていくような気がします。それとわざと失敗を誘うと
メソッドの挙動が分かるのでそれを利用すればよいかもしれません。