agile web development with rails and cucumber

55
Agile Web Development with Rails and Cucumber 株式会社永和システムマネジメント サービスプロバイディング事業部 浦嶌 啓太

Upload: keita-urashima

Post on 28-May-2015

1.358 views

Category:

Technology


4 download

DESCRIPTION

at NagoyaRubyKaigi01

TRANSCRIPT

Page 1: Agile Web Development with Rails and Cucumber

Agile Web Developmentwith

Rails and Cucumber株式会社永和システムマネジメントサービスプロバイディング事業部

浦嶌 啓太

Page 2: Agile Web Development with Rails and Cucumber

✓(株)永和システムマネジメント

✓Rubyプログラマ

✓三重県出身で名古屋の大学に通っていました

浦嶌 啓太 (id:ursm)http://d.hatena.ne.jp/ursm/http://twitter.com/ursm

Page 3: Agile Web Development with Rails and Cucumber

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

Page 4: Agile Web Development with Rails and Cucumber

よろしくお願いします

Page 5: Agile Web Development with Rails and Cucumber
Page 6: Agile Web Development with Rails and Cucumber
Page 7: Agile Web Development with Rails and Cucumber

✓RubyとRailsは顧客との対話によって駆動されるインクリメンタルな開発を実現した

✓一方、成長し続けるシステムの今の姿を把握するのはどんどん難しくなっていく

✓開発を持続していくためにシステムの振る舞いを何らかの形で表現しなければならない

Page 9: Agile Web Development with Rails and Cucumber

Cucumber

1. キュウリ

2. 特定の形式で記述されたフィーチャ(要求)を元に、システムが期待通りに振る舞うかをテストするフレームワーク

【名】

Page 10: Agile Web Development with Rails and Cucumber
Page 11: Agile Web Development with Rails and Cucumber

フィーチャ: ユーザを管理する シナリオ: ユーザを追加する 前提 "New user"ページを表示している もし "Name"に"user1"と入力する かつ "Create"ボタンをクリックする ならば "user1"と表示されていること

Page 12: Agile Web Development with Rails and Cucumber

✓フィーチャ✓シナリオ✓ステップ

Page 13: Agile Web Development with Rails and Cucumber

ステップ✓Given

前提 "New user"ページを表示している

✓Whenもし "Name"に"user1"と入力する

✓Thenならば "user1"と表示されていること

Page 14: Agile Web Development with Rails and Cucumber

シナリオ✓あるフローを構成するステップの

集まり

シナリオ: ユーザを追加する 前提 "New user"ページを表示している もし "Name"に"user1"と入力する かつ "Create"ボタンをクリックする ならば "user1"と表示されていること

Page 15: Agile Web Development with Rails and Cucumber

✓ある要求を構成するシナリオの集まり

フィーチャ

フィーチャ: ユーザを管理する シナリオ: ユーザを追加する … シナリオ: ユーザを削除する …

Page 16: Agile Web Development with Rails and Cucumber

✓フィーチャ✓シナリオ✓ステップ

Page 17: Agile Web Development with Rails and Cucumber
Page 18: Agile Web Development with Rails and Cucumber

Step DefinitionsGiven /^"([^\"]*)"ページを表示している$/ do |page_name|

  visit path_to(page_name)end

When /^"([^\"]*)"に"([^\"]*)"と入力する$/ do |field, value|  fill_in(field, :with => value)end

Then /^"([^\"]*)"と表示されていること$/ do |regexp|

  regexp = Regexp.new(regexp)  response.should_not contain(regexp)end

Page 19: Agile Web Development with Rails and Cucumber

これ}

Page 20: Agile Web Development with Rails and Cucumber

Given /^"([^\"]*)"ページを表示している$/ do |page_name|  visit path_to(page_name)end

前提 "New user"ページを表示している

Page 21: Agile Web Development with Rails and Cucumber

✓簡単なことは簡単に✓ 標準のStep definitionが用意されている

✓ リンクを辿る, フィールドに入力する, etc...

Page 22: Agile Web Development with Rails and Cucumber

✓難しいこともそれなりに✓ 自分でStep definitionを書く

✓ Rubyでできることなら大体できる

✓ 複雑な画面をXPathで切り出して検証する, 別システムに問い合わせる, etc...

Page 23: Agile Web Development with Rails and Cucumber

1. フィーチャを書く

2. Step definitionsを書く

3. プロダクションコードを書く

4. Cucumberで検証する

Page 24: Agile Web Development with Rails and Cucumber

Cucumberのうれしさ

Page 25: Agile Web Development with Rails and Cucumber

フィーチャ: ユーザを管理する シナリオ: ユーザを追加する 前提 "New user"ページを表示している もし "Name"に"user1"と入力する かつ "Create"ボタンをクリックする ならば "user1"と表示されていること

Page 26: Agile Web Development with Rails and Cucumber

誰でも読める

Page 27: Agile Web Development with Rails and Cucumber

✓お客様が仕様を確認する

✓テスト担当者がシナリオの不足をチェックする

