テストしてますか!?
僕は非常にテストが苦手です。
なんでだろうと思い起こすと、自分の性格が関係しているのだと思います。
動くところをすぐに見たくて、早く動かしてみたくなってしまうんです。
テストを書いておくと動作確認が早くできます。
使い捨て
かプロトタイプ
でもない限り、テストは必要です。
という事で、テストをrspec
で書いてみようと思います。
minitestを使ってみる
標準でインストールされているminitest
を使ってみてからrspec
と比較してみましょう。
Meme
クラスにi_can_has_cheezburger?
のメソッドを作成します。
なれるまでは大変なのですが、テストから書いてみましょう。
OSX 10.9
ruby 2.0.0-p353
で操作確認しています。
require_relative 'meme'
require 'minitest/autorun'
class TestMeme < MiniTest::Unit::TestCase
def setup
@meme = Meme.new
end
def test_that_kitty_can_eat
assert_equal "OHAI!", @meme.i_can_has_cheezburger?
end
end
i_can_has_cheezburger?
のメソッドを定義しましょう。
戻り値はnil
でいいです。
class Meme
def i_can_has_cheezburger?
nil
end
end
さて、実行してみます。
$ ruby test_meme.rb
MiniTest::Unit::TestCase is now Minitest::Test. From test_meme.rb:4:in `<main>'
Run options: --seed 60940
# Running:
F
Finished in 0.024583s, 40.6785 runs/s, 40.6785 assertions/s.
1) Failure:
TestMeme#test_that_kitty_can_eat [test_meme.rb:10]:
Expected: "OHAI!"
Actual: nil
1 runs, 1 assertions, 1 failures, 0 errors, 0 skips
OHAI!
という文字列が返ってくることを期待しているが、実際はnil
が返っているのでテストは失敗しているという結果です。
i_can_has_cheezburger?
メソッドにOHAI!
を返すようにしてテストを実行してみます。
class Meme
def i_can_has_cheezburger?
"OHAI!"
end
end
さて、実行してみます。
$ ruby test_meme.rb
Run options: --seed 60679
# Running tests:
.
Finished tests in 0.000784s, 1275.5102 tests/s, 1275.5102 assertions/s.
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips
今度は成功しました。
他のテストの書き方もあるようなので紹介します。
require_relative 'meme'
require 'minitest/autorun'
describe Meme do
before do
@meme = Meme.new
end
describe "when asked about cheeseburgers" do
it "must respond positively" do
@meme.i_can_has_cheezburger?.must_equal "OHAI!"
end
end
end
テストが失敗したときにwhen asked about cheesebergers
と表示されるので、ここにどんなテストかを書いておけば、debugには役に立ちそうです。
RSpecを使ってみる
さて、そろそろRSpecを使ってみましょう。まずは、インストールからですね。
source "https://rubygems.org"
gem "rspec", "~> 2.14.1"
$ bundle install --path=vendor/bundle
Fetching gem metadata from https://rubygems.org/.........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Installing diff-lcs (1.2.5)
Installing rspec-core (2.14.7)
Installing rspec-expectations (2.14.4)
Installing rspec-mocks (2.14.4)
Installing rspec (2.14.1)
Using bundler (1.3.5)
Your bundle is complete!
It was installed into ./vendor/bundle
さーてインストールできたぞ。
require_relative 'meme'
describe Meme do
before do
@meme = Meme.new
end
describe "when asked about cheeseburgers" do
it "must respond positively" do
@meme.i_can_has_cheezburger?.should eq("OHAI!")
end
end
end
そして、早速実行。
$ bundle exec rspec meme_rspec.rb
.
Finished in 0.00108 seconds
1 example, 0 failures
最後に
minitest
とRSpec
を使ってみました。
今回のケースだけでいうとどちらも同じような書き方ができることが分かりました。
次回は、もう少し深くRSpec
を使ってみようと思います。
テストが好きになってきました。(言い聞かせているwww)