53
プロジェクト特化言語 という夢を見たんだ 2009-07-07 ObjectClub 2009 Summer ()永和システムマネジメント | Rails勉強会@東京 諸橋恭介 [email protected] 200977日火曜日

TDD frameworks let me dream "Project Specific Language"

Embed Size (px)

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

Citation preview

Page 1: TDD frameworks let me dream "Project Specific Language"

プロジェクト特化言語という夢を見たんだ

2009-07-07 ObjectClub 2009 Summer(株)永和システムマネジメント | Rails勉強会@東京

諸橋恭介[email protected]

2009年7月7日火曜日

Page 2: TDD frameworks let me dream "Project Specific Language"

まとめ✓コミュニケーションのため、プロジェクトの『言語』が欲しい

✓文法はある。RSpecやCucumber

✓語彙を増やしたい。

✓step

✓CustomMatcher

2009年7月7日火曜日

Page 3: TDD frameworks let me dream "Project Specific Language"

諸橋恭介

✓Rails勉強会@東京の案内係をしています。

✓ここ2年ほどRubyやRailsのプロジェクトで仕事してます。

✓http://ruby.agile.esm.co.jp/

http://d.hatena.ne.jp/moro/

2009年7月7日火曜日

Page 4: TDD frameworks let me dream "Project Specific Language"

本を書きました

http://amazon.jp/gp/product/4797336625

いっぱい売れるとCucumberの事を追加した第2版が出るかも

2009年7月7日火曜日

Page 5: TDD frameworks let me dream "Project Specific Language"

2009年7月7日火曜日

Page 6: TDD frameworks let me dream "Project Specific Language"

RubyらしくなるRSpecと

自然言語指向の割り切りが素敵なCucumber

織りなす世界を夢想します

2009年7月7日火曜日

Page 7: TDD frameworks let me dream "Project Specific Language"

http://rspec.info2009年7月7日火曜日

Page 8: TDD frameworks let me dream "Project Specific Language"

Test/Unit RSpec

Ruby 自然言語

2009年7月7日火曜日

Page 9: TDD frameworks let me dream "Project Specific Language"

What?

✓TDD/BDDのためのDSLを提供するテスティングフレームワーク

✓Rubyの良さを活かし、Rubyぽくない記述が出来る

✓英語を真似すぎ、という批判

2009年7月7日火曜日

Page 10: TDD frameworks let me dream "Project Specific Language"

http://cukes.info2009年7月7日火曜日

Page 11: TDD frameworks let me dream "Project Specific Language"

Test/Unit RSpec Cucumber

Ruby 自然言語

2009年7月7日火曜日

Page 12: TDD frameworks let me dream "Project Specific Language"

What?

!"Cucumber executes plain text documentation of code against that code." from README! Cucumberはプレーンテキストドキュメントに対応するコードを実行する(ためのアプリケーションです)

!Better Integration Test

2009年7月7日火曜日

Page 13: TDD frameworks let me dream "Project Specific Language"

Cucumberが軌道に乗ったらRSpecがRubyぽくなった

✓subject{...}の導入

✓RRのアイディアが入ったmock

✓ネストしたsetup(before) ...

2009年7月7日火曜日

Page 14: TDD frameworks let me dream "Project Specific Language"

Test/Unit RSpec Cucumber

Ruby 自然言語

2009年7月7日火曜日

Page 15: TDD frameworks let me dream "Project Specific Language"

ソフトウェアは人が作る

✓コミュニケーション重要✓お客様とのコミュニケーション

✓開発者同士のコミュニケーション

2009年7月7日火曜日

Page 16: TDD frameworks let me dream "Project Specific Language"

ふたつのレイヤでのコミュニケーション

✓ユーザからみた振る舞い

✓内部構造に関する振る舞い

2009年7月7日火曜日

Page 17: TDD frameworks let me dream "Project Specific Language"

コミュニケーションのための言語

✓相互に理解可能な言葉✓ドメイン知識やプロジェクトの歴史を反映

✓ハイコンテキスト

✓厳密、あるいは検証可能な言葉✓実行可能ならなおよい

2009年7月7日火曜日

Page 18: TDD frameworks let me dream "Project Specific Language"

言語に必要なもの

✓文法

✓語彙

2009年7月7日火曜日

Page 19: TDD frameworks let me dream "Project Specific Language"

Cucumber

✓自然言語で仕様を記述し、実行するための受け入れテストフレームワーク

