Symfony2 Behat/BDD (#Symfony2study 4)

Post on 19-May-2015

6460 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

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