Jun's Blog

Output, activities, memo and etc.

Ruby development with RSpec and Cucumber

Rails勉強会@東京第42回に行ってきました。

RSpec

前半はまだあまり慣れていないRSpecののセッションに参加しました!

概要

Rubyで、Specification(仕様)を先に書く開発手法だからRSpecという名前なのかな。
RSpecを一言でいえば「printlnの代わり」
動作確認するときにprintlnの代わりにRSpec使うと便利という意味。
Rails開発では、controllerのロジックは薄く、modelに機能を集約するのがよいので、RSpecはmodelだけに使うのがよいとのこと。

コード

後半は id:moro さんに、Skip Wikiのspecファイルのnote_spec.rbのソースコードを見せて頂きながら、説明して頂きました。

RSpecは自明な部分とか全部をテストするときりがないので、キモになる部分をテストする。
id:moro もろはしさんのキモは「現在のmodelが保存されているかどうか」ということなので、しばしばmodelの保存状態を確認するコードがある。(reloadの行)

before do
  @page = @note.pages.add(@initialize_attrs.merge(:format_type => "html"), @user)
end
it "create new page" do
  @page.save!
  @note.reload.should have(1).pages
end

またspecのコードは、以下のようにbefore条件が共通なものをまとめて書くとよい。

describe Xxx do
  before do
  ...
  end
  describe "XXXの場合" do 
    before do
    ...
    end
    describe "XXXの場合" do 
      before do
      ...
      end
      describe "XXXの場合" do
      ...
      end
    end
    describe "XXXの場合" do
    ...
    end
  end
end

specが書けたら以下のように実行

$ rake spec
学習
その他Tips
  • Custom Matchersを積極的に使おう。プロジェクトにより、マッチの概念レイヤーを一つあげ、作っておくだけで、同じコードが復習個所に散らばらず効率良くテストできる。(下記参考URL参照)
  • subject: レシーバーの設定。id:ayumuaizawaさんのこちらの説明が分かりやすかった。
  • content: describe の alias。ケースにより使い分けようとのこと。面倒なのでdescribe統一でいいや。
  • バッチのspecテストでは、インプット、アウトプットデータとやりとりするところが大変だけどfakefsというgithubのモジュールを利用すると便利とのこと。
参考

Cucumber

概要

Cucumber(発音:キューカンバー、意味:キュウリ)。
なんでキュウリなのだろうか?
Cucumberを一言でいうと、「受け入れテストに最適」
「人生」というご意見もありましたが、気持ちは伝わりましたが、そういうのはナシでお願いします(笑)

結論からいうと、開発にはCucumberは必須だけど、RSpecは必須じゃない
Cucumberのテストが通っていれば、お客さんにはOK。別にモデルの名前やパスが違ってもお客さんには関係ないからね。

ホストをさせて頂いた。
以下の手順で進めさせてもらった。

  1. 参加者にCucumberの認識度を聞き、参加者のレベルを把握。→進めやすい
  2. Cucumberという言葉の定義、意味を共有。→これをやっておくと参加者の方が議論しやすい。
  3. 参加者全員に今日、Cucumberについて聞きたいことを聞く→期待値の調整。参加者の期待に添う内容で進めるため。
  4. 聞きたい内容について議論
  5. 参加者全員に今日の満足度を確認→同情はいらないですよっ(笑)
Topics
  • 何ができるのか?
  • 何がうれしいのか?
  • どういうstepがあるのか?→付属のstepよりレイヤーが高い独自step作ろう。EMailSkip(?)は便利とのこと。よいサンプルがあればいいのですが、Skip Wikiソースもレイヤーは高くないので、各自で頑張ろう。
  • 導入ノウハウ→Nokogiri(Webスクレーピング)、ウェブラット(?)モジュールは必須。
  • What?→「人生」(笑)
  • Contorollerに使ってもOK?→OK。簡単にかけるよ。
  • Cucumberはモバイルで使える?(携帯固有の端末IDとかあるけど)→大丈夫。Mechanizeも便利だよ。
  • CucumberとRSpecとの使い分けは?→RSpecはmodel用。Cucumberはそれ以外。でもRSpecは必須じゃないよ。
学習方法
  • 一番効果的な学習法は、知っている人と一緒に仕事すること。(なので、id:moro さんの会社にRails導入コンサルを頼みましょう(笑))
  • Cucumberは一度覚えると簡単でやみつきになる。ただ最初はやっぱり努力は必要。1週間ぐらいは時間をとり、個人プロジェクトで試したりして、ベーススキルを付けよう。ベーススキルがついたら会社のプロジェクトで提案してみよう。ベーススキルがないのに提案すると、「なんだやっぱ駄目じゃん」と返りうちにあう恐れがあります(笑)

Cucumberは以下のように実行。

$ rake features