✓ユーザ視点で、アプリケーションを

ブラックボックステストする

2009年7月7日火曜日

Page 20: TDD frameworks let me dream "Project Specific Language"

フィーチャ: プロジェクト特化言語を作りたい 開発者として、 お客様とのコミュニケーションを充実させるため プロジェクトに特化した言語が欲しい

シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現がある ならば お客様は、リンクをクリックして遷移すると理解できること かつ 開発者は、アンカーテキストがhogeなa要素のhrefに遷移すると理解できること

シナリオ: 各画面の呼び方を統一したい もし "'プロジェクト情報更新'画面"という表現がある ならば お客様は、管理画面のプロジェクト情報を更新する画面であると理解できること かつ 開発者は、"/admin/projects/:id/edit"の画面であると理解できること

シナリオ: 画面要素の呼び方を統一したい もし "'プロジェクト情報ヘッダ'部分"という表現がある ならば お客様は、画面左斜め上のプロジェクト情報を表示している箇所だと理解できること かつ 開発者は、"div#content div.project div.header"要素であると理解できること

文法

2009年7月7日火曜日

Page 21: TDD frameworks let me dream "Project Specific Language"

フィーチャ: プロジェクト特化言語を作りたい 開発者として、 お客様とのコミュニケーションを充実させるため プロジェクトに特化した言語が欲しい

シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現がある ならば お客様は、リンクをクリックして遷移すると理解 かつ 開発者は、アンカーテキストがhogeなa要素のhre

文法

2009年7月7日火曜日

Page 22: TDD frameworks let me dream "Project Specific Language"

シナリオ: アプリケーション上の操作を同じ言葉で話す もし "'hoge'リンクをクリックする"という表現が ある ならば お客様は、リンクをクリックして遷移すると 理解できること かつ 開発者は、アンカーテキストがhogeなa要素の hrefに遷移すると理解できること

✓Cukeに同梱のWebratで✓邦訳版、moro-miso.gemあるよ!

操作のための語彙

2009年7月7日火曜日

Page 23: TDD frameworks let me dream "Project Specific Language"

シナリオ: 各画面の呼び方を統一したい もし "'プロジェクト情報更新'画面"という 表現がある ならば お客様は、管理画面のプロジェクト情報を 更新する画面であると理解できること かつ 開発者は、"/admin/projects/:id/edit"の 画面であると理解できること

✓features/support/paths.rb✓呼び名とURLの辞書

URLに名前を付ける語彙

2009年7月7日火曜日

Page 24: TDD frameworks let me dream "Project Specific Language"

シナリオ: 画面要素の呼び方を統一したい もし "'プロジェクト情報ヘッダ'部分"という 表現がある ならば お客様は、画面左斜め上のプロジェクト情報を 表示している箇所だと理解できること かつ 開発者は、"div#content div.project div.header"要素であると理解できること

✓misoに入れようと思ってます✓呼び名とセレクタの辞書

DOMに名前を付ける語彙

2009年7月7日火曜日

Page 25: TDD frameworks let me dream "Project Specific Language"

Cucumber

✓アプリケーションをお客様と話す言語を作るフレームワーク

✓文法を提供していてる

✓語彙を育てよう

✓stepとして操作の語彙を増やそう

✓DOMやURLに名前を付けよう

2009年7月7日火曜日

Page 26: TDD frameworks let me dream "Project Specific Language"

RSpec

✓デベロッパーテストを記述するためのテスティングフレームワーク

✓独自の記法と豊富なアサーション(matcher)が特長

✓ホワイトボックステストで開発を駆動する

2009年7月7日火曜日

Page 27: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 28: TDD frameworks let me dream "Project Specific Language"

操作のための語彙 before do @psl = ProjectSpecificLanguage.new @psl.use_grammar :rspec @psl.defualt_vocabulary :rspec end

2009年7月7日火曜日

Page 29: TDD frameworks let me dream "Project Specific Language"

✓Matcherもたくさんある

✓ == (other)✓acutal == other

✓ be_xxx✓object.xxx?

✓ have(n).bars✓object.bars.size == n

✓ raise_error✓処理の塊Procでのエラー有無

操作のための語彙

2009年7月7日火曜日

Page 30: TDD frameworks let me dream "Project Specific Language"

✓アプリケーションのコンテキストでマッチャーを定義できる。簡単に。

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日火曜日

