95
Symfony2 x BDD 今日から始める BDD Symfony2編) 日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)

Symfony2 Behat/BDD (#Symfony2study 4)

Embed Size (px)

DESCRIPTION

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

Citation preview

Page 1: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

今日から始めるBDD

(Symfony2編)

日本Symfonyユーザー会 後藤 秀宣(@hidenorigoto)

Page 2: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

内容(予定)● TDD、BDDとは● Behatの特徴● Behat環境の構築方法(Symfony2)● Behatの使い方● 応用

Page 3: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

Webアプリケーションの

テスト駆動開発入門の話

Page 4: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

質問

テスト書いてますか?

Page 5: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

ご安心ください

Page 6: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストを書いていない人

めんどくさいテストの書き方が分からない開発プロセスにまで適用できない

Page 7: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストを書いていない人

めんどくさいテストの書き方が分からない開発プロセスにまで適用できない

後藤の勝手なイメージ

Page 8: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

ご安心くださいこの講演を聞くと

テストファーストな開発を始められます!

(多分)

Page 9: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

ところで「テスト」とは

Page 10: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

テスト駆動開発のテスト

ソフトウェア品質テストのテスト

Page 11: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

テスト駆動開発のテスト

ソフトウェア品質テストのテスト

開発手法の視点品質保証の視点

Page 12: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 ● TDDについて、もっと体系的に知りたい方は

Page 13: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

● 原書はこちら

Page 14: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatを使うと

Page 15: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける

Page 16: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける

● 組み込みステップ→Webテスト系をスムーズに記述可能

Page 17: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける

● 組み込みステップ→Webテスト系をスムーズに記述可能

● テストの内容が分かりやすい→テストのメンテナンス性

Page 18: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatを使うと● 自然言語に近い構文→英語が分からなくても書ける

● 組み込みステップ→Webテスト系をスムーズに記述可能

● テストの内容が分かりやすい→テストのメンテナンス性

ハードルが低い

Page 19: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

BDDについて

Page 20: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて

Page 21: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて● 振舞駆動開発

Page 22: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる

Page 23: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」

 →違いは・・・・?

Page 24: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

PHPUnit vs Behat(Gherkin)PHPUnit

PHPUnitマニュアル 第13章 振舞駆動開発 ボウリングゲームの例

Page 25: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

PHPUnit vs Behat(Gherkin) Behat

Page 26: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」

 →違いは・・・・?

Page 27: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」

 →違いは・・・・?

読みやすいDSLによるテストの記述と実行

Page 28: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BDDについて● 振舞駆動開発● PHPUnit等でもBDDはできる● BehatのBDDは「シナリオBDD」

 →違いは・・・・?

読みやすいDSLによるテストの記述と実行

ユビキタス言語(DDD)との親和性

Page 29: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

Behatについて

Page 30: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatとは● BDDフレームワーク for PHP

Page 31: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Page 32: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)

Page 33: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)● Symfony2のコンポーネントを使って実装

Page 34: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)● Symfony2のコンポーネントを使って実装● Symfony2と統合しやすい(BehatBundle)

Page 35: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatとは● BDDフレームワーク for PHP● Cucumber(Ruby)互換DSL (Gherkin)● Symfony2のコンポーネントを使って実装● Symfony2と統合しやすい(BehatBundle)● Symfony2以外のフレームワークのテストにも利用可能 symfony 1.4(sfBrowser) 他(Goutte/Sahi ドライバ)

Page 36: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

BehatBundleを使うと

(そこそこ)手軽に

シナリオBDDを始められます!

Page 37: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

ここからSymfony2で

Behatの使い方

Page 38: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

インストール手順● Gistにまとめてあります

https://gist.github.com/997514

● めんどくさい方は、knpIpsumで持ってくる

http://bit.ly/sf2-knpipsum

Page 39: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat環境の準備(1)● 最初にPHPUnit環境を準備

● インストールされていなければ

インストールされたディレクトリを確認しておくこと

