目標
assert equalとはequalかどうかを確かめる(assert)関数を使い,それらをテスト駆動開発で実装していく.
解説
TDDに基づいて
まずは1==1から始めていきます.
p 1==1
として見ましょう.
> ruby assert_equal.rb
true
次はこれをメソッドに直していきます.
p assert_equal(1, 1)
これを動かしてみると
> ruby assert_equal.rb
assert_equal.rb:1:in `<main>': undefined method `assert_equal' for main:Object (NoMethodError)
assert_equalの関数が定義されていないのでエラーが出ます.
def assert_equal(expected, result)
return expected == result
end
p assert_equal(1, 1)
> ruby assert_equal.rb
true
無事出力されました.
colorizeについて
出力される部分の色を変えることが出来るそうです.まずはcolorizeのインストールから始めます.
> gem install colorize
では先ほどのコードに付け加えてみます.
require 'colorize'
def assert_equal(expected, result)
if expected == result
puts 'true'.green
else
puts 'false'.red
end
end
assert_equal(1, 1)
colorizeには他にも使える色があります.実際に見てみましょう.
> irb
irb(main):001:0> require 'colorize'
=> true
irb(main):002:0> String.colors
=> [:black, :light_black, :red, :light_red, :green, :light_green, :yellow, :light_yellow, :blue, :light_blue, :magenta, :light_magenta, :cyan, :light_cyan, :white, :light_white, :default]
richer output
先ほどのコードを少し改良します.内容は以下の通りです.
- 引数でとってきた,expected, resultの値をそのまま出力
- どうなったかを記述
- true: print "succeeded in assert_equal.\n".green
- false: print "failed in assert_equal.\n".red
require 'colorize'
def assert_equal(expected, result)
if expected == result
puts "expected #{expected}"
puts "result #{result}"
puts "succeeded in #{__method__}".green
else
puts "expected #{expected}"
puts "result #{result}"
puts "failed in #{__method__}".red
end
end
assert_equal(1,1)
assert_equal(1,2)
expected 1
result 1
succeeded in assert_equal
expected 1
result 2
failed in assert_equal
#{method}と表記することでコードの中で定義した名前が出力されました.
assert_not_equal
今度は逆にexpectedとresultがnot_equalかどうか判定するassert_not_equal.rbを考えます.
require 'colorize'
def assert_equal(expected, result)
if expected != result
puts "expected #{expected}"
puts "result #{result}"
puts "succeeded in #{__method__}".green
else
puts "expected #{expected}"
puts "result #{result}"
puts "failed in #{__method__}".red
end
end
assert_equal(1,1)
assert_equal(1,2)
expected 1
result 1
failed in assert_not_equal
expected 1
result 2
succeeded in 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
if $PROGRAM_NAME == __FILE__
assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 2)
assert_not_equal(1, 1)
end
参考にしたサイト
この記事を書くために以下のサイトを参考にしました.チャート式ruby-IV(assert_equal)
- source ~/grad_members_20f/members/Takahiro-Nishikawa/ruby_assert_equal.org