Page 31: TDD frameworks let me dream "Project Specific Language"

before do @previous = @psl.dup @psl.add_vocabularies MyCustomMatcher.newend...it{ @psl.should_not be_nil }

名前をつける語彙

2009年7月7日火曜日

Page 32: TDD frameworks let me dream "Project Specific Language"

✓subject{...}を指定して、検証対象を明示✓it{...}内で対象を省略できる

before do @previous = @psl.dup @psl.add_vocabularies Cucumber.newend

subject{ @psl }it{ should drive_development_than(@previous) }

名前をつける語彙

2009年7月7日火曜日

Page 33: TDD frameworks let me dream "Project Specific Language"

ご参考: subjectの使い方

✓1 example ( it{ ... } )あたり一つ。✓原則として同じexample group (describe)中のものを使う。✓ネストしても直近を一つ。

✓it{ should ... }と書くにはそれぞれdescribeをわける?

2009年7月7日火曜日

Page 34: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 35: TDD frameworks let me dream "Project Specific Language"

describe Person.new("moro","moronatural@...") do it{ should be_instance_of(Person) }end

✓describe{...}の引数を、暗黙のsubjectにもできる✓正直、あまり使わない...

2009年7月7日火曜日

Page 36: TDD frameworks let me dream "Project Specific Language"

describe Person do subject do Person.new("moro","moronatural@...") end it{ subject.name.should == "moro" }end

✓subectを明示的にも呼び出せる

2009年7月7日火曜日

Page 37: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 38: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 39: TDD frameworks let me dream "Project Specific Language"

✓ネストしても使えるのは直近のみ。✓外のExampleGroup (=describe)のは呼べない✓外から使い回す変数はあらかじめ@インスタンス変数として用意

✓テスト対象を(ちょっと)変えるためにExampleGroupを増やす?

2009年7月7日火曜日

Page 40: TDD frameworks let me dream "Project Specific Language"

そこで

CustomMatcherですよ

2009年7月7日火曜日

Page 41: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 42: TDD frameworks let me dream "Project Specific Language"

CustomMatcher

✓操作のための語彙を提供することで

✓名前をつける語彙 をより簡潔/強力に書けるようにする

2009年7月7日火曜日

Page 43: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 44: TDD frameworks let me dream "Project Specific Language"

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日火曜日

Page 45: TDD frameworks let me dream "Project Specific Language"

RSpec

✓開発者が、内部仕様を語るための言語を作るフレームワーク

✓文法を提供している

✓語彙を育てよう

✓CustomMatcherで操作の語彙を

✓subject{ }を使って対象をわかりやすく

2009年7月7日火曜日

Page 46: TDD frameworks let me dream "Project Specific Language"

まとめ✓コミュニケーションのため、プロジェクトの『言語』が欲しい

✓文法はある。RSpecやCucumber

✓語彙を育てましょう。

✓step_definition

✓CustomMatcher

2009年7月7日火曜日

Page 47: TDD frameworks let me dream "Project Specific Language"

RubyらしくなるRSpecと

自然言語指向の割り切りが素敵なCucumber

織りなす世界を夢想しませんか?

2009年7月7日火曜日

Page 48: TDD frameworks let me dream "Project Specific Language"

you.any?{|u| u.question?}

2009年7月7日火曜日

Page 49: TDD frameworks let me dream "Project Specific Language"

FAQ. Cukeの粒度は?

✓お客様が理解できる粒度で。

✓実際は、まずベタWebratで話して、チームが育ったら高コンテキストに。

✓stepの中でstep呼べる。

2009年7月7日火曜日

Page 50: TDD frameworks let me dream "Project Specific Language"

FAQ. Cukeとspecの使い分けは?

✓簡単なところはCukeで大外のみ確保

✓RailsならコントローラとビューはCukeに任せることが多い

✓WebAPI系は別途specで

2009年7月7日火曜日

Page 51: TDD frameworks let me dream "Project Specific Language"

FAQ. CustomMatcherの好みは?

✓前提: CustomMatcherはふつうのRubyクラスでも書けます。

✓が、普段は簡単に書いて必要なら独立させるのが好きです✓語彙の豊穣さが重要

2009年7月7日火曜日

Page 52: TDD frameworks let me dream "Project Specific Language"

2009年7月7日火曜日

Page 53: TDD frameworks let me dream "Project Specific Language"

ご清聴ありがとうございました

2009年7月7日火曜日