Page 40: Symfony2 Behat/BDD (#Symfony2study 4)

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

Page 41: Symfony2 Behat/BDD (#Symfony2study 4)

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

慣れてない方には超ハードル

Page 42: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat環境の準備(2)- 2● BETA2あたりからdepsファイルを使ったvendors指定に変わった

→組み込みたいライブラリのリポジトリを bin/depsファイルに書く

→$ php bin/vendors.php

Page 43: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat環境の準備(3)● autoload.php 注:PHPUnitがインクルードパスにない   場合は追加しておく

● AppKernel.php バンドルを登録 PHPUnit用require

● config_dev.yml framework  test: ~ behat_mink  start_url: ~

Page 44: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat環境の準備(4)● Symfony2コンソールの一覧にbehatが出る

Page 45: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat環境の準備(5)● 動作確認:テスト用のバンドルを初期化

Acme\TestBundleはあらかじめ作成されていること

Page 46: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

Behatでテストを書く基礎知識

Page 47: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

用語● フィーチャ● シナリオ● ステップ● 前提(Given) もし(When) ならば(Then)● Gherkin● Mink● Sahi

Page 48: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャ● アプリケーションの機能ごとの単位● 粒度は自由に決める(モジュール単位、画面単位、チケット単位)

● Behatでは、1つのフィーチャファイル(拡張子 feature)

● Feature(フィーチャ): に続けて記述

Page 49: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

シナリオ● 特定のフィーチャの振舞を表現するシナリオ● Scenario(シナリオ): に続けて記述● 1つのフィーチャには、複数のシナリオを記述できる

Page 50: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

ステップ● 1つのシナリオには、複数のステップを記述できる

● Given(前提)、When(もし)、Then(ならば)に続けて記述

● Webテスト向けの組み込みステップがある

Page 51: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Gherkin(ガーキン)● Cucumber互換DSLの名前

Page 52: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Mink● テストドライバー抽象化ライブラリ● ドライバー抽象化レイヤーを設けることで、(ほぼ)同じテストコードを使って、Symfony内部でのテストとWebブラウザを使ったテストの両方をサポート

● SymfonyDriver → 内部呼び出しでテストGoutteDriver  → HTTP経由呼び出しSahiDriver   → FireFoxでテスト

Page 53: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Sahi● Seleniumみたいなヤツ● http://sahi.co.in/w/sahi

Page 54: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

フィーチャファイルの書き方

Page 55: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

Page 56: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイルフィーチャ

Page 57: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

シナリオ

Page 58: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

ステップ(前提)

Page 59: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

ステップ(条件)

Page 60: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

ステップ(期待する結果)

Page 61: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

先頭にlanguageを指定すれば、日本語キーワードに対応

Page 62: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル

Page 63: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

フィーチャファイル● フィーチャファイルは、バンドルのFeaturesディレクトリ直下に作成する「test.feature」など

Page 64: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

テストを実行してみる

Page 65: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatでのテスト実行● Behat:test:bundle バンドル名

Page 66: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatでのテスト実行● Behat:test:bundle バンドル名

シナリオ実行

Page 67: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatでのテスト実行● Behat:test:bundle バンドル名

実行結果

Page 68: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behatでのテスト実行● Behat:test:bundle バンドル名

この辺注目

Page 69: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

ステップの実行の仕組み

Page 70: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

ステップの種類● 組み込みステップ最初から使えるステップフィーチャファイルに記述するだけで使える

● カスタムステップ組み込みステップにない独自のルールフィーチャファイルに自由な文章で記述し、対応するコードをステップファイルに記述

Page 71: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップの一覧behat:test:bundle --steps バンドル

Page 72: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップの一覧behat:test:bundle --steps --lang=ja バンドル

Page 73: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップの一覧

ステップの一覧(=レシピ)を見ながら、ざっくりとしたシナリオを記述していける(Webアプリケーションの場合)

重要

Page 74: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップの一覧

ステップの一覧(=レシピ)を見ながら、ざっくりとしたシナリオを記述していける(Webアプリケーションの場合)

重要

テストコードを書く心理ハードルが低い

Page 75: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップの場所● Mink内src/Behat/Mink/Integration/step/ mink_steps.php

中をのぞいてみましょう

Page 76: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップのコード

Page 77: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップのコード

ステップ(正規表現)

Page 78: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップのコード

ステップのPHPテストコード

Page 79: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

組み込みステップのコード● カスタムステップを実装する際にレシピがわりになります

Page 80: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

カスタムステップ● カスタムステップは、Features/steps/steps.phpに記述する。

● フィーチャファイルにカスタムステップを記述してbehatコマンドを実行すると、未実装のカスタムステップの雛形が表示される。(先ほど見た画面)

Page 81: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

カスタムステップ

Page 82: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

カスタムステップ

steps.phpへコピペ

Page 83: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

カスタムステップ● ステップがpendingになる

● あとはステップのコードを書くだけ

Page 84: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

カスタムステップ● ステップメソッド内は結構何でもできる

Page 85: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストの書き方は分かった。

早くテストファーストについて教えてくれ

Page 86: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

後は

開発のサイクルに乗せるだけ

慣 れ ろ !

Page 87: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストファーストに持っていく● まずはテストを書くことに慣れる● たとえばechoデバッグを、テストコードで行う

Page 88: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

http://www.phpunit.de/manual/3.6/ja/writing-tests-for-phpunit.html

Page 89: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストファーストに持っていく● まずはテストを書くことに慣れる● たとえばechoデバッグを、テストコードで行う

Page 90: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストファーストに持っていく● コード→テスト→コード→テスト・・・

Page 91: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

テストファーストに持っていく

● コード→テスト→コード→テスト・・・

このループに慣れれば、自然とテストを書きたくなります

Page 92: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

おまけ

Page 93: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat応用(1)● DDD(MDD)ユビキタス言語(DDD参照)を使い、ドメインモデルのフィーチャ、シナリオ、ステップを記述

→ドメインエキスパートにもメンテナンスできる(可能性)→前提・もし・ならば、の制限を外すようにDSLを拡張する(「・」など)

Page 94: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

Behat応用(2)● ITS(Redmine)、Gitのブランチ、コミット等

も含めたワークフロー→Behat関係あるの?→ブランチの実装内容に対するテストコード、フィーチャ、シナリオが一体となってGitリポジトリで管理可能→特にバグ修正の際に、ITSのチケットにいろいろ書くのではなく、バグ修正用フィーチャに説明などを書くようにする

Page 95: Symfony2 Behat/BDD (#Symfony2study 4)

Symfony2 x BDD

 

是非Behatを使ってみてください!