プロを目指す人のためのRuby入門、通称チェリー本を読んでみて、使えそうな項目をピックアップ、ブラッシュアップしていく記事。
個人用のメモ代りにしているので読み辛さはご了承願いたい。ただメモついでに何かの役に立てればとささやかな願いを込めて書いてます。
今回のお題は「MiniTest」。
理由は、やっぱりRuby案件などネットで探すと、「テストコードが一人称でかけること」みたいなことが書かれてることが多く、テストコードかける事が、初心者とそいでない者の、1つの境目になろと思いこちらをピックアップした。
では早速。
MiniTestとは
- テストの自動化ツール。
- Rubyをインストールすると一緒にインストールする。
- Railsのデフォルトテスティングフレームワーク。
などが書かれている。簡単にまとめると、デフォで入ってる物だから、セットアップなしでしかも、ちょっと公文書けば自動でテストしてくれるから扱いやすいよ!と言っている。
そもそもテストコードとは
個人レベルの開発してるとあまり、ありがたみが感じないのだが、思わぬバグを見つけるための方法の1つ。
「この値が来たら、こういう動きをする」みたいなのをテストコードとして書いておき実行した際の結果をみて、機能の生合成を確かめていく。
当方もそこまで、テストコードを触った事がないので想像のお話になるのだが、テストコードが書けるとデバックや開発のスピードが上がるのでは?と思っている。
例えばフォームが何個もあるようなアプリを作っていた場合、毎回「入力」→「DBに登録された確認」→「もう一度。入力」→「DB確認」とやるのと、テストコードだけ書いで実行結果を見るのとどっちが早いかと言うお話。
あとは、第三者に確認してもらうときに、わかる人ならばコードと結果を見るだけでいいので、確認しやすいし楽。なので業務になるとかなり重宝するのではと思う。
RSpecについて
Rubyのテスティングフレームワークとして、もう1つ有名なのがRSpec。実際求人なんか見てるとよくこのワードを見かける。
RSpecの方が、機能がたくさん揃っているらしく、使い慣れればかなり重宝するらしい。
ただgemをインストール必要があるのと、記法がRSpec固有なので習得には時間がかかりそう。
テストコードを書く
前置きが長くなったが。実際のコードをお見せしようと思う。
今回はサンプルプログラムのFizzBazzと使ってテストをしてみた。
def fizz_bazz(n)
if n % 15 == 0
'Fizz Bazz'
elsif n % 5 == 0
'Bazz'
elsif n % 3 == 0
'Fizz'
else
n.to_s
end
end
require 'minitest/autorun' #requireで外部ファイルを読み込む。
class FizzBazzTest < Minitest::Test #Minitest::Testを継承。
def test_fizz_bazz
assert_equal '1', fizz_bazz(1) #assert_equal 期待する結果,vテスト対象となる値や式
assert_equal '2', fizz_bazz(2)
assert_equal 'Fizz', fizz_bazz(3)
assert_equal '4', fizz_bazz(4)
assert_equal 'Bazz', fizz_bazz(5)
assert_equal 'Fizz', fizz_bazz(6)
assert_equal '7', fizz_bazz(7)
assert_equal '8', fizz_bazz(8)
assert_equal 'Fizz', fizz_bazz(9)
assert_equal 'Bazz', fizz_bazz(10)
assert_equal '11', fizz_bazz(11)
assert_equal 'Fizz', fizz_bazz(12)
assert_equal '13', fizz_bazz(13)
assert_equal '14', fizz_bazz(14)
assert_equal 'Fizz Bazz', fizz_bazz(15)
end
end
上記を実行した結果は以下の通り。
>% ruby sample_test.rb
Run options: --seed 50103
# Running:
.
Finished in 0.000929s, 1076.4263 runs/s, 16146.3939 assertions/s.
1 runs, 15 assertions, 0 failures, 0 errors, 0 skips
「# Running」の下に何かでないのと、failuresやerrorsが0ならOK。
ちなみに何かバグがあると以下のようになる。
>% ruby sample_test.rb
Run options: --seed 31338
# Running:
F
Failure:
FizzBazzTest#test_fizz_bazz [sample_test.rb:18]:
Expected: "fizz"
Actual: "Fizz"
rails test sample_test.rb:15
Finished in 0.001153s, 867.3027 runs/s, 2601.9081 assertions/s.
1 runs, 3 assertions, 1 failures, 0 errors, 0 skips
この場合は[sample_test.rb:18]で18行目あたりのテストコードに何かある事がわかる。
あとは、Expected(期待される値)、Actual(実際の値)のところを見ればだいたい何で詰まってるかがわかりそう。
こんな具合にコードを書くだけで機能の生合成が取れます。
自分自身まだテストコードに慣れない部分もあるので、個人アプリに投入していって慣れていこうと思います。
また今回は非常に簡単なコードのテストだったが、もう少し複雑なフォーム送信とかに適応できたら記事を更新したいと思う。では!