SlideShare a Scribd company logo
Behat Driven
Development
2015/10/3
㈱オハコ Ryo Tomidokoro
PHP Conference Tokyo 2015
About me
Ryo Tomidokoro (@hanhan1978)
サーバーサイドエンジニア
自動テストにまつわる悲しい過
去・・・
• 何度も同じ箇所でデグレ。
• でも、自動テストを追加する工数が取れないと言われる。
• でも、自動テストのやり方がわからないと言われる。
• RspecとかCapybaraはRubyのツールだから分からないと
言われる。
• バグが起きた時の再発防止策で「頑張る」とか言われる。
Behat
• 私が欲していた全てがここに。
• 辛かった過去が報われる時がきた。
• この感動と、この感動の理由を共有せねばな
らない!
• 注) BDDとしては使ってない・・・
About this presentation
1. TDD, BDDと自動テスト
2. 自動テストの利点
3. 自動テスト失敗の体験談
4. Behatについて
5. Behatと現場の相性
6. Behat Driven Development
1. TDD, BDDと自動テスト
TDD, BDD
• TDDとは?BDDとは?(触れるな危険)
• 短いスパンで、テスト&実装を繰り返す。
• TDDは単体、BDDは受入という捉えられ方が
多い
• テスト駆動開発と自動テストは分けて考える
自動テスト
• PHPUnit, PHPSpec, Behat
• アプリケーションをテストするプログラム
• CIツールから実行することで、継続的にアプ
リケーションテストを実行する
• 今日の話のメインターゲットはコッチ。
余談
• TDD, BDDは生半可では回らない。
• 関与するエンジニア全員が覚悟をもって取り
組まないと、絶対に頓挫する。
2. 自動テストの利点
自動テストが効果を持つ場所
• デグレがよく起こる箇所の事前検査
• ビジネス的に重要な箇所の事前検査
• テスト手順が煩雑な箇所の検査
• 放置状態の機能の死活監視
個人的に感じるメリット
• リリースに自信がでる。(よく聞く)
• リファクタリングに勇気がでる。(よく聞く)
• 面接の時言える。
• 自動テストは、意識高そう。
自動テストに吹く逆風
• テストを作成するコスト、教育にかかるコスト
• コストが高い場合は、周囲の理解を得られない
ことが多い。
• テスト書いたことの無いエンジニアの自動テス
トアレルギーは侮れない。
まとめ
• メリットはある。(断言)
• 既存機能の改修と、安定したリリースに確実
に貢献する。
• コストが高いというイメージはつきまとう。
3. 自動テスト失敗の体験談
ケース1) テスト作れない
テスト作れない問題
• やったことない。
• どうやればいいか分からない。
• 教育工数が取れない。
• 結果的に、日々の作業に追われて業務が改善
されない。
テスト作れない理由
• そもそも教育工数が取れない組織自体に問題
がある。
• 自動テストへの心理的ハードルは、結構高い
。
• 効率の良い運用が出来なくて、時間がなくな
っていく負のスパイラル
ケース2) 自動テストの遺跡
遺跡が生まれる過程
• 新規プロジェクトで新しいWAFを採用!
• このタイミングでTDD導入!
• メンバーもノリノリ。
【プロジェクト初期】
遺跡が生まれる過程
• controllerもmodelもテストできる
• DIコンテナ万歳!\(^o^)/
• よーし、fixtureでテストデータ登録しちゃうぞー
【プロジェクト中期】
遺跡が生まれる過程
• 駆け込みで作る機能はテスト無し
• いいから動くものを・・・
• 外注の部分はごっそりテストがない・・・
• 応援メンバーへのテストツール教育が・・・
【プロジェクト後期】
遺跡
• アレ、testが動かない。でもバグ修正は今日。
• この「test」というディレクトリは何ですか?
• そして、誰も触れなくなってくる。
【運用期間】
遺跡が生まれる理由
• アプリ全体を網羅しようとする完璧主義
• CI不在で、テストが定期的に実行されていない。
• CI不在だと、特定個人の環境でしかテストが動かな
いなどの問題がある
• 不完全でも特定環境に依存しない形でCIされないと
遺跡化する。
ケース3) テストの放置
テストは動いている・・・
• Jenkinsにテスト実行ログとかはグラフででて
る。
• グラフは綺麗。
• テストを実行しているだけ、失敗・成功の通
知がMLに飛んでいるが、誰も反応しない。
• 最悪、失敗状態でリリースを重ねてたりする
。
放置テストの理由
• リリースツールは、テスト失敗時はリリース
出来ちゃダメ。
• 通知がMLだと、他人事にする人が多い。
• 自動テスト導入後の運用も含めてトータルに
考えないと、あっという間に廃れる
自動テストの成功を阻む要因
1. テストツールの教育不足
2. 個人依存のテスト実行環境
3. 導入後の通知や運用ルールの不備
※ 組織の政治的な理由による場合は○クルートエー○
ェントとかに相談してください。
余談
• 押し付けても現場に自動テストは浸透しない
• 現場における平均レベルのエンジニアが自然
と実行できるレベルにまで噛み砕く。
• オラっても上手くいかない。(体験談)
4. Behatについて
Behatって何?
• BDDテストフレームワーク
• Cucumberにinspireされた
• テストシナリオはGherkin形式
• PHP製 (ココ大事)
Behatで出来ること
• デフォルト状態では何もない
• テスト(feature), アサーション(step)は自分で作
る
• 一般的にはextensionを導入して使う
主なextension
• Mink => 汎用Webアプリ向けテスト拡張
• Symfony2
• Laravel
• CakePHP
実際のBehatテストコード
# language: en
Feature: Do Some Sample Testing
Scenario: ls
Given I am in the "directory"
When I execute "command"
Then I should get "file1,file2"
feature (テストシナリオ)
実際のBehatテストコード
step (テストコード)
<?php
/**
* Defines application features from the specific context.
*/
class FeatureContext implements Context, SnippetAcceptingContext
{
/**
* @Given I am in the :arg1
*/
public function iAmInThe($arg1)
{
throw new PendingException();
}
}
構成はシンプル
.
├─ behat.yml
└─ features/
├── bootstrap
│ └── FeatureContext.php
└── sample.feature
• behatの設定ファイル
• feature (テストシナリオ)
• step (PHPで記述されたテストコード)
Behatとは (まとめ)
• Cucumberライクなテストツール
• PHP製で、拡張が簡単
特殊なツールではないし、すごく目新しいわけ
でもない。ほどよく簡単。
5. Behat と現場の相性
Behatはバランスが良い
1. 低コスト (時間)
2. テスト対象を問わない
3. 既存のプロジェクトに後付が簡単。
4. Composer利用でCIとの相性も良い
1. 低コスト
• 拡張を利用したE2Eテストは作成コストが低い
# language : en
Feature: stock search
Scenario: get stock code
Given I am on the homepage
When I follow "ファイナンス"
When I fill in "searchText" with "九州電力"
When I press "searchButton"
Then I should see "9508"(例) yahooファイナンスで株価検索するテスト [5分で制作]
2. テスト対象は問わない
• PHP4でも、PHP5.2以下でも・・・
• もっと言うなら、RoRでもPython, Perlのアプ
リでも。
3. 後付が簡単。
• E2Eテスト
• メソッドの詳細をテストするわけではない。
• ブラウザ操作レベルに抽象化出来る。
4. CIとの相性
• ComposerでインストールOK
language: php
php:
- 5.5
- 5.4
before_script:
- composer install
script:
- vendor/bin/behat(例) .travis.yml
6. Behat Driven Dev
ここで5分余ってないとやばい
自動テストの成功を阻む要因
1. テストツールの教育不足
2. 個人依存のテスト実行環境
3. 導入後の通知や運用ルールの不備
おさらい
1. テストツールの教育
• PHP製という強み
• Qiitaや、後述の参考資料の内容を1時間程度やれば、十分把
握可能
• E2Eテスト前提であれば、Mink拡張を利用するだけなので、
PHPのコードは一行も書かない。
2. 個人非依存のテスト実行環境
• Composerでinstall可能
• 近代的なCIツールなら簡単に構築可能(前述)
※ composerを知らないPHPerは存在しないという
前提だが、大丈夫。問題ない。
3. 導入後の通知や運用ルール整備
• 最近のCIツールは通知拡張を備えている(slack
とか)
• テスト失敗時にdeploy出来ないフローにする。
• PR開発によるコードレビューは相性が良い。
BeDDの必須構成要素
VCS CI
Notification
BeDDのフロー1
2. Webhookでテスト実行
1. ソースコードのpush
BeDDのフロー2
テスト用既存アプリBehatテスト
1. 実行
2. 通知
PHP5.3以上であれば、既存アプリにテストを含めるのもアリ。
BeDDのフロー3
本番環境
1. テストOKであれば、deployが走る
2. 通知
参考資料
役に立つリンク
• はじめてのBehat
• 15分で作れるBehatテスト - e2e編
• Behatエクステンション作成
(参考)トレンド
(参考)トレンド2
Any questions?
Ask me @hanhan1978

