this photo is by Ctd 2005 | http://www.flickr.com/photos/kikisdad/190501758/
2010-11-20 RailsDevCon 2010
諸橋恭介(@moro)
begin
Cucumber
rescue 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メールアドレスが"alice@example.com"のユーザがいる
かつ ログイン名が"bob"、Eメールアドレスが"bob@example.com"のユーザがいる
かつ 以下のユーザごとのメッセージがある:
| ユーザ | メッセージ | 投稿日時 |
| alice | つくば向かう。 | 12時間前 |
| alice | 着席しています(大ホール)。 | 10時間前 |
| alice | 着席しています(ランチ)。 | 1時間前 |
| bob | ランチどうする。 | 3時間前 |
もし "aliceのメッセージ一覧"ページを表示している
ならば 以下のメッセージが表示されていること:
| alice | 着席しています(ランチ)。 |
| alice | 着席しています(大ホール)。 |
| alice | つくば向かう。 |
前提 /^ログイン名が"([^"]*)"、Eメールアドレスが"([^
User.create!(:login => login, :email => email)
end
前提 /^以下のユーザ(?:が|も)いる:$/ do |table|
table.raw.each do |row|
username = row.first
When %Q[ログイン名が"#{username}"、Eメールアドレ
end
end
Cucumber
• お客様と開発者がシステムについて
会話する言語を作るフレームワーク。
• 文法を提供し、語彙を定め、その文脈を育
てるためのフレームワーク。
this photo is by Ctd 2005 | http://www.flickr.com/photos/kikisdad/190501758/
begin
Cucumber
rescue ThisIsNotToy
then_how?
end 現実の世界で
はじめるCucumber
現実
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が
思いつかない
• そもそも、日本語のシナリオの
使い道がない
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が
思いつかない
• そもそも、日本語のシナリオの
使い道がない
現実
http://tatsu-zine.com/books/cuke
•フィーチャ・ステップの構成
•簡単なステップの作り方
•背景
•ネストしたステップ定義
•表を使う
•シナリオアウトライン
•タグを使ったシナリオのメタデータ
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が
思いつかない
• そもそも、日本語のシナリオの
使い道がない
現実
簡単なところから
一歩ずつ
GET /
• インストール
• see 1周目: ミニマム実装と開発環境準備
•一番簡単な画面を表示してみる
•まずは「ホンモノ」のプロジェクトで
動かしてみるのが大事
シナリオ: トップページにタイトルが出る
もし トップ ページを表示している
ならば Ruby x Agile と表示されて
いること
GET /{link}
•そこからリンクを辿ってみる
•もう一度、行った先で表示を検証
シナリオ: サービスメニューを表示する
もし トップ ページを表示している
かつ ふつうのシステム開発 リンクを
クリックする
ならば サービスメニュー と表示されて
いること
POST /{simple-resource}
•簡単なデータ投入してみる
•できるだけ、できるだけ簡単に
• それでもけっこう長くなる
•そろそろステップ定義を作ることも
• see 2周目: アプリケーションを日本語化する
シナリオ: お問い合わせでメールが来る
もし トップ ページを表示している
かつ お問い合わせ・ご相談 リンクを
クリックする
かつ メールアドレス に
helpme@example.com と入力する
かつ お名前(Name) に ぼく と入力する
かつ 本文 に たた、たすけてー と入力する
かつ 送信 ボタンをクリックする
ならば rubyagile@esm.co.jp にメールが
送られること
GET /{current-task}
•いまやっているタスクのテストを書い
てみる
• 集中しているから書きやすい
• OpenID認証とかはちょっとむずい
•これまで書いた分に、バリエーショ
ンを足してみてもよい
• 日本語の情報がない
• いまのプロジェクトへ適用する作戦が
思いつかない
• そもそも、日本語のシナリオの
使い道がない
現実
読みましょう
実行できないシナリオを書く
• 逆に考えるんだ「動かなくたっていいさ」
と考えるんだ
• 読んで、振る舞いがイメージできることを
心がけて書いてみる。
• 既存のステップ定義があるとかないとかは
ちょっとしか気にしない
シナリオ: お問い合わせでメールが来る
もし トップ ページを表示している
かつ お問い合わせ・ご相談 リンクを
クリックする
かつ メールアドレス に
helpme@example.com と入力する
かつ お名前(Name) に 私 と入力する
かつ 本文 に たすけてー と入力する
かつ 送信 ボタンをクリックする
ならば rubyagile@esm.co.jp にメールが
送られること
対話のきっかけに
• 何となくイメージを知りたいお客様と。
• タスクを見積もりたいチームメンバーと。
• 実装の手がかりが欲しい自分自身と。
完璧な
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/
ご清聴
ありがとう
ございました

Begin cucumber-in-real-world