tdd frameworks let me dream "project specific language"
DESCRIPTION
Using RSpec and Cucumber, modern TDD frameworks, let me dream "Project Specific Language". It's language for us to communicate both client and dev-team member.original title is: プロジェクト特化言語という夢を見たんだ lang:jaTRANSCRIPT
プロジェクト特化言語という夢を見たんだ
2009-07-07 ObjectClub 2009 Summer(株)永和システムマネジメント | Rails勉強会@東京
2009年7月7日火曜日
まとめ✓コミュニケーションのため、プロジェクトの『言語』が欲しい
✓文法はある。RSpecやCucumber
✓語彙を増やしたい。
✓step
✓CustomMatcher
2009年7月7日火曜日
諸橋恭介
✓Rails勉強会@東京の案内係をしています。
✓ここ2年ほどRubyやRailsのプロジェクトで仕事してます。
✓http://ruby.agile.esm.co.jp/
http://d.hatena.ne.jp/moro/
2009年7月7日火曜日
本を書きました
http://amazon.jp/gp/product/4797336625
いっぱい売れるとCucumberの事を追加した第2版が出るかも
2009年7月7日火曜日
2009年7月7日火曜日
RubyらしくなるRSpecと
自然言語指向の割り切りが素敵なCucumber
が
織りなす世界を夢想します
2009年7月7日火曜日
http://rspec.info2009年7月7日火曜日
Test/Unit RSpec
Ruby 自然言語
2009年7月7日火曜日
What?
✓TDD/BDDのためのDSLを提供するテスティングフレームワーク
✓Rubyの良さを活かし、Rubyぽくない記述が出来る
✓英語を真似すぎ、という批判
2009年7月7日火曜日
http://cukes.info2009年7月7日火曜日
Test/Unit RSpec Cucumber
Ruby 自然言語
2009年7月7日火曜日
What?
!"Cucumber executes plain text documentation of code against that code." from README! Cucumberはプレーンテキストドキュメントに対応するコードを実行する(ためのアプリケーションです)
!Better Integration Test
2009年7月7日火曜日
Cucumberが軌道に乗ったらRSpecがRubyぽくなった
✓subject{...}の導入
✓RRのアイディアが入ったmock
✓ネストしたsetup(before) ...
2009年7月7日火曜日
Test/Unit RSpec Cucumber
Ruby 自然言語
2009年7月7日火曜日
ソフトウェアは人が作る
✓コミュニケーション重要✓お客様とのコミュニケーション
✓開発者同士のコミュニケーション
2009年7月7日火曜日
ふたつのレイヤでのコミュニケーション
✓ユーザからみた振る舞い
✓内部構造に関する振る舞い
2009年7月7日火曜日
コミュニケーションのための言語
✓相互に理解可能な言葉✓ドメイン知識やプロジェクトの歴史を反映
✓ハイコンテキスト
✓厳密、あるいは検証可能な言葉✓実行可能ならなおよい
2009年7月7日火曜日
言語に必要なもの
✓文法
✓語彙
2009年7月7日火曜日
Cucumber
✓自然言語で仕様を記述し、実行するための受け入れテストフレームワーク
✓ユーザ視点で、アプリケーションを
ブラックボックステストする
2009年7月7日火曜日
フィーチャ: プロジェクト特化言語を作りたい 開発者として、 お客様とのコミュニケーションを充実させるため プロジェクトに特化した言語が欲しい
シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現がある ならば お客様は、リンクをクリックして遷移すると理解できること かつ 開発者は、アンカーテキストがhogeなa要素のhrefに遷移すると理解できること
シナリオ: 各画面の呼び方を統一したい もし "'プロジェクト情報更新'画面"という表現がある ならば お客様は、管理画面のプロジェクト情報を更新する画面であると理解できること かつ 開発者は、"/admin/projects/:id/edit"の画面であると理解できること
シナリオ: 画面要素の呼び方を統一したい もし "'プロジェクト情報ヘッダ'部分"という表現がある ならば お客様は、画面左斜め上のプロジェクト情報を表示している箇所だと理解できること かつ 開発者は、"div#content div.project div.header"要素であると理解できること
文法
2009年7月7日火曜日
フィーチャ: プロジェクト特化言語を作りたい 開発者として、 お客様とのコミュニケーションを充実させるため プロジェクトに特化した言語が欲しい
シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現がある ならば お客様は、リンクをクリックして遷移すると理解 かつ 開発者は、アンカーテキストがhogeなa要素のhre
文法
2009年7月7日火曜日
シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現が ある ならば お客様は、リンクをクリックして遷移すると 理解できること かつ 開発者は、アンカーテキストがhogeなa要素の hrefに遷移すると理解できること
✓Cukeに同梱のWebratで✓邦訳版、moro-miso.gemあるよ!
操作のための語彙
2009年7月7日火曜日
シナリオ: 各画面の呼び方を統一したい もし "'プロジェクト情報更新'画面"という 表現がある ならば お客様は、管理画面のプロジェクト情報を 更新する画面であると理解できること かつ 開発者は、"/admin/projects/:id/edit"の 画面であると理解できること
✓features/support/paths.rb✓呼び名とURLの辞書
URLに名前を付ける語彙
2009年7月7日火曜日
シナリオ: 画面要素の呼び方を統一したい もし "'プロジェクト情報ヘッダ'部分"という 表現がある ならば お客様は、画面左斜め上のプロジェクト情報を 表示している箇所だと理解できること かつ 開発者は、"div#content div.project div.header"要素であると理解できること
✓misoに入れようと思ってます✓呼び名とセレクタの辞書
DOMに名前を付ける語彙
2009年7月7日火曜日
Cucumber
✓アプリケーションをお客様と話す言語を作るフレームワーク
✓文法を提供していてる
✓語彙を育てよう
✓stepとして操作の語彙を増やそう
✓DOMやURLに名前を付けよう
2009年7月7日火曜日
RSpec
✓デベロッパーテストを記述するためのテスティングフレームワーク
✓独自の記法と豊富なアサーション(matcher)が特長
✓ホワイトボックステストで開発を駆動する
2009年7月7日火曜日
describeProjectSpecificLanguage,"fordepelopper"dobeforedo@[email protected]_grammar:[email protected]_vocabulary:rspecend
describe"addmorevocabraries"doSpec::Mathers.define:drive_development_thando|other|matchdo|actual|actual.communication_cost<other.communication_cost&&actual.readability>other.readabilityendend
beforedo@[email protected]@psl.add_vocabulariesMyCustomMatcher.newendsubject{@psl}it{@psl.should_notbe_nil}it{shoulddrive_development_than(@previous)}endend
文法
2009年7月7日火曜日
操作のための語彙 before do @psl = ProjectSpecificLanguage.new @psl.use_grammar :rspec @psl.defualt_vocabulary :rspec end
2009年7月7日火曜日
✓Matcherもたくさんある
✓ == (other)✓acutal == other
✓ be_xxx✓object.xxx?
✓ have(n).bars✓object.bars.size == n
✓ raise_error✓処理の塊Procでのエラー有無
操作のための語彙
2009年7月7日火曜日
✓アプリケーションのコンテキストでマッチャーを定義できる。簡単に。
Spec::Mathers.define :drive_development_than do ¦other¦
match do ¦actual¦ actual.communication_cost < other.communication_cost \ && actual.readability > other.readability end
end...
it{ should drive_development_than(@previous) }
操作のための語彙
2009年7月7日火曜日
before do @previous = @psl.dup @psl.add_vocabularies MyCustomMatcher.newend...it{ @psl.should_not be_nil }
名前をつける語彙
2009年7月7日火曜日
✓subject{...}を指定して、検証対象を明示✓it{...}内で対象を省略できる
before do @previous = @psl.dup @psl.add_vocabularies Cucumber.newend
subject{ @psl }it{ should drive_development_than(@previous) }
名前をつける語彙
2009年7月7日火曜日
ご参考: subjectの使い方
✓1 example ( it{ ... } )あたり一つ。✓原則として同じexample group (describe)中のものを使う。✓ネストしても直近を一つ。
✓it{ should ... }と書くにはそれぞれdescribeをわける?
2009年7月7日火曜日
Person = Struct.new(:name, :email)
describe Person do subject{ Person.new("moro","moronatural@...") } it{ should be_instance_of(Person) }end
✓it{...}の中でレシーバなしでshouldを呼ぶ✓subjectブロックの評価結果を主語として検証
2009年7月7日火曜日
describe Person.new("moro","moronatural@...") do it{ should be_instance_of(Person) }end
✓describe{...}の引数を、暗黙のsubjectにもできる✓正直、あまり使わない...
2009年7月7日火曜日
describe Person do subject do Person.new("moro","moronatural@...") end it{ subject.name.should == "moro" }end
✓subectを明示的にも呼び出せる
2009年7月7日火曜日
describe Person do before do @me = Person.new("moro","moronatural@...") end subject{ @me } it{ subject.name.should == "moro" }end
✓before..endでインスタンス変数を用意、subject{ }ではそれを返す✓「これが検証の主題=subject だよ」というラベルを付けてる
2009年7月7日火曜日
describe Person do before do @me = Person.new("moro","moronatural@...") end subject{ @me } it{ should be_instance_of(Person) } describe ".name" do subject{ @me.name } it{ should == "moro" } end describe ".email" do subject{ @me.email } it{ should == "moronatural@..." } endend
2009年7月7日火曜日
✓ネストしても使えるのは直近のみ。✓外のExampleGroup (=describe)のは呼べない✓外から使い回す変数はあらかじめ@インスタンス変数として用意
✓テスト対象を(ちょっと)変えるためにExampleGroupを増やす?
2009年7月7日火曜日
そこで
CustomMatcherですよ
2009年7月7日火曜日
Spec::Matchers.define :be_named do ¦name¦ match do ¦person¦ person.name == name endend
describe Person do before do @me = Person.new("moro", "moronatural@...") end subject { @me } it{ should be_instance_of(Person) } it{ should be_named "moro" }end
2009年7月7日火曜日
CustomMatcher
✓操作のための語彙を提供することで
✓名前をつける語彙 をより簡潔/強力に書けるようにする
2009年7月7日火曜日
describe ProjectSpecificLanguage do before do @psl = ProjectSpecificLanguage.new ... end describe “.communication_cost” do subject{ @psl.communication_cost } it{...} end describe “.readability” do subject{ @psl.readability } it{...} end describe ... doend
2009年7月7日火曜日
Spec::Matchers.define :drive_development_than do ¦other¦
match do ¦actual¦ ( actual.communication_cost < other.communication_cost ) && ( actual.readability > other.readability ) end
end
it{ should drive_development_than(@previous) }
2009年7月7日火曜日
RSpec
✓開発者が、内部仕様を語るための言語を作るフレームワーク
✓文法を提供している
✓語彙を育てよう
✓CustomMatcherで操作の語彙を
✓subject{ }を使って対象をわかりやすく
2009年7月7日火曜日
まとめ✓コミュニケーションのため、プロジェクトの『言語』が欲しい
✓文法はある。RSpecやCucumber
✓語彙を育てましょう。
✓step_definition
✓CustomMatcher
2009年7月7日火曜日
RubyらしくなるRSpecと
自然言語指向の割り切りが素敵なCucumber
が
織りなす世界を夢想しませんか?
2009年7月7日火曜日
you.any?{|u| u.question?}
2009年7月7日火曜日
FAQ. Cukeの粒度は?
✓お客様が理解できる粒度で。
✓実際は、まずベタWebratで話して、チームが育ったら高コンテキストに。
✓stepの中でstep呼べる。
2009年7月7日火曜日
FAQ. Cukeとspecの使い分けは?
✓簡単なところはCukeで大外のみ確保
✓RailsならコントローラとビューはCukeに任せることが多い
✓WebAPI系は別途specで
2009年7月7日火曜日
FAQ. CustomMatcherの好みは?
✓前提: CustomMatcherはふつうのRubyクラスでも書けます。
✓が、普段は簡単に書いて必要なら独立させるのが好きです✓語彙の豊穣さが重要
2009年7月7日火曜日
2009年7月7日火曜日
ご清聴ありがとうございました
2009年7月7日火曜日