Your SlideShare is downloading. ×
0
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
TDD frameworks let me dream "Project Specific Language"
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

TDD frameworks let me dream "Project Specific Language"

1,794

Published on

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. …

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:ja

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,794
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
21
Comments
0
Likes
6
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. プロジェクト特化言語 という夢を見たんだ 2009-07-07 ObjectClub 2009 Summer (株)永和システムマネジメント | Rails勉強会@東京 諸橋恭介 k-morohashi@esm.co.jp 2009年7月7日火曜日
  • 2. まとめ ✓コミュニケーションのため、プロジェ クトの『言語』が欲しい ✓文法はある。RSpecやCucumber ✓語彙を増やしたい。 ✓step ✓CustomMatcher 2009年7月7日火曜日
  • 3. 諸橋恭介 ✓Rails勉強会@東京の案内係をして います。 ✓ここ2年ほどRubyやRailsのプロ ジェクトで仕事してます。 ✓http://ruby.agile.esm.co.jp/ http://d.hatena.ne.jp/moro/ 2009年7月7日火曜日
  • 4. 本を書きました http://amazon.jp/gp/product/4797336625 いっぱい売れると Cucumberの事を追加 した第2版が出るかも 2009年7月7日火曜日
  • 5. 2009年7月7日火曜日
  • 6. RubyらしくなるRSpec と 自然言語指向の割り切りが 素敵なCucumber が 織りなす世界を夢想します 2009年7月7日火曜日
  • 7. http://rspec.info 2009年7月7日火曜日
  • 8. Test/ Unit RSpec Ruby 自然言語 2009年7月7日火曜日
  • 9. What? ✓TDD/BDDのためのDSLを提供する テスティングフレームワーク ✓Rubyの良さを活かし、Rubyぽく ない記述が出来る ✓英語を真似すぎ、という批判 2009年7月7日火曜日
  • 10. http://cukes.info 2009年7月7日火曜日
  • 11. Test/ Unit RSpec Cucumber Ruby 自然言語 2009年7月7日火曜日
  • 12. What? !"Cucumber executes plain text documentation of code against that code." from README ! Cucumberはプレーンテキストドキュメントに対応する コードを実行する(ためのアプリケーションです) !Better Integration Test 2009年7月7日火曜日
  • 13. Cucumberが軌道に乗ったら RSpecがRubyぽくなった ✓subject{...}の導入 ✓RRのアイディアが入ったmock ✓ネストしたsetup(before) ... 2009年7月7日火曜日
  • 14. Test/ Unit RSpec Cucumber Ruby 自然言語 2009年7月7日火曜日
  • 15. ソフトウェアは人が作る ✓コミュニケーション重要 ✓お客様とのコミュニケーション ✓開発者同士のコミュニケーション 2009年7月7日火曜日
  • 16. ふたつのレイヤでの コミュニケーション ✓ユーザからみた振る舞い ✓内部構造に関する振る舞い 2009年7月7日火曜日
  • 17. コミュニケーションの ための言語 ✓相互に理解可能な言葉 ✓ドメイン知識やプロジェクトの歴史を反映 ✓ハイコンテキスト ✓厳密、あるいは検証可能な言葉 ✓実行可能ならなおよい 2009年7月7日火曜日
  • 18. 言語に必要なもの ✓文法 ✓語彙 2009年7月7日火曜日
  • 19. Cucumber ✓自然言語で仕様を記述し、実行するた めの受け入れテストフレームワーク ✓ユーザ視点で、アプリケーションを ブラックボックステストする 2009年7月7日火曜日
  • 20. フィーチャ: プロジェクト特化言語を作りたい 開発者として、 お客様とのコミュニケーションを充実させるため プロジェクトに特化した言語が欲しい シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現がある ならば お客様は、リンクをクリックして遷移すると理解できること かつ 開発者は、アンカーテキストがhogeなa要素のhrefに遷移すると理解できること シナリオ: 各画面の呼び方を統一したい もし "'プロジェクト情報更新'画面"という表現がある ならば お客様は、管理画面のプロジェクト情報を更新する画面であると理解できること かつ 開発者は、"/admin/projects/:id/edit"の画面であると理解できること シナリオ: 画面要素の呼び方を統一したい もし "'プロジェクト情報ヘッダ'部分"という表現がある ならば お客様は、画面左斜め上のプロジェクト情報を表示している箇所だと理解できること かつ 開発者は、"div#content div.project div.header"要素であると理解できること 文法 2009年7月7日火曜日
  • 21. フィーチャ: プロジェクト特化言語を作りた 開発者として、 お客様とのコミュニケーションを充実させ プロジェクトに特化した言語が欲しい シナリオ: アプリケーション上の操作を同 もし "'hoge'リンクをクリックする" ならば お客様は、リンクをクリックし かつ 開発者は、アンカーテキストが 文法 2009年7月7日火曜日
  • 22. シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現が ある ならば お客様は、リンクをクリックして遷移すると 理解できること かつ 開発者は、アンカーテキストがhogeなa要素の hrefに遷移すると理解できること ✓Cukeに同梱のWebratで ✓邦訳版、moro-miso.gemあるよ! 操作のための語彙 2009年7月7日火曜日
  • 23. シナリオ: 各画面の呼び方を統一したい もし "'プロジェクト情報更新'画面"という 表現がある ならば お客様は、管理画面のプロジェクト情報を 更新する画面であると理解できること かつ 開発者は、"/admin/projects/:id/edit"の 画面であると理解できること ✓features/support/paths.rb ✓呼び名とURLの辞書 URLに名前を付ける語彙 2009年7月7日火曜日
  • 24. シナリオ: 画面要素の呼び方を統一したい もし "'プロジェクト情報ヘッダ'部分"という 表現がある ならば お客様は、画面左斜め上のプロジェクト情報を 表示している箇所だと理解できること かつ 開発者は、"div#content div.project div.header"要素であると理解できること ✓misoに入れようと思ってます ✓呼び名とセレクタの辞書 DOMに名前を付ける語彙 2009年7月7日火曜日
  • 25. Cucumber ✓アプリケーションをお客様と話す言語 を作るフレームワーク ✓文法を提供していてる ✓語彙を育てよう ✓stepとして操作の語彙を増やそう ✓DOMやURLに名前を付けよう 2009年7月7日火曜日
  • 26. RSpec ✓デベロッパーテストを記述するための テスティングフレームワーク ✓独自の記法と豊富なアサーション (matcher)が特長 ✓ホワイトボックステストで開発を駆動 する 2009年7月7日火曜日
  • 27. describe
