begin cucumber-in-real-world
DESCRIPTION
my talk at RailsDevCon 2010 (http://railsdevcon.jp/)introduceTRANSCRIPT
this photo is by Ctd 2005 | http://www.flickr.com/photos/kikisdad/190501758/
2010-11-20 RailsDevCon 2010諸橋恭介(@moro)
begin Cucumberrescue ThisIsNotToy then_how?end 現実の世界で
“はじめるCucumber”
諸橋恭介(@moro)
• (株)永和システムマネジメント...(中略)... アジャイルグループ所属
• Railsコンサルタント/Railsプログラマ
• Rails勉強会@東京という勉強会を主催
http://d.hatena.ne.jp/moro/
http://tatsu-zine.com/books/cuke
今日お話しすること
• Cucumberを現実のプロジェクトで導入する方法について考えたこと
• 第一歩目のテストの書き方
• その前の、シナリオの書き方
Cucumber
• 自然言語で仕様を記述し、実行するためのテスティングフレームワーク。
• 文に対応するRubyコード (ステップ) を実行
• End to endのテストが書ける。
• ユーザの視点のテストを書ける。
フィーチャ: 短いメッセージを投稿する ユーザとして、 短いメッセージを投稿したい。 なぜなら、ちょっとした考えや日々の細々したことを気軽に情報発信したいからだ。
シナリオ: ユーザごとメッセージ一覧では、指定したユーザのメッセージが 新しい順に表示される
前提 ログイン名が"alice"、Eメールアドレスが"[email protected]"のユーザがいる かつ ログイン名が"bob"、Eメールアドレスが"[email protected]"のユーザがいる かつ 以下のユーザごとのメッセージがある: ¦ ユーザ ¦ メッセージ ¦ 投稿日時 ¦ ¦ alice ¦ つくば向かう。 ¦ 12時間前 ¦ ¦ alice ¦ 着席しています(大ホール)。 ¦ 10時間前 ¦ ¦ alice ¦ 着席しています(ランチ)。 ¦ 1時間前 ¦ ¦ bob ¦ ランチどうする。 ¦ 3時間前 ¦ もし "aliceのメッセージ一覧"ページを表示している ならば 以下のメッセージが表示されていること: ¦ alice ¦ 着席しています(ランチ)。 ¦ ¦ alice ¦ 着席しています(大ホール)。 ¦ ¦ alice ¦ つくば向かう。 ¦
前提 /^ログイン名が"([^"]*)"、Eメールアドレスが"([^"]*)"のユーザがいる$/ do ¦login, email¦ User.create!(:login => login, :email => email)end
前提 /^以下のユーザ(?:が¦も)いる:$/ do ¦table¦ table.raw.each do ¦row¦ username = row.first When %Q[ログイン名が"#{username}"、Eメールアドレスが"#{username}@example.com"のユーザがいる] endend
Cucumber
• お客様と開発者がシステムについて会話する言語を作るフレームワーク。
• 文法を提供し、語彙を定め、その文脈を育てるためのフレームワーク。
this photo is by Ctd 2005 | http://www.flickr.com/photos/kikisdad/190501758/
begin Cucumberrescue ThisIsNotToy then_how?end 現実の世界で
“はじめるCucumber”
現実• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が思いつかない
• そもそも、日本語のシナリオの使い道がない
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が思いつかない
• そもそも、日本語のシナリオの使い道がない
現実
http://tatsu-zine.com/books/cuke
•フィーチャ・ステップの構成•簡単なステップの作り方•背景•ネストしたステップ定義•表を使う•シナリオアウトライン•タグを使ったシナリオのメタデータ
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が思いつかない
• そもそも、日本語のシナリオの使い道がない
現実
簡単なところから一歩ずつ
GET /
• インストール• see 1周目: ミニマム実装と開発環境準備
•一番簡単な画面を表示してみる•まずは「ホンモノ」のプロジェクトで動かしてみるのが大事
シナリオ: トップページにタイトルが出る
もし “トップ”ページを表示している ならば “Ruby x Agile”と表示されて いること
GET /{link}
•そこからリンクを辿ってみる•もう一度、行った先で表示を検証
シナリオ: サービスメニューを表示する
もし “トップ”ページを表示している かつ “ふつうのシステム開発”リンクを クリックする ならば “サービスメニュー”と表示されて いること
POST /{simple-resource}
•簡単なデータ投入してみる•できるだけ、できるだけ簡単に• それでもけっこう長くなる
•そろそろステップ定義を作ることも• see 2周目: アプリケーションを日本語化する
シナリオ: お問い合わせでメールが来る
もし “トップ”ページを表示している かつ “お問い合わせ・ご相談”リンクを クリックする かつ “メールアドレス”に ”[email protected]”と入力する かつ “お名前(Name)”に”ぼく”と入力する かつ “本文”に”たた、たすけてー”と入力する かつ “送信”ボタンをクリックする ならば “[email protected]”にメールが 送られること
GET /{current-task}
•いまやっているタスクのテストを書いてみる• 集中しているから書きやすい
• OpenID認証とかはちょっとむずい
•これまで書いた分に、バリエーションを足してみてもよい
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が思いつかない
• そもそも、日本語のシナリオの使い道がない
現実
読みましょう
実行できないシナリオを書く• 逆に考えるんだ「動かなくたっていいさ」
と考えるんだ
• 読んで、振る舞いがイメージできることを心がけて書いてみる。
• 既存のステップ定義があるとかないとかはちょっとしか気にしない
シナリオ: お問い合わせでメールが来る
もし “トップ”ページを表示している かつ “お問い合わせ・ご相談”リンクを クリックする かつ “メールアドレス”に ”[email protected]”と入力する かつ “お名前(Name)”に”私”と入力する かつ “本文”に”たすけてー”と入力する かつ “送信”ボタンをクリックする ならば “[email protected]”にメールが 送られること
対話のきっかけに
• 何となくイメージを知りたいお客様と。
• タスクを見積もりたいチームメンバーと。
• 実装の手がかりが欲しい自分自身と。
完璧なCuke
完璧なRSpec 実装 RSpec
パスCukeパス
正しい?一歩
完璧なCuke
完璧なRSpec 実装 RSpec
パスCukeパス
それっぽい母国語のCuke
必要なRSpec 実装 RSpec
パス
現実的な一歩
動かないCukeを書く意味• 振る舞いを考える時間になる。
• その機能の「前提」や「結果」をちゃんと考えられる。
• みんなでイメージを共有できる。
• いつか動かしたくなったときにも楽。
動くようにするには• 最低限のエラーを取る。
• 実行してみて、表記揺れを正す。
• 黄色のスニペットを取っていく。
• ステップ定義を追加する。
• 必要ならテスト/実装も直す。
Cucumberのリズム• プロダクトオーナーたちと会話。やることを大まか
に決める。
• Cukeを書きながら振る舞いを考える。
• 難しそうな箇所のRSpecを書く。
• 実装してRSpecを通す。
• Cukeを通す。
• テストのバリエーションや観点を増やす。
FAQ. Cucumberのテストはお客様に見せている?
• ふつうに開発Wikiに書いたり、打合せ資料として見せる。
• 「Cucumberというのがありまして!」とか言わない。
• 別フォーマットの「受け入れテスト仕様」作る必要あればそれはそれで作る。
this photo is by Ctd 2005 | http://www.flickr.com/photos/kikisdad/190501758/
まとめ•Cucumberを現実のプロジェクトで導入する方法を紹介しました
•簡単なテストから書き始める•テストが動かなくても、自分(たち)でよむために、母国語で書く
http://tatsu-zine.com/books/cuke
this photo is by Ctd 2005 | http://www.flickr.com/photos/kikisdad/190501758/
ご清聴ありがとうございました