More Related Content

PDF
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
PDF
いまどきのPHP開発現場 -2015年秋-
PDF
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
PDF
PHPデプロイツールの世界
PDF
phpspecで始めるBDD
PDF
PHPUnit でテスト駆動開発を始めよう
PDF
PHPの今とこれから2015
PDF
Laravel5.1 Release
脆弱性もバグ、だからテストしよう PHPカンファンレス2015
いまどきのPHP開発現場 -2015年秋-
Drupal 8 - モダンなアーキテクチャのPHPベースOSS CMS
PHPデプロイツールの世界
phpspecで始めるBDD
PHPUnit でテスト駆動開発を始めよう
PHPの今とこれから2015
Laravel5.1 Release

What's hot (20)

PDF
FuelPHP活用事例
PPTX
今日から始めるLaravel
PDF
よりよいPHPUnitの実行方法を求めて
PDF
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
PDF
PHPとJavaScriptの噺
PDF
Pythonでブラウザをいっぱい動かしたい
PDF
Laravel 5.1 LTSでサービスを作る
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PDF
Laravelのパッケージのテストに便利なパッケージ
PDF
フレームワークを使うべき 3 つの理由
PDF
anyenv + phpenv + php-build が便利すぎる件
PDF
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
PDF
Getting Started with Testing using PHPUnit
PDF
AspectMock 最強のモッキングフレームワーク
PPT
How to manage Cakephp @CakePHP_Fukuoka_2
PDF
Laravelとテストについて
PDF
Javaのログ出力: 道具と考え方
PDF
Windows で PHP をビルドしてみた
PDF
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
PDF
php開発で使うタスクランナー gulp
FuelPHP活用事例
今日から始めるLaravel
よりよいPHPUnitの実行方法を求めて
第21回関西PHP勉強会 ReactPHPは もっと流行って欲しい #phpkansai
PHPとJavaScriptの噺
Pythonでブラウザをいっぱい動かしたい
Laravel 5.1 LTSでサービスを作る
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
Laravelのパッケージのテストに便利なパッケージ
フレームワークを使うべき 3 つの理由
anyenv + phpenv + php-build が便利すぎる件
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
Getting Started with Testing using PHPUnit
AspectMock 最強のモッキングフレームワーク
How to manage Cakephp @CakePHP_Fukuoka_2
Laravelとテストについて
Javaのログ出力: 道具と考え方
Windows で PHP をビルドしてみた
ExcelとPythonによる社会インフラシステムの設定ファイルの自動生成
php開発で使うタスクランナー gulp
Ad

