symfony2 behat/bdd (#symfony2study 4)
Post on 19-May-2015
6.476 Views
Preview:
DESCRIPTION
TRANSCRIPT
Symfony2 x BDD
今日から始めるBDD
(Symfony2編)
日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)
Symfony2 x BDD
内容(予定)● TDD、BDDとは● Behatの特徴● Behat環境の構築方法(Symfony2)● Behatの使い方● 応用
Symfony2 x BDD
Webアプリケーションの
テスト駆動開発入門の話
Symfony2 x BDD
質問
テスト書いてますか?
Symfony2 x BDD
ご安心ください
Symfony2 x BDD
テストを書いていない人
めんどくさいテストの書き方が分からない開発プロセスにまで適用できない
Symfony2 x BDD
テストを書いていない人
めんどくさいテストの書き方が分からない開発プロセスにまで適用できない
後藤の勝手なイメージ
Symfony2 x BDD
ご安心くださいこの講演を聞くと
テストファーストな開発を始められます!
(多分)
Symfony2 x BDD
ところで「テスト」とは
Symfony2 x BDD
テスト駆動開発のテスト
≠
ソフトウェア品質テストのテスト
Symfony2 x BDD
テスト駆動開発のテスト
≠
ソフトウェア品質テストのテスト
開発手法の視点品質保証の視点
Symfony2 x BDD
● TDDについて、もっと体系的に知りたい方は
Symfony2 x BDD
● 原書はこちら
Symfony2 x BDD
Behatを使うと
Symfony2 x BDD
Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける
Symfony2 x BDD
Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける
● 組み込みステップ→Webテスト系をスムーズに記述可能
Symfony2 x BDD
Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける
● 組み込みステップ→Webテスト系をスムーズに記述可能
● テストの内容が分かりやすい→テストのメンテナンス性
Symfony2 x BDD
Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける
● 組み込みステップ→Webテスト系をスムーズに記述可能
● テストの内容が分かりやすい→テストのメンテナンス性
ハードルが低い
Symfony2 x BDD
BDDについて
Symfony2 x BDD
BDDについて
Symfony2 x BDD
BDDについて● 振舞駆動開発
Symfony2 x BDD
BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる
Symfony2 x BDD
BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」
→違いは・・・・?
Symfony2 x BDD
PHPUnit vs Behat(Gherkin)PHPUnit
PHPUnitマニュアル 第13章 振舞駆動開発 ボウリングゲームの例
Symfony2 x BDD
PHPUnit vs Behat(Gherkin) Behat
Symfony2 x BDD
BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」
→違いは・・・・?
Symfony2 x BDD
BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」
→違いは・・・・?
読みやすいDSLによるテストの記述と実行
Symfony2 x BDD
BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」
→違いは・・・・?
読みやすいDSLによるテストの記述と実行
ユビキタス言語(DDD)との親和性
Symfony2 x BDD
Behatについて
Symfony2 x BDD
Behatとは● BDDフレームワーク for PHP
Symfony2 x BDD
Symfony2 x BDD
Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)
Symfony2 x BDD
Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)● Symfony2のコンポーネントを使って実装
Symfony2 x BDD
Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)● Symfony2のコンポーネントを使って実装● Symfony2と統合しやすい(BehatBundle)
Symfony2 x BDD
Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)● Symfony2のコンポーネントを使って実装● Symfony2と統合しやすい(BehatBundle)● Symfony2以外のフレームワークのテストにも利用可能 symfony 1.4(sfBrowser) 他(Goutte/Sahi ドライバ)
Symfony2 x BDD
BehatBundleを使うと
(そこそこ)手軽に
シナリオBDDを始められます!
Symfony2 x BDD
ここからSymfony2で
Behatの使い方
Symfony2 x BDD
インストール手順● Gistにまとめてあります
https://gist.github.com/997514
● めんどくさい方は、knpIpsumで持ってくる
http://bit.ly/sf2-knpipsum
Symfony2 x BDD
Behat環境の準備(1)● 最初にPHPUnit環境を準備
● インストールされていなければ
インストールされたディレクトリを確認しておくこと
Symfony2 x BDD
Behat環境の準備(2)● Symfony2プロジェクトに以下を組み込む
Behat https://github.com/Behat/BehatGherkin https://github.com/Behat/GherkinMink https://github.com/Behat/MinkBehatBundle https://github.com/Behat/BehatBundleMinkBundle https://github.com/Behat/MinkBundle
Symfony2 x BDD
Behat環境の準備(2)● Symfony2プロジェクトに以下を組み込む
Behat https://github.com/Behat/BehatGherkin https://github.com/Behat/GherkinMink https://github.com/Behat/MinkBehatBundle https://github.com/Behat/BehatBundleMinkBundle https://github.com/Behat/MinkBundle
慣れてない方には超ハードル
Symfony2 x BDD
Behat環境の準備(2)- 2● BETA2あたりからdepsファイルを使ったvendors指定に変わった
→組み込みたいライブラリのリポジトリを bin/depsファイルに書く
→$ php bin/vendors.php
Symfony2 x BDD
Behat環境の準備(3)● autoload.php 注:PHPUnitがインクルードパスにない 場合は追加しておく
● AppKernel.php バンドルを登録 PHPUnit用require
● config_dev.yml framework test: ~ behat_mink start_url: ~
Symfony2 x BDD
Behat環境の準備(4)● Symfony2コンソールの一覧にbehatが出る
Symfony2 x BDD
Behat環境の準備(5)● 動作確認:テスト用のバンドルを初期化
Acme\TestBundleはあらかじめ作成されていること
Symfony2 x BDD
Behatでテストを書く基礎知識
Symfony2 x BDD
用語● フィーチャ● シナリオ● ステップ● 前提(Given) もし(When) ならば(Then)● Gherkin● Mink● Sahi
Symfony2 x BDD
フィーチャ● アプリケーションの機能ごとの単位● 粒度は自由に決める(モジュール単位、画面単位、チケット単位)
● Behatでは、1つのフィーチャファイル(拡張子 feature)
● Feature(フィーチャ): に続けて記述
Symfony2 x BDD
シナリオ● 特定のフィーチャの振舞を表現するシナリオ● Scenario(シナリオ): に続けて記述● 1つのフィーチャには、複数のシナリオを記述できる
Symfony2 x BDD
ステップ● 1つのシナリオには、複数のステップを記述できる
● Given(前提)、When(もし)、Then(ならば)に続けて記述
● Webテスト向けの組み込みステップがある
Symfony2 x BDD
Gherkin(ガーキン)● Cucumber互換DSLの名前
Symfony2 x BDD
Mink● テストドライバー抽象化ライブラリ● ドライバー抽象化レイヤーを設けることで、(ほぼ)同じテストコードを使って、Symfony内部でのテストとWebブラウザを使ったテストの両方をサポート
● SymfonyDriver → 内部呼び出しでテストGoutteDriver → HTTP経由呼び出しSahiDriver → FireFoxでテスト
Symfony2 x BDD
Sahi● Seleniumみたいなヤツ● http://sahi.co.in/w/sahi
Symfony2 x BDD
フィーチャファイルの書き方
Symfony2 x BDD
フィーチャファイル
Symfony2 x BDD
フィーチャファイルフィーチャ
Symfony2 x BDD
フィーチャファイル
シナリオ
Symfony2 x BDD
フィーチャファイル
ステップ(前提)
Symfony2 x BDD
フィーチャファイル
ステップ(条件)
Symfony2 x BDD
フィーチャファイル
ステップ(期待する結果)
Symfony2 x BDD
フィーチャファイル
先頭にlanguageを指定すれば、日本語キーワードに対応
Symfony2 x BDD
フィーチャファイル
Symfony2 x BDD
フィーチャファイル● フィーチャファイルは、バンドルのFeaturesディレクトリ直下に作成する「test.feature」など
Symfony2 x BDD
テストを実行してみる
Symfony2 x BDD
Behatでのテスト実行● Behat:test:bundle バンドル名
Symfony2 x BDD
Behatでのテスト実行● Behat:test:bundle バンドル名
シナリオ実行
Symfony2 x BDD
Behatでのテスト実行● Behat:test:bundle バンドル名
実行結果
Symfony2 x BDD
Behatでのテスト実行● Behat:test:bundle バンドル名
この辺注目
Symfony2 x BDD
ステップの実行の仕組み
Symfony2 x BDD
ステップの種類● 組み込みステップ最初から使えるステップフィーチャファイルに記述するだけで使える
● カスタムステップ組み込みステップにない独自のルールフィーチャファイルに自由な文章で記述し、対応するコードをステップファイルに記述
Symfony2 x BDD
組み込みステップの一覧behat:test:bundle --steps バンドル
Symfony2 x BDD
組み込みステップの一覧behat:test:bundle --steps --lang=ja バンドル
Symfony2 x BDD
組み込みステップの一覧
ステップの一覧(=レシピ)を見ながら、ざっくりとしたシナリオを記述していける(Webアプリケーションの場合)
重要
Symfony2 x BDD
組み込みステップの一覧
ステップの一覧(=レシピ)を見ながら、ざっくりとしたシナリオを記述していける(Webアプリケーションの場合)
重要
テストコードを書く心理ハードルが低い
Symfony2 x BDD
組み込みステップの場所● Mink内src/Behat/Mink/Integration/step/ mink_steps.php
中をのぞいてみましょう
Symfony2 x BDD
組み込みステップのコード
Symfony2 x BDD
組み込みステップのコード
ステップ(正規表現)
Symfony2 x BDD
組み込みステップのコード
ステップのPHPテストコード
Symfony2 x BDD
組み込みステップのコード● カスタムステップを実装する際にレシピがわりになります
Symfony2 x BDD
カスタムステップ● カスタムステップは、Features/steps/steps.phpに記述する。
● フィーチャファイルにカスタムステップを記述してbehatコマンドを実行すると、未実装のカスタムステップの雛形が表示される。(先ほど見た画面)
Symfony2 x BDD
カスタムステップ
Symfony2 x BDD
カスタムステップ
steps.phpへコピペ
Symfony2 x BDD
カスタムステップ● ステップがpendingになる
● あとはステップのコードを書くだけ
Symfony2 x BDD
カスタムステップ● ステップメソッド内は結構何でもできる
Symfony2 x BDD
テストの書き方は分かった。
早くテストファーストについて教えてくれ
Symfony2 x BDD
後は
開発のサイクルに乗せるだけ
+
慣 れ ろ !
Symfony2 x BDD
テストファーストに持っていく● まずはテストを書くことに慣れる● たとえばechoデバッグを、テストコードで行う
Symfony2 x BDD
http://www.phpunit.de/manual/3.6/ja/writing-tests-for-phpunit.html
Symfony2 x BDD
テストファーストに持っていく● まずはテストを書くことに慣れる● たとえばechoデバッグを、テストコードで行う
Symfony2 x BDD
テストファーストに持っていく● コード→テスト→コード→テスト・・・
Symfony2 x BDD
テストファーストに持っていく
● コード→テスト→コード→テスト・・・
このループに慣れれば、自然とテストを書きたくなります
Symfony2 x BDD
おまけ
Symfony2 x BDD
Behat応用(1)● DDD(MDD)ユビキタス言語(DDD参照)を使い、ドメインモデルのフィーチャ、シナリオ、ステップを記述
→ドメインエキスパートにもメンテナンスできる(可能性)→前提・もし・ならば、の制限を外すようにDSLを拡張する(「・」など)
Symfony2 x BDD
Behat応用(2)● ITS(Redmine)、Gitのブランチ、コミット等
も含めたワークフロー→Behat関係あるの?→ブランチの実装内容に対するテストコード、フィーチャ、シナリオが一体となってGitリポジトリで管理可能→特にバグ修正の際に、ITSのチケットにいろいろ書くのではなく、バグ修正用フィーチャに説明などを書くようにする
Symfony2 x BDD
是非Behatを使ってみてください!
top related