The RSpec Bookをやってみる

インストール

% ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [i686-linux]

% rails -v
Rails 3.2.7

% rvmsudo gem install rspec
% rspec --version
2.11.1

% rvmsudo gem install cucumber
% cucumber --version
1.2.1

Hello RSpec & Cucumber

hello/5/features/step_definitions/greeter_steps.rbの Thenの行は本だと

Then /^I should see "([^"]*)"$/ do | greeting |
  @message.should == greeting
end

となっているけど、Cucumberを実行した時のエラー文に従って以下のようにしても動く。

Then /^I should see "(.*?)"$/ do | greeting |
  @message.should == greeting
end

今のところさっぱり意味がわからない。

Code Breaker

大雑把には使い方がわかった。確かにスペックファイルが準備されている状況でリファクタリングするのは楽だ。

ただ、リファクタリングの基本思想などがわからないので、なぜそのコードのほうが良いのかがわからない。(式 ? 真のとき : 偽のとき) という書き方はあまり好きじゃないのだけど。

Part 2 ビヘイビア駆動開発(BDD)

さっぱりわからない。アジャイル開発が良いという説明の部分はわかるし、顧客からフィードバックを頻繁にもらうべきだというのもわかる。でも、BDDの本質がわからない。カタカナ語が盛りだくさんでさっぱりだ!

SMARTな結果というのは良い。

  • Specific:何かが完了したことを知るのに十分な情報があることを意味する
  • Measurable:目標が達成できたかどうかを定量的に判断できることを意味する
  • Achievable:達成可能であることを意味する
  • Relevant:目的に関係あること(現時点での目標において適切であること)を意味する。
  • Timeboxed:目標が達成されていないときに、いつ時間切れになるかがわかることを意味する。

Part 3 RSpec

読み飛ばした。たぶん、使うようになってから読み返したほうが良い。

Part 4 Cucumber

Connextraフォーマットの説明は面白い。どういう役割・立場から、誰が何をするのか。そして、その理由は何かを明確にするための書式がconnextraフォーマットとのこと。

As a <role>
I want <feature>
So that <business value>

確かに学生にソフトウェアの要求分析させると非常に抽象的でコーディングにつながる要件を出さない(出せない)。これは使えるかも。

Part5 ビヘイビア駆動のRails

本のとおりだと、「WARNING: Cucumber-rails required outside of env.rb. The rest of loading is being defered until env.rb is called.」というwarningがでる。Cucumber-rails required outside of env.rb. The rest of loading is being defered until env.rb is calledを参考に追記。また、javascriptのライブラリがないのでgenerateコマンドを実行しようとするとエラーがでる。なので、execjsとtherubyracerをGemfileに追記。Cucumber実行時に database_cleaner というのも必要らしいので追記。

% rails new showtime
% cd showtime
% cp -p Gemfile Gemfile.org
% vi Gemfile
% diff Gemfile.org Gemfile
9a10,15
> group :development, :test do
> 	gem "rspec-rails", ">= 2.0.0"
> 	gem "cucumber-rails", ">= 0.3.2", :require => false
>       gem "database_cleaner"
> 	gem "webrat", ">=0.7.2"
> end
24c30,31
< 
---
> gem 'execjs'
> gem 'therubyracer'
% rvmsudo bundle install

RSpecとCucumberのファイルを生成。

% script/rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
% script/rails generate cucumber:install
      create  config/cucumber.yml
      create  script/cucumber
       chmod  script/cucumber
      create  features/step_definitions
      create  features/support
      create  features/support/env.rb
       exist  lib/tasks
      create  lib/tasks/cucumber.rake
        gsub  config/database.yml
        gsub  config/database.yml
       force  config/database.yml

実行確認

% rake db:migrate
% rake db:test:prepare
% rake spec
No examples matching ./spec{,/*/**}/*_spec.rb could be found
% rake cucumber
/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby -S bundle exec cucumber  --profile default
Using the default profile...
0 scenarios
0 steps
0m0.000s

Webratすごい予感。

うっすらわかった気がするけど、これをどう使えば良いのかはまだはっきりしない。