Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Symfony2 Behat/BDD (#Symfony2study 4)

9,321 views

Published on

第4回Symfony2勉強会 Behatでテストファースト開発のスライド

Published in: Technology
  • Be the first to comment

Symfony2 Behat/BDD (#Symfony2study 4)

  1. 1. 今日から始める BDD (Symfony2編) 日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)Symfony2 x BDD
  2. 2. 内容(予定) ● TDD、BDDとは ● Behatの特徴 ● Behat環境の構築方法(Symfony2) ● Behatの使い方 ● 応用Symfony2 x BDD
  3. 3.   Webアプリケーションの テスト駆動開発 入門の話Symfony2 x BDD
  4. 4. 質問 テスト書いてますか?Symfony2 x BDD
  5. 5.   ご安心くださいSymfony2 x BDD
  6. 6. テストを書いていない人 めんどくさい テストの書き方が分か らない 開発プロセスにまで適 用できないSymfony2 x BDD
  7. 7. テストを書いていない人 後藤の勝手なイメージ めんどくさい テストの書き方が分か らない 開発プロセスにまで適 用できないSymfony2 x BDD
  8. 8.   ご安心ください この講演を聞くと テストファーストな開発を 始められます! (多分)Symfony2 x BDD
  9. 9.   ところで 「テスト」とはSymfony2 x BDD
  10. 10.   テスト駆動開発のテスト ≠ ソフトウェア品質テストのテストSymfony2 x BDD
  11. 11.   テスト駆動開発のテスト 開発手法の視点 ≠ 品質保証の視点 ソフトウェア品質テストのテストSymfony2 x BDD
  12. 12.   ● TDDについて、もっと体系的に知りたい方はSymfony2 x BDD
  13. 13. ● 原書はこちらSymfony2 x BDD
  14. 14. Behatを使うとSymfony2 x BDD
  15. 15. Behatを使うと ● 自然言語に近い構文 →英語が分からなくても書けるSymfony2 x BDD
  16. 16. Behatを使うと ● 自然言語に近い構文 →英語が分からなくても書ける ● 組み込みステップ →Webテスト系をスムーズに記述可能Symfony2 x BDD
  17. 17. Behatを使うと ● 自然言語に近い構文 →英語が分からなくても書ける ● 組み込みステップ →Webテスト系をスムーズに記述可能 ● テストの内容が分かりやすい →テストのメンテナンス性Symfony2 x BDD
  18. 18. Behatを使うと ● 自然言語に近い構文 →英語が分からなくても書ける ● 組み込みステップ →Webテスト系をスムーズに記述可能 ● テストの内容が分かりやすい →テストのメンテナンス性 ハードルが 低いSymfony2 x BDD
  19. 19.   BDDについてSymfony2 x BDD
  20. 20. BDDについてSymfony2 x BDD
  21. 21. BDDについて ● 振舞駆動開発Symfony2 x BDD
  22. 22. BDDについて ● 振舞駆動開発 ● PHPUnit等でもBDDはできるSymfony2 x BDD
  23. 23. BDDについて ● 振舞駆動開発 ● PHPUnit等でもBDDはできる ● BehatのBDDは「シナリオBDD」  →違いは・・・・?Symfony2 x BDD
  24. 24. PHPUnit vs Behat(Gherkin) PHPUnit PHPUnitマニュアル 第13章 振舞駆動開発 ボウリングゲームの例Symfony2 x BDD
  25. 25. PHPUnit vs Behat(Gherkin) BehatSymfony2 x BDD
  26. 26. BDDについて ● 振舞駆動開発 ● PHPUnit等でもBDDはできる ● BehatのBDDは「シナリオBDD」  →違いは・・・・?Symfony2 x BDD
  27. 27. BDDについて ● 振舞駆動開発 ● PHPUnit等でもBDDはできる ● BehatのBDDは「シナリオBDD」  →違いは・・・・? 読みやすいDSLによるテストの記述と実行Symfony2 x BDD
  28. 28. BDDについて ● 振舞駆動開発 ● PHPUnit等でもBDDはできる ● BehatのBDDは「シナリオBDD」  →違いは・・・・? 読みやすいDSLによるテストの記述と実行 ユビキタス言語(DDD)との親和性Symfony2 x BDD
  29. 29.   BehatについてSymfony2 x BDD
  30. 30. Behatとは ● BDDフレームワーク for PHPSymfony2 x BDD
  31. 31. Symfony2 x BDD
  32. 32. Behatとは ● BDDフレームワーク for PHP ● Cucumber(Ruby)互換DSL (Gherkin)Symfony2 x BDD
  33. 33. Behatとは ● BDDフレームワーク for PHP ● Cucumber(Ruby)互換DSL (Gherkin) ● Symfony2のコンポーネントを使って実装Symfony2 x BDD
  34. 34. Behatとは ● BDDフレームワーク for PHP ● Cucumber(Ruby)互換DSL (Gherkin) ● Symfony2のコンポーネントを使って実装 ● Symfony2と統合しやすい(BehatBundle)Symfony2 x BDD
  35. 35. Behatとは ● BDDフレームワーク for PHP ● Cucumber(Ruby)互換DSL (Gherkin) ● Symfony2のコンポーネントを使って実装 ● Symfony2と統合しやすい(BehatBundle) ● Symfony2以外のフレームワークのテストにも利用可能  symfony 1.4(sfBrowser)  他(Goutte/Sahi ドライバ)Symfony2 x BDD
  36. 36. BehatBundleを使うと (そこそこ)手軽に シナリオBDDを 始められます!Symfony2 x BDD
  37. 37.   ここから Symfony2で Behatの使い方Symfony2 x BDD
  38. 38. インストール手順 ● Gistにまとめてあります https://gist.github.com/997514 ● めんどくさい方は、knpIpsumで持ってくる http://bit.ly/sf2-knpipsumSymfony2 x BDD
  39. 39. Behat環境の準備(1) ● 最初にPHPUnit環境を準備 ● インストールされていなければ インストールされたディレクトリを確認しておくことSymfony2 x BDD
  40. 40. Behat環境の準備(2) ● Symfony2プロジェクトに以下を組み込む Behat https://github.com/Behat/Behat Gherkin https://github.com/Behat/Gherkin Mink https://github.com/Behat/Mink BehatBundle https://github.com/Behat/BehatBundle MinkBundle https://github.com/Behat/MinkBundleSymfony2 x BDD
  41. 41. Behat環境の準備(2) ● Symfony2プロジェクトに以下を組み込む Behat https://github.com/Behat/Behat Gherkin https://github.com/Behat/Gherkin Mink https://github.com/Behat/Mink BehatBundle https://github.com/Behat/BehatBundle MinkBundle https://github.com/Behat/MinkBundle 慣れてない方には超ハードルSymfony2 x BDD
  42. 42. Behat環境の準備(2)- 2 ● BETA2あたりからdepsファイルを使ったvendors 指定に変わった →組み込みたいライブラリのリポジトリを bin/depsファイルに書く →$ php bin/vendors.phpSymfony2 x BDD
  43. 43. Behat環境の準備(3) ● autoload.php  注:PHPUnitがインクルードパスにない    場合は追加しておく ● AppKernel.php  バンドルを登録  PHPUnit用require ● config_dev.yml  framework   test: ~  behat_mink   start_url: ~Symfony2 x BDD
  44. 44. Behat環境の準備(4) ● Symfony2コンソールの一覧にbehatが出るSymfony2 x BDD
  45. 45. Behat環境の準備(5) ● 動作確認:テスト用のバンドルを初期化 AcmeTestBundleは あらかじめ作成 されていることSymfony2 x BDD
  46. 46.   Behatで テストを書く 基礎知識Symfony2 x BDD
  47. 47. 用語 ● フィーチャ ● シナリオ ● ステップ ● 前提(Given) もし(When) ならば(Then) ● Gherkin ● Mink ● SahiSymfony2 x BDD
  48. 48. フィーチャ ● アプリケーションの機能ごとの単位 ● 粒度は自由に決める (モジュール単位、画面単位、チケット単位) ● Behatでは、1つのフィーチャファイル (拡張子 feature) ● Feature(フィーチャ): に続けて記述Symfony2 x BDD
  49. 49. シナリオ ● 特定のフィーチャの振舞を表現するシナリオ ● Scenario(シナリオ): に続けて記述 ● 1つのフィーチャには、複数のシナリオを記述 できるSymfony2 x BDD
  50. 50. ステップ ● 1つのシナリオには、複数のステップを記述で きる ● Given(前提)、When(もし)、Then(なら ば)に続けて記述 ● Webテスト向けの組み込みステップがあるSymfony2 x BDD
  51. 51. Gherkin(ガーキン) ● Cucumber互換DSLの名前Symfony2 x BDD
  52. 52. Mink ● テストドライバー抽象化ライブラリ ● ドライバー抽象化レイヤーを設けることで、 (ほぼ)同じテストコードを使って、Symfony 内部でのテストとWebブラウザを使ったテスト の両方をサポート ● SymfonyDriver → 内部呼び出しでテスト GoutteDriver  → HTTP経由呼び出し SahiDriver   → FireFoxでテストSymfony2 x BDD
  53. 53. Sahi ● Seleniumみたいなヤツ ● http://sahi.co.in/w/sahiSymfony2 x BDD
  54. 54.   フィーチャファイルの 書き方Symfony2 x BDD
  55. 55. フィーチャファイルSymfony2 x BDD
  56. 56. フィーチャファイル フィーチャSymfony2 x BDD
  57. 57. フィーチャファイル シナリオSymfony2 x BDD
  58. 58. フィーチャファイル ステップ(前提)Symfony2 x BDD
  59. 59. フィーチャファイル ステップ(条件)Symfony2 x BDD
  60. 60. フィーチャファイル ステップ(期待する結果)Symfony2 x BDD
  61. 61. フィーチャファイル 先頭にlanguageを指定すれば、日本語キーワードに対応Symfony2 x BDD
  62. 62. フィーチャファイルSymfony2 x BDD
  63. 63. フィーチャファイル ● フィーチャファイルは、バンドルのFeatures ディレクトリ直下に作成する 「test.feature」などSymfony2 x BDD
  64. 64.   テストを実行してみるSymfony2 x BDD
  65. 65. Behatでのテスト実行 ● Behat:test:bundle バンドル名Symfony2 x BDD
  66. 66. Behatでのテスト実行 ● Behat:test:bundle バンドル名 シナリオ実行Symfony2 x BDD
  67. 67. Behatでのテスト実行 ● Behat:test:bundle バンドル名 実行結果Symfony2 x BDD
  68. 68. Behatでのテスト実行 ● Behat:test:bundle バンドル名 この辺注目Symfony2 x BDD
  69. 69.   ステップの実行の仕組みSymfony2 x BDD
  70. 70. ステップの種類 ● 組み込みステップ 最初から使えるステップ フィーチャファイルに記述するだけで使える ● カスタムステップ 組み込みステップにない独自のルール フィーチャファイルに自由な文章で記述し、対応する コードをステップファイルに記述Symfony2 x BDD
  71. 71. 組み込みステップの一覧 behat:test:bundle --steps バンドルSymfony2 x BDD
  72. 72. 組み込みステップの一覧 behat:test:bundle --steps --lang=ja バンドルSymfony2 x BDD
  73. 73. 組み込みステップの一覧 重要 ステップの一覧(=レシピ)を見なが ら、ざっくりとしたシナリオを記述し ていける (Webアプリケーションの場合)Symfony2 x BDD
  74. 74. 組み込みステップの一覧 重要 ステップの一覧(=レシピ)を見なが ら、ざっくりとしたシナリオを記述し ていける (Webアプリケーションの場合) テストコードを書く心理ハードルが低いSymfony2 x BDD
  75. 75. 組み込みステップの場所 ● Mink内 src/Behat/Mink/Integration/step/ mink_steps.php 中をのぞいてみましょうSymfony2 x BDD
  76. 76. 組み込みステップのコードSymfony2 x BDD
  77. 77. 組み込みステップのコード ステップ(正規表現)Symfony2 x BDD
  78. 78. 組み込みステップのコード ステップのPHPテストコードSymfony2 x BDD
  79. 79. 組み込みステップのコード ● カスタムステップを実装する際にレシピがわり になりますSymfony2 x BDD
  80. 80. カスタムステップ ● カスタムステップは、 Features/steps/steps.php に記述する。 ● フィーチャファイルにカスタムステップを記述 してbehatコマンドを実行すると、未実装のカ スタムステップの雛形が表示される。 (先ほど見た画面)Symfony2 x BDD
  81. 81. カスタムステップSymfony2 x BDD
  82. 82. カスタムステップ steps.phpへコピペSymfony2 x BDD
  83. 83. カスタムステップ ● ステップがpendingになる ● あとはステップのコードを書くだけSymfony2 x BDD
  84. 84. カスタムステップ ● ステップメソッド内は結構何でもできるSymfony2 x BDD
  85. 85. テストの書き方は 分かった。 早くテストファースト について教えてくれSymfony2 x BDD
  86. 86. 後は 開発のサイクルに乗せるだけ + 慣 れ ろ !Symfony2 x BDD
  87. 87. テストファーストに持っていく ● まずはテストを書くことに慣れる ● たとえばechoデバッグを、テストコードで行うSymfony2 x BDD
  88. 88.   http://www.phpunit.de/manual/3.6/ja/writing-tests-for-phpunit.htmlSymfony2 x BDD
  89. 89. テストファーストに持っていく ● まずはテストを書くことに慣れる ● たとえばechoデバッグを、テストコードで行うSymfony2 x BDD
  90. 90. テストファーストに持っていく ● コード→テスト→コード→テスト・・・Symfony2 x BDD
  91. 91. テストファーストに持っていく ● コード→テスト→コード→テスト・・・ このループに慣れれば、 自然とテストを書きたくなりますSymfony2 x BDD
  92. 92.   おまけSymfony2 x BDD
  93. 93. Behat応用(1) ● DDD(MDD) ユビキタス言語(DDD参照)を使い、ドメイン モデルのフィーチャ、シナリオ、ステップを記 述 →ドメインエキスパートにもメンテナンスでき る(可能性) →前提・もし・ならば、の制限を外すように DSLを拡張する(「・」など)Symfony2 x BDD
  94. 94. Behat応用(2) ● ITS(Redmine)、Gitのブランチ、コミット等 も含めたワークフロー →Behat関係あるの? →ブランチの実装内容に対するテストコード、 フィーチャ、シナリオが一体となってGitリポジ トリで管理可能 →特にバグ修正の際に、ITSのチケットにいろ いろ書くのではなく、バグ修正用フィーチャに 説明などを書くようにするSymfony2 x BDD
  95. 95.   是非Behatを 使ってみてください!Symfony2 x BDD

×