Preface (はじめに)
テスト駆動型開発(TDD)では簡易的なテストを何度も繰り返し開発を進めることが基本です.
本記事では, ある式や値が想定のものと同じかどうかを確かめる関数assert_equalを作り, それを用いて簡単なテストコードを作ろうと思います.
Assert
Equal
まずはexpectedとresultの値が等しいか確かめる
def assert_equal(expected, result)
  return expected == result
end
p assert_equal(1, 1)
> ruby assert_equal.rb
-> true
次に視覚的に分かりやすくするためcolorizeライブラリを用いて出力に色をつけます.
require 'colorize'
def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end
assert_equal(1, 1)
assert_equal(1, 2)
結果は一つ目は緑のtrue, 二つ目は赤のfalseとなるはずです.
少し改良を加えます.
- 引数のexpectedとresultの値を出力
 - 先ほどのassert_equalの処理を以下のように変更
- true: print "succeeded in assert_equal.\n".green
 - false: print "failed in assert_equal.\n".red
 
 
require 'colorize'
def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end
def assert_equal(expected, result)
  puts_vals(expected, result)
  print  case expected == result
     when true  ; "succeeded in #{__method__}.\n".green
     when false ; "failed in #{__method__}.\n".red
     end
end
assert_equal(1, 1)
assert_equal(1, 2)
出力は
> ruby assert_equal.rb
expected :: 1
result   :: 1
succeeded in assert_equal.
expected :: 1
result   :: 2
failed in assert_equal.
となります. (Qiita上では色は変わっていません.)
Not Equal
今度はexpectedとresultが等しければfalse, 異なればtrueを返すassert_not_equal関数を作ります.
require 'colorize'
def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end
def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
  "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end
def assert_equal(expected, result)
  puts_vals(expected, result)
  print  case expected == result
     when true  ; "succeeded in #{__method__}.\n".green
     when false ; "failed in #{__method__}.\n".red
     end
end
assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 2)
assert_not_equal(1, 1)
出力は
> ruby assert_equal.rb
expected :: 1
result   :: 1
succeeded in assert_equal.
expected :: 1
result   :: 2
failed in assert_equal.
expected :: 1
result   :: 2
succeeded in assert_not_equal.
expected :: 1
result   :: 1
failed in assert_not_equal.
このassert_equalやassert_not_equalは便利なので他のコードにも使いたいです. しかしこのままでは, コード内のテストも実行されてしまうので,
if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end
というようにテスト部分を変えます.
このように書くことでcodeが書いてあるファイル名(_FILE_)とPROGRAMが動いているファイル名($PROGRAM_FILE)とが一致したら, 中身を実行するようにできます.