0
Behat+Symfony2ではじめる     BDD超入門       2012-08-25        遠山 晃
自己紹介遠山 晃所属: 株式会社システナ  主にWeb系の開発中心、iOSも少々  最近はCI導入とかも色々やってますhttps://github.com/vexus2
アジェンダTDD・BDDとは?BehatについてSymfony2についてBehatで振舞駆動
皆さん、テストコード 書いてますか?
テスト書いてますか?                     いつも書いてる                     やり方がわからない                     面倒なイメージ        7%  40%           ...
そもそも・・・テストコードってなに?
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/           ←...
Symfony2の起動イメージ|-app/  |-AppKernel.php|- src/                ② app.phpがカーネルを呼び出す  |-Regist/     |-RegistBundle/  |-web/   ...
Bundleって?Symfony2のアプリケーションの単位要は「プラグイン」基本的には「対話式ジェネレータ」を使って作成
Bundleの構成|-src/Mini   |-BlogBundle      |-Controller             |-DefaultController      |-DependencyInjection           ...
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-d...
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 フィーチャ: トップページ表示  トップページを表示した際のメッセージを表示する。                           [シナリオ]  シナリオ: We...
フィーチャファイル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<page>[^s]+)" を表示している$/もし /^(?:|ユーザーが )"(?P<page>[^s]+)" へ移動する$/もし /^(?:|ユーザーが )ページをリロードする$/...
組み込みフィーチャでカバー出来ない範囲は、自分でステップを定義
フィーチャ実行          失敗(赤)
フィーチャ実行          スキップ(青)
フィーチャ実行          ステップ未定義(黄色)
フィーチャ実行
未定義ステップがある場合は、実装すべきメソッ ドを教えてくれる
フィーチャ実行      そのままコピペして使える!
実際に手を動かしてみよう
みなさまの開発ライフの一助になれば幸いです。
ご清聴ありがとうございました。
Upcoming SlideShare
Loading in...5
×

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

4,066

Published on

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

0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,066
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
7
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide
  • \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
  • Transcript of "Behat+Symfony2ではじめるBDD超入門"

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

      Clipping is a handy way to collect important slides you want to go back to later.

    ×