40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

テスト駆動開発っていうのに取り組む

アップルタイザー

以前Rubyでつくる検索エンジンというのを買って一通り読み終わったんだけど、サンプルのソースでなんとなく重複したような処理が多いように感じたので、勉強のためにリファクタリングしてみようかなぁーとちょっと思いつきました。

ただサンプルのソースコードにはテストが無いので、まずはテストコードから書かないといけないんだろうけど、テストファーストなやり方っていうのがどうも自分の中で理解が曖昧なので、こちらを参考にしつつTest::Unitの使い方からまずはおさらい。

上記サイトのサンプルを基本そのまま利用しつつ、モジュールの中の特定のクラスのテストってどのように書くのかちょっとわからなかったこともあり、こんな感じのテストを書きました。

#foo-test.rb
require 'test/unit'
require 'foo'

class SuzakuTests < Test::Unit::TestCase
  def setup
    @objFoo = Suzaku::Foo.new
    @objBar = Suzaku::Bar.new
  end
  def test_foo
    assert_equal("foo", @objFoo.foo)
  end

  def test_bar
    assert_equal("bar", @objBar.bar)
  end  
end

Suzakuというモジュールの中にFooというクラスとBarというクラスがあってそれぞれにメソッドがあってということを意図したテストのつもりにしてみたので、テストの対象となるfoo.rbというのをこんな感じで実装してみました。

#foo.rb
module Suzaku
  class Foo
    def foo
      "foo"
    end
  end
  class Bar
    def bar
      "foo"  #ここはわざと間違っている
    end
  end
end

でもって、以下のように実行したら、1 failuresとなったけどそれ以外の箇所は意図通りテストにパスしたのでmoduleの中にあるクラスのテストの書き方はこれでよかったみたい。

% ruby ./foo-test.rb
Loaded suite ./foo-test
Started
F.
Finished in 0.010691 seconds.

  1) Failure:
test_bar(SuzakuTests) [./foo-test.rb:14]:
<"bar"> expected but was
<"foo">.

2 tests, 2 assertions, 1 failures, 0 errors

自分の中で少しだけ成長を感じた日曜日の午後でした