Symfony2 Behat/BDD (#Symfony2study 4)

8,137 views

Published on

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

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,137
On SlideShare
0
From Embeds
0
Number of Embeds
3,713
Actions
Shares
0
Downloads
24
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

×