RSpec面白い
前回はProgramming First Developmentがすげーって書きましたが、家で趣味のプログラム書く場合はテストフレームワークRSpecを使ってテスト駆動開発を試しています。
RSpecとかTDDとかのちゃんとした説明はこのへん。
Rubyst Magazine
スはスペックのス (1)
スはスペックのス (2)
第25回 Ruby/Rails勉強会@関西 - 角谷HTML化計画
なんというか、これ良いねー。RSpec使って最初に感じる快適さって、
1. assertではなくshouldで表現する
2. テスト名に日本語が使える
の2点かなあ。
xUnitで使われるassertと、RSpecのshouldの違いって、表現的には「f(x)はyだよ、絶対」と「f(x)はyになるべき」の違いでしかないんだけど、なぜかshouldの方がずっとピンとくる。まあ中学校で習う単語ってのもあるかな。
仕事でも、外国人エンジニアなんかとカタコト英語同士で会話するときとかに、「この設計はこうするべきです」とか「そのバグはあなたが直すべきです、ゴルア」なんて会話でshouldを多用するよね。
そんなわけでshould大好き。should使うべき。
テスト名を文字列リテラルで表現するのもちょっとした工夫だけど、心置きなく日本語が使えるという安心感がある。
describe Students, "もしね、例えばの話だよ、万が一生徒全員の名前が鈴木だったらどうよ" do
it "そりゃあやっぱり整列したら学籍番号順に並ぶべきだろ、常識的に考えて" do
とかね。
今日書いてみたのはこんなやつ。
テストコード test_horoscope.rb
require 'horoscope' describe Horoscope, "のテストがんばるよー" do it "限界値はうまくいってるかなドキドキ" do h = Horoscope.new h.calc(Date.new(2000, 3, 22)).should == "牡羊座" h.calc(Date.new(2000, 4, 19)).should == "牡羊座" h.calc(Date.new(2000, 4, 20)).should == "牡牛座" h.calc(Date.new(2000, 5, 20)).should == "牡牛座" h.calc(Date.new(2000, 5, 21)).should == "双子座" h.calc(Date.new(2000, 6, 21)).should == "双子座" h.calc(Date.new(2000, 6, 22)).should == "蟹座" h.calc(Date.new(2000, 7, 22)).should == "蟹座" h.calc(Date.new(2000, 7, 23)).should == "獅子座" h.calc(Date.new(2000, 8, 22)).should == "獅子座" h.calc(Date.new(2000, 8, 23)).should == "乙女座" h.calc(Date.new(2000, 9, 22)).should == "乙女座" h.calc(Date.new(2000, 9, 23)).should == "天秤座" h.calc(Date.new(2000, 10, 23)).should == "天秤座" h.calc(Date.new(2000, 10, 24)).should == "蠍座" h.calc(Date.new(2000, 11, 21)).should == "蠍座" h.calc(Date.new(2000, 11, 22)).should == "射手座" h.calc(Date.new(2000, 12, 21)).should == "射手座" h.calc(Date.new(2000, 12, 22)).should == "山羊座" h.calc(Date.new(2000, 1, 19)).should == "山羊座" h.calc(Date.new(2000, 1, 20)).should == "水瓶座" h.calc(Date.new(2000, 2, 18)).should == "水瓶座" h.calc(Date.new(2000, 2, 19)).should == "魚座" h.calc(Date.new(2000, 3, 20)).should == "魚座" end end
本体 horoscope.rb
class Horoscope def calc(date) mmdd = date.month * 100 + date.day if mmdd <= 119 horo = "山羊座" elsif mmdd <= 218 horo = "水瓶座" elsif mmdd <= 320 horo = "魚座" elsif mmdd <= 419 horo = "牡羊座" elsif mmdd <= 520 horo = "牡牛座" elsif mmdd <= 621 horo = "双子座" elsif mmdd <= 722 horo = "蟹座" elsif mmdd <= 822 horo = "獅子座" elsif mmdd <= 922 horo = "乙女座" elsif mmdd <= 1023 horo = "天秤座" elsif mmdd <= 1121 horo = "蠍座" elsif mmdd <= 1221 horo = "射手座" else horo = "山羊座" end horo end end
これを実行するとこんな感じ。
$ spec -cfs test_horoscope.rb Horoscope のテストがんばるよー - 限界値はうまくいってるかなドキドキ Finished in 0.010572 seconds 1 example, 0 failures $
0 failures、やたー。
機能はいっぱいあるみたいだけど、少しずつ使っていこう。