Preface (はじめに)
テスト駆動型開発(TDD)では簡易的なテストを何度も繰り返し開発を進めることが基本です.
本記事では, ある式や値が想定のものと同じかどうかを確かめる関数assert_equalを作り, それを用いて簡単なテストコードを作ろうと思います.
Assert
Equal
まずはexpected
とresult
の値が等しいか確かめる
assert_equal.rb
def assert_equal(expected, result)
return expected == result
end
p assert_equal(1, 1)
> ruby assert_equal.rb
-> true
次に視覚的に分かりやすくするためcolorize
ライブラリを用いて出力に色をつけます.
assert_equal.rb
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
assert_equal.rb
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関数を作ります.
assert_equal.rb
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は便利なので他のコードにも使いたいです. しかしこのままでは, コード内のテストも実行されてしまうので,
assert_equal.rb
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)とが一致したら, 中身を実行するようにできます.