Viewers also liked (20)

PDF
営業・運用を支える "気付ける" 管理画面
PDF
Visual Studio Code #phpcon2015
PPTX
Phpcon2015
PDF
WebRTC開発者向けプラットフォーム SkyWayの裏側
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
PDF
サンタクロースを支えるIT技術 @M_Ishikawa #yapcasia
PDF
PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
PDF
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
PDF
behatエクステンションの作り方
PDF
PHP最速フレームワークPhalconの紹介
PDF
Phalcon 謹製テンプレートエンジン Volt - Meet phalcon Volt
PDF
5分でわかるphalcon php
PDF
HTTP2 & HPACK #pyfes 2013-11-30
PPTX
PHPerにもCoderDojoのメンターとしてお手伝いしてほしい
PDF
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
PDF
Wocker 秒速で WordPress 開発環境を構築する
PPTX
PHPとフロントのイイ関係・動くスタイルガイドをつくろう
PPTX
PHP7実環境ベンチ2016春
PPTX
160628 drink meetup_with_mercari_#37
PDF
エンジニア採用ヤバイ! PHPカンファレンス関西 懇親会LT
営業・運用を支える "気付ける" 管理画面
Visual Studio Code #phpcon2015
Phpcon2015
WebRTC開発者向けプラットフォーム SkyWayの裏側
MySQL 5.7にやられないためにおぼえておいてほしいこと
サンタクロースを支えるIT技術 @M_Ishikawa #yapcasia
PHPer女子が語る2015!こんなコードを書くヒトはモテない〜コラボ編〜@PHPカンファレンス2015 #phpcon2015
10年続いているwebサービスの画像サーバをノーメンテでftpサーバからs3互換のストレージサーバに移行している話
behatエクステンションの作り方
PHP最速フレームワークPhalconの紹介
Phalcon 謹製テンプレートエンジン Volt - Meet phalcon Volt
5分でわかるphalcon php
HTTP2 & HPACK #pyfes 2013-11-30
PHPerにもCoderDojoのメンターとしてお手伝いしてほしい
継続的Webセキュリティテスト PHPカンファレンス関西2015 LT
Wocker 秒速で WordPress 開発環境を構築する
PHPとフロントのイイ関係・動くスタイルガイドをつくろう
PHP7実環境ベンチ2016春
160628 drink meetup_with_mercari_#37
エンジニア採用ヤバイ! PHPカンファレンス関西 懇親会LT
Ad