ProjectSpecificLanguage,
"for
depelopper"
do 

before
do 



@psl
=
ProjectSpecificLanguage.new 



@psl.use_grammar
:rspec 



@psl.defualt_vocabulary
:rspec 

end 

describe
"add
more
vocabraries"
do 



Spec::Mathers.define
:drive_development_than
do
|other| 





match
do
|actual| 







actual.communication_cost
<
other.communication_cost
&& 







actual.readability
>
other.readability 





end 



end 



before
do 





@previous
=
@psl.dup 





@psl.add_vocabularies
MyCustomMatcher.new 



end 



subject{
@psl
} 



it{
@psl.should_not
be_nil
} 



it{
should
drive_development_than(@previous)
} 

end end 文法 2009年7月7日火曜日
  • 28. 操作のための語彙 before do @psl = ProjectSpecificLanguage.new @psl.use_grammar :rspec @psl.defualt_vocabulary :rspec end 2009年7月7日火曜日
  • 29. ✓Matcherもたくさんある ✓ == (other) ✓acutal == other ✓ be_xxx ✓object.xxx? ✓ have(n).bars ✓object.bars.size == n ✓ raise_error ✓処理の塊Procでのエラー有無 操作のための語彙 2009年7月7日火曜日
  • 30. ✓アプリケーションのコンテキストでマッチャーを 定義できる。簡単に。 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日火曜日
  • 31. before do @previous = @psl.dup @psl.add_vocabularies MyCustomMatcher.new end ... it{ @psl.should_not be_nil } 名前をつける語彙 2009年7月7日火曜日
  • 32. ✓subject{...}を指定して、検証対象を明示 ✓it{...}内で対象を省略できる before do @previous = @psl.dup @psl.add_vocabularies Cucumber.new end subject{ @psl } it{ should drive_development_than(@previous) } 名前をつける語彙 2009年7月7日火曜日
  • 33. ご参考: subjectの使い方 ✓1 example ( it{ ... } )あたり一つ。 ✓原則として同じexample group (describe)中のものを使う。 ✓ネストしても直近を一つ。 ✓it{ should ... }と書くにはそれぞれ describeをわける? 2009年7月7日火曜日
  • 34. 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日火曜日
  • 35. describe Person.new("moro","moronatural@...") do it{ should be_instance_of(Person) } end ✓describe{...}の引数を、暗黙の subjectにもできる ✓正直、あまり使わない... 2009年7月7日火曜日
  • 36. describe Person do subject do Person.new("moro","moronatural@...") end it{ subject.name.should == "moro" } end ✓subectを明示的にも呼び出せる 2009年7月7日火曜日
  • 37. 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日火曜日
  • 38. 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@..." } end end 2009年7月7日火曜日
  • 39. ✓ネストしても使えるのは直近のみ。 ✓外のExampleGroup (=describe)のは呼べな い ✓外から使い回す変数はあらかじめ@インスタンス 変数として用意 ✓テスト対象を(ちょっと)変えるために ExampleGroupを増やす? 2009年7月7日火曜日
  • 40. そこで CustomMatcher ですよ 2009年7月7日火曜日
  • 41. Spec::Matchers.define :be_named do |name| match do |person| person.name == name end end 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日火曜日
  • 42. CustomMatcher ✓操作のための語彙を提供 することで ✓名前をつける語彙 をより簡 潔/強力に書けるようにする 2009年7月7日火曜日
  • 43. 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 ... do end 2009年7月7日火曜日
  • 44. 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日火曜日
  • 45. RSpec ✓開発者が、内部仕様を語るための言語 を作るフレームワーク ✓文法を提供している ✓語彙を育てよう ✓CustomMatcherで操作の語彙を ✓subject{ }を使って対象をわかりやすく 2009年7月7日火曜日
  • 46. まとめ ✓コミュニケーションのため、プロジェ クトの『言語』が欲しい ✓文法はある。RSpecやCucumber ✓語彙を育てましょう。 ✓step_definition ✓CustomMatcher 2009年7月7日火曜日
  • 47. RubyらしくなるRSpec と 自然言語指向の割り切りが 素敵なCucumber が 織りなす世界を夢想しませんか? 2009年7月7日火曜日
  • 48. you.any?{|u| u.question? } 2009年7月7日火曜日
  • 49. FAQ. Cukeの粒度は? ✓お客様が理解できる粒度で。 ✓実際は、まずベタWebratで話して、 チームが育ったら高コンテキストに。 ✓stepの中でstep呼べる。 2009年7月7日火曜日
  • 50. FAQ. Cukeとspecの 使い分けは? ✓簡単なところはCukeで大外のみ確保 ✓Railsならコントローラとビューは Cukeに任せることが多い ✓WebAPI系は別途specで 2009年7月7日火曜日
  • 51. FAQ. CustomMatcherの 好みは? ✓前提: CustomMatcherはふつう のRubyクラスでも書けます。 ✓が、普段は簡単に書いて必要なら 独立させるのが好きです ✓語彙の豊穣さが重要 2009年7月7日火曜日
  • 52. 2009年7月7日火曜日
  • 53. ご清聴あり がとうござ いました 2009年7月7日火曜日

×