✓開発を引き継いだ担当者がシステムの概要を調べる

Page 28: Agile Web Development with Rails and Cucumber

もちろん開発者にとっても読みやすく書きやすい

Page 29: Agile Web Development with Rails and Cucumber

システムに関わる人みんなの共通言語になる

Page 30: Agile Web Development with Rails and Cucumber

ユーザ視点

Page 31: Agile Web Development with Rails and Cucumber

フィーチャ: ユーザを管理する シナリオ: ユーザを追加する 前提 "New user"ページを表示している もし "Name"に"user1"と入力する かつ "Create"ボタンをクリックする ならば "user1"と表示されていること

✓ユーザから見たシステムの振る舞いが記述される

Page 32: Agile Web Development with Rails and Cucumber

✓1つ変更を加えるとテストが軒並み落ちる

✓テストが足枷になってしまう

➡実装をテストしている

テストにありがちなこと

Page 33: Agile Web Development with Rails and Cucumber

ユーザの視点に立ってシステムをブラックボックステストする

Page 34: Agile Web Development with Rails and Cucumber

RSpec Cucumber

ターゲット

エンドポイント

視点

オブジェクト システム

メソッド UI

開発者 エンドユーザ

Page 35: Agile Web Development with Rails and Cucumber

ユーザにとっての振る舞いが変化しない限り、安心してコードを変更できる

Page 36: Agile Web Development with Rails and Cucumber

資産価値の高いテストコード

Page 37: Agile Web Development with Rails and Cucumber

✓RSpecはオブジェクトの振る舞いを表現する

✓Cucumberはシステムの振る舞いを表現する

Page 38: Agile Web Development with Rails and Cucumber

"When you get down to nitty gritty details, drop down one

abstraction level and use RSpec, or any Ruby testing framework,

to write some specs/tests for your classes."

Page 39: Agile Web Development with Rails and Cucumber

キュウリが育つ土壌をつくる

Page 40: Agile Web Development with Rails and Cucumber

✓Cucumberも放っておくと荒廃する

✓キュウリが育つ土壌づくりが大切

Page 41: Agile Web Development with Rails and Cucumber

✓エンドユーザになりきる

✓フィーチャをリファクタリングする

✓プロジェクトに特化した語彙を作る

Page 42: Agile Web Development with Rails and Cucumber

✓"お客様はそれを知っているか?"

✓主語に注意する

エンドユーザになりきる

Page 43: Agile Web Development with Rails and Cucumber

シナリオ: 記事を投稿する  前提 "articles"テーブルが空である  もし "/artiles/new"に"body=hoge"をPOSTで送る  ならば "Article.count"が1であること かつ フィードを生成すること

Page 44: Agile Web Development with Rails and Cucumber

フィーチャのリファクタリング

✓フィーチャはドキュメントです

✓常に推敲を心がけましょう

Page 45: Agile Web Development with Rails and Cucumber

フィーチャ: 記事を管理する  シナリオ: 記事を投稿する    # ログイン処理    前提 "ログイン"ページを表示している    もし "ユーザ名"に"hoge"と入力する    ...    もし "新規記事"ページを表示する    かつ "本文"に"こんにちは"と入力する    ...  シナリオ: 記事を削除する    # ログイン処理 ...

Page 46: Agile Web Development with Rails and Cucumber

フィーチャ: 記事を管理する  背景:    前提 "ログイン"ページを表示している    もし "ユーザ名"に"hoge"と入力する    ...

  シナリオ: 記事を投稿する    もし "新規記事"ページを表示する    かつ "本文"に"こんにちは"と入力する    ...

Background

Page 47: Agile Web Development with Rails and Cucumber

プロジェクトに特化した語彙

✓ある用語で表わされる一連のステップを、独立したステップとして括り出す

Page 48: Agile Web Development with Rails and Cucumber

Given /^ユーザ"([^\"]*)"としてログインしている$/ do |name|

  Given %("ログイン"ページを表示している)  When %("ユーザ名"に"#{name}"と入力する)  ...end

Calling Steps from Step Definitions

Page 49: Agile Web Development with Rails and Cucumber

フィーチャ: 記事を管理する  シナリオ: 記事を投稿する    前提 ユーザ"hoge"としてログインする    もし "新規記事"ページを表示する    かつ "本文"に"こんにちは"と入力する    ...

Page 50: Agile Web Development with Rails and Cucumber

まとめ

Page 51: Agile Web Development with Rails and Cucumber

Cucumberは開発者とお客様の双方に価値を提供します

Page 52: Agile Web Development with Rails and Cucumber

✓実装に依存しない資産価値の高いテスト

✓変化し続ける勇気

開発者として

Page 53: Agile Web Development with Rails and Cucumber

お客様として

✓システムの今の姿を正確に表わした、自分で読めるドキュメント

✓それに支えられたシステム

Page 54: Agile Web Development with Rails and Cucumber

Happy Developmentwith Cucumber!

Page 55: Agile Web Development with Rails and Cucumber

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