Similar to Behat Driven Development (18)

PDF
Behatで行う、E2Eテスト入門
PPTX
DrupalでBDDテストを実施してみる①
PDF
Symfony2 Behat/BDD (#Symfony2study 4)
PDF
Introduction to Continuous Test Runner MakeGood
PDF
Drupal 8 へのスタンドアロン behat の導入
PPT
ビジネス的に高価値なアジャイルテスト
KEY
Behat+Symfony2ではじめるBDD超入門
PPT
PHP agile test tips
PDF
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
PDF
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
PDF
あなたの安心を高速に守る Container-based CI
PDF
テストファースト、自動テストを導入するという事について(@社内勉強会)
PDF
Symfony2 behat-bdd
PDF
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
PDF
DrupalでBDDテストを 実施してみる②
PDF
MakeGoodで快適なテスト駆動開発を
PPTX
Php勉強会スライド
PDF
開発エンジニアがChefで テスト駆動サーバー設定してみた #biglobetechtalk
Behatで行う、E2Eテスト入門
DrupalでBDDテストを実施してみる①
Symfony2 Behat/BDD (#Symfony2study 4)
Introduction to Continuous Test Runner MakeGood
Drupal 8 へのスタンドアロン behat の導入
ビジネス的に高価値なアジャイルテスト
Behat+Symfony2ではじめるBDD超入門
PHP agile test tips
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
あなたの安心を高速に守る Container-based CI
テストファースト、自動テストを導入するという事について(@社内勉強会)
Symfony2 behat-bdd
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
DrupalでBDDテストを 実施してみる②
MakeGoodで快適なテスト駆動開発を
Php勉強会スライド
開発エンジニアがChefで テスト駆動サーバー設定してみた #biglobetechtalk

Behat Driven Development