はじめに
マルチスケールシミュレーション特論の講義メモです.講義メモのインデックスはコチラ
今回の参考資料はチャート式ruby-appendix-IV(assert_equal)とチャート式ruby-appendix-V(rubular)です.
チャート式 Ruby
参照記事はコチラ
assert_equal
assert_equal という関数を作成する.これは期待する出力と実際の出力を比較し,それらが等しいかを確かめる関数である.
テスト駆動開発ではとりあえず出力してみて,期待する出力と異なっていれば修正していくような進め方をする.そのような開発方法で assert_equal が役に立つ.(一概には言えないが)早速だが作成していく.
assert_equal
> emacs assert_equal.rb
まずは関数の大枠から.
def assert_equal(expected, result)
return expected == result
end
p assert_equal(1,1)
これで expected と result が等しければ true, 異なっていれば false を返す.
colorize
colorize で true なら緑, false なら赤で出力するようにする.資格的にわかりやすくするのは大切.
先ほどのプログラムで 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 なら赤で出力するようにできた.
脱線するが 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]
出力をより rich に
これだけでは物足りないので,以下の 2 点を追加する.
- 関数の引数である expected, result の値を出力
- 結果を文章で出力
require 'colorize'
def assert_equal(expected, result)
puts "expected :: #{expected}"
puts "result :: #{result}"
if expected==result
puts "succeeded in assert_equal.\n".green
else
puts "failed in assert_equal.\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.
文字の色も正しく出力された.
assert_not_equal
assert_equal の逆バージョン,等しくなければ true,等しければ false を返す関数 assert_not_equal を作成する.
require 'colorize'
def assert_not_equal(expected, result)
puts "expected :: #{expected}"
puts "result :: #{result}"
if expected != result
puts "succeeded in assert_not_equal.\n".green
else
puts "failed in assert_not_equal.\n".red
end
end
assert_not_equal(1,2)
assert_not_equal(1,1)
> ruby assert_not_equal_ro.rb
expected :: 1
result :: 2
succeeded in assert_not_equal.
expected :: 1
result :: 1
failed in assert_not_equal.
問題なく出力された.違和感.
重複箇所の整理
関数内の重複箇所といえば print 文とか?assert_equal と asset_not_equal のメソッド名がベタ打ちされているからそこが気になるくらいかな.
def assert_equal(expected, result)
puts "expected :: #{expected}"
puts "result :: #{result}"
if expected == result
puts "succeeded in #{__method__}.\n".green
else
puts "failed in #{__method__}.\n".red
end
end
def assert_not_equal(expected, result)
puts "expected :: #{expected}"
puts "result :: #{result}"
if expected != result
puts "succeeded in #{__method__}.\n".green
else
puts "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)
こんなもん.
重複実行の予防
今後も assert_equal は使うのでテストプログラムは省いておきたい.
そこで
if $PROGRAM_NAME == __FILE__
assert_equal(1, 1)
assert_equal(1, 2)
assert_not_equal(1, 2)
assert_not_equal(1, 1)
end
このようにしておくことで,テストプログラムの実行を回避できる.
自分が作成した assert_equal のプログラムは以下のとおり.
require 'colorize'
def assert_equal(expected, result)
puts "expected :: #{expected}"
puts "result :: #{result}"
if expected==result
puts "succeeded in assert_equal.\n".green
else
puts "failed in assert_equal.\n".red
end
end
assert_equal(1, 1)
assert_equal(1, 2)
else
puts "failed in #{__method__}.\n".red
end
end
def assert_not_equal(expected, result)
puts "expected :: #{expected}"
puts "result :: #{result}"
if expected != result
puts "succeeded in #{__method__}.\n".green
else
puts "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
模範解答のプログラムは以下のとおり.
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 開発周辺情報
参照記事はコチラ
Rubular
Rubular: http://rubular.com
Rubularとは?
正規表現を使う練習に使えるツール.用法はquick reference にまとめられているので簡単に参照できる.
個人的に正規表現の便利さも身にしめて感じているし,実際に使ったこともあったが,身にはついていない.これを機に勉強しようとおもう.
次回の講義内容 <2020-11-25 Wed>
次回は チャート式ruby-IV(Recursive Fibonacci)だそうです.
- source ~/grad_members_20f/members/e79a93e5b7b1/posts/class/c9_20201118.org