Behat+Symfony2ではじめるBDD超入門
Upcoming SlideShare
Loading in...5
×
 

Behat+Symfony2ではじめるBDD超入門

on

  • 4,165 views

2012-08-25 社内勉強会 テーマ別勉強会資料

2012-08-25 社内勉強会 テーマ別勉強会資料

Statistics

Views

Total Views
4,165
Views on SlideShare
4,152
Embed Views
13

Actions

Likes
8
Downloads
6
Comments
0

3 Embeds 13

https://twitter.com 9
http://s.deeeki.com 2
http://twitter.com 2

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Behat+Symfony2ではじめるBDD超入門 Behat+Symfony2ではじめるBDD超入門 Presentation Transcript

  • Behat+Symfony2ではじめる BDD超入門 2012-08-25 遠山 晃
  • 自己紹介遠山 晃所属: 株式会社システナ 主にWeb系の開発中心、iOSも少々 最近はCI導入とかも色々やってますhttps://github.com/vexus2
  • アジェンダTDD・BDDとは?BehatについてSymfony2についてBehatで振舞駆動
  • 皆さん、テストコード 書いてますか?
  • テスト書いてますか? いつも書いてる やり方がわからない 面倒なイメージ 7% 40% 53% ※数字はイメージです
  • そもそも・・・テストコードってなに?
  • http://www.phpunit.de/manual/3.6/ja/writing-tests-for-phpunit.html
  • array_push()メソッドのテストhttp://www.phpunit.de/manual/3.6/ja/writing-tests-for-phpunit.html
  • 配列に対して‘foo’をarray_pushした場合に、配列の末尾に‘foo’が入っていることの確認 http://www.phpunit.de/manual/3.6/ja/writing-tests-for-phpunit.html
  • 代表的なテスティングFWxUnit JUnit PHPUnit etcxSpec RSpec JSSpec
  • BDDの説明に入る前に
  • TDDってなに?T Driven Development(テスト駆動開 est発)テストコードを先に書いて、Red→Green→リファクタリングを繰り返す開発手法テストファーストと良く混同される
  • BDDってなに?Beer Drinking DevelopmentBehavior Driven Development(振舞駆動開発)TDDの類似開発技法。先に書くテストコードでアプリケーションの『振舞』を記載する。
  • TDDとBDD何が違うの?
  • TDDとの違いコード品質を高めるという目的は同じテスト観点が『アプリケーション寄り』だけでなく『ユーザ寄り』を含むかどうかが大きな違い二面性
  • 本題に入る前に、ざっくりSymfony2
  • Symfony2の特徴PHP5.3以降に対応フルスタックフレームワークBundleDIコンテナ
  • ディレクトリ構成|-app/ |-AppKernel.php ←アプリケーションの設定系 |-config/ |-logs/|- bin/|- src/ |-Regist/ ←主に開発で使う |-RegistBundle |-web/ |-app_dev.php |-app.php|-bundles/
  • Symfony2の起動イメージ|-app/ |-AppKernel.php|- src/ ② app.phpがカーネルを呼び出す |-Regist/ |-RegistBundle/ |-web/ ③アプリケーションのバンドルを読み込む |-app.php ① リクエスト
  • Bundleって?Symfony2のアプリケーションの単位要は「プラグイン」基本的には「対話式ジェネレータ」を使って作成
  • Bundleの構成|-src/Mini |-BlogBundle |-Controller |-DefaultController |-DependencyInjection |-Configuration.php |-MiniBlogExtension.php |-Resources |-config |-routing.yml |-services.yml |-public |-doc |-views |-index.html.twig |-Test
  • Behatもざっくりと
  • Behatって?PHP用のBDDフレームワークGherkin内部的にはSymfony2で作られてる Symfony2と親和性が高い Symfony系以外のFWでも利用可能
  • Behatを使うとテスト自体が日本語で書ける! テスト内容がわかりやすいドキュメントとして出力させたものをそのまま設計書にも出来る テストコード自身が「動く設計書」
  • Behat+Symfony2 環境構築
  • Behat環境構築PHPUnitの準備 Pleiadesを入れていれば3.X系がイン ストール済み インストールされていなければ… $ pear channel-discover pear.phpunit.de $ pear channel-discover components.ez.no $ pear channel-discover pear.symfony-project.com $ pear install phpunit/PHPUnit
  • Behat環境構築プロジェクトを準備 今回はKnpIpsumのパッケージを使用 http://knplabs.jp/blog/knpipsum 以下のコマンドでインストール実行
  • Windowsでやる場合
  • コマンドプロンプト上ではUTF-8文字列が表示出 来ないので
  • Windowsで環境構築Behatコマンドを実行するとこうなる
  • Windowsで環境構築Behatコマンドを実行するとこうなる chcp 65001なんて悪あがきは、 試すだけ時間の無駄なのでやめよう!
  • どうすればいい?
  • 今すぐ買いに行く
  • それでもWindowsでやる なら!
  • Windowsで環境構築CygwinとTeraTermを入れて、TeraTerm上からCygwinを起動させる!
  • Windowsで環境構築CygwinとTeraTermを入れて、TeraTerm上からCygwinを起動させる! これで十分実用レベル!!
  • 流れ
  • フィーチャを書く→Red→Green→リファクタリング→フィーチャ を書く....
  • ひたすら繰り返すのみ!!習うより慣れろな感覚
  • まずはフィーチャファイ ルを書いてみよう
  • フィーチャファイルRegist.feature # language:ja フィーチャ: トップページ表示 トップページを表示した際のメッセージを表示する。 シナリオ: Welcomeメッセージの表示 前提 "/" を表示している ならば "ここから初める(予定)" と表示されていること
  • フィーチャファイルRegist.feature 言語を指定 # language:ja フィーチャ: トップページ表示 トップページを表示した際のメッセージを表示する。 シナリオ: Welcomeメッセージの表示 前提 "/" を表示している ならば "ここから初める(予定)" と表示されていること
  • フィーチャファイルRegist.feature フィーチャ # language:ja フィーチャ: トップページ表示 トップページを表示した際のメッセージを表示する。 シナリオ: Welcomeメッセージの表示 前提 "/" を表示している ならば "ここから初める(予定)" と表示されていること
  • フィーチャファイルRegist.feature # language:ja フィーチャ: トップページ表示 トップページを表示した際のメッセージを表示する。 [シナリオ] シナリオ: Welcomeメッセージの表示 特定の振舞について記載 前提 "/" を表示している ならば "ここから初める(予定)" と表示されていること
  • フィーチャファイルRegist.feature # language:ja フィーチャ: トップページ表示 トップページを表示した際のメッセージを表示する。 シナリオ: Welcomeメッセージの表示 [ステップ] 前提 "/" を表示している 前提条件 ならば "ここから初める(予定)" と表示されていること
  • フィーチャファイルRegist.feature # language:ja フィーチャ: トップページ表示 トップページを表示した際のメッセージを表示する。 シナリオ: Welcomeメッセージの表示 [ステップ] 前提 "/" を表示している 期待動作を記載 ならば "ここから初める(予定)" と表示されていること
  • フィーチャファイルRegist.feature 半角スペースを空ける # language:ja フィーチャ:○トップページ表示 トップページを表示した際のメッセージを表示する。 シナリオ:○ Welcomeメッセージの表示 前提○"/"○を表示している ならば○"ここから初める(予定)"○と表示されていること
  • 実行してみる。
  • フィーチャ実行 シナリオ実行
  • フィーチャ実行 実行結果
  • いきなりGreen
  • なんで?
  • フィーチャファイル シナリオ: つぶやきを投稿する もし "/" を表示している ならば "ここから初める(予定)" と表示されていること本来なら指定されたURLにアクセスするためのテストコードを書かないと動かないけど、『特定の記法』に沿って書いた場合に、決められた動きをしてくれる!!
  • =組み込みフィーチャ
  • 組み込みフィーチャ予め定義されている文言どおりにフィーチャを書くだけで、特定の動作のテストをしてくれる!
  • 組み込みフィーチャ『もし “/” を表示している』ような場合、自動的に指定された(base_url)URLにアクセスする
  • 組み込みフィーチャ例前提 /^(?:|ユーザーは )"(?P<page>[^s]+)" を表示している$/もし /^(?:|ユーザーが )"(?P<page>[^s]+)" へ移動する$/もし /^(?:|ユーザーが )ページをリロードする$/もし /^(?:|ユーザーが )"(?P<button>(?:[^"]|")*)" ボタンをクリックする$/もし /^(?:|ユーザーが )"(?P<link>(?:[^"]|")*)" のリンク先へ移動する$/もし /^(?:|ユーザーが)次のように入力する:$/ならば /^(?:|ユーザーが )(?P<page>[^s]+) を表示していること$/ならば /^(?:|画面に )"(?P<text>(?:[^"]|")*)" と表示されていること$/ならば /^(?:|画面に )"(?P<text>(?:[^"]|")*)" と表示されていないこと$/ならば /^レスポンスに "(?P<text>(?:[^"]|")*)" が含まれていないこと$/ならば /^"(?P<element>[^"]*)" エレメントに "(?P<text>(?:[^"]|")*)" と表示されていること$/ならば /^最後のレスポンスを表示$/ならば /^最後のレスポンスをブラウザで表示$/
  • 組み込みフィーチャ例前提 /^(?:|ユーザーは )"(?P<page>[^s]+)" を表示している$/もし /^(?:|ユーザーが )"(?P<page>[^s]+)" へ移動する$/もし /^(?:|ユーザーが )ページをリロードする$/もし /^(?:|ユーザーが )"(?P<button>(?:[^"]|")*)" ボタンをクリックする$/もし /^(?:|ユーザーが )"(?P<link>(?:[^"]|")*)" のリンク先へ移動する$/もし /^(?:|ユーザーが)次のように入力する:$/ならば /^(?:|ユーザーが )(?P<page>[^s]+) を表示していること$/ならば /^(?:|画面に )"(?P<text>(?:[^"]|")*)" と表示されていること$/ならば /^(?:|画面に )"(?P<text>(?:[^"]|")*)" と表示されていないこと$/ならば /^レスポンスに "(?P<text>(?:[^"]|")*)" が含まれていないこと$/ならば /^"(?P<element>[^"]*)" エレメントに "(?P<text>(?:[^"]|")*)" と表示されていること$/ならば /^最後のレスポンスを表示$/ならば /^最後のレスポンスをブラウザで表示$/ $ behat -dl で確認可能
  • 組み込みフィーチャでカバー出来ない範囲は、自分でステップを定義
  • フィーチャ実行 失敗(赤)
  • フィーチャ実行 スキップ(青)
  • フィーチャ実行 ステップ未定義(黄色)
  • フィーチャ実行
  • 未定義ステップがある場合は、実装すべきメソッ ドを教えてくれる
  • フィーチャ実行 そのままコピペして使える!
  • 実際に手を動かしてみよう
  • みなさまの開発ライフの一助になれば幸いです。
  • ご清聴ありがとうございました。