Behat Driven Development

57
Behat Driven Development 2015/10/3 ㈱㈱㈱㈱ Ryo Tomidokoro PHP Conference Tokyo 2015

Transcript of Behat Driven Development

Page 1: Behat Driven Development

Behat Driven Development2015/10/3㈱オハコ Ryo Tomidokoro

PHP Conference Tokyo 2015

Page 2: Behat Driven Development

About me

Ryo Tomidokoro (@hanhan1978)サーバーサイドエンジニア

Page 3: Behat Driven Development

自動テストにまつわる悲しい過去・・・• 何度も同じ箇所でデグレ。• でも、自動テストを追加する工数が取れないと言われる。• でも、自動テストのやり方がわからないと言われる。• Rspec とか Capybara は Ruby のツールだから分からないと言われる。• バグが起きた時の再発防止策で「頑張る」とか言われる。

Page 4: Behat Driven Development

Behat

• 私が欲していた全てがここに。• 辛かった過去が報われる時がきた。• この感動と、この感動の理由を共有せねばならない!• 注 ) BDD としては使ってない・・・

Page 5: Behat Driven Development

About this presentation1. TDD, BDD と自動テスト2. 自動テストの利点3. 自動テスト失敗の体験談4. Behat について5. Behat と現場の相性6. Behat Driven Development

Page 6: Behat Driven Development

1. TDD, BDD と自動テスト

Page 7: Behat Driven Development

TDD, BDD

• TDD とは? BDD とは? ( 触れるな危険 )• 短いスパンで、テスト&実装を繰り返す。• TDD は単体、 BDD は受入という捉えられ方が多い• テスト駆動開発と自動テストは分けて考える

Page 8: Behat Driven Development

自動テスト• PHPUnit, PHPSpec, Behat• アプリケーションをテストするプログラム• CI ツールから実行することで、継続的にアプリケーションテストを実行する• 今日の話のメインターゲットはコッチ。

Page 9: Behat Driven Development

余談• TDD, BDD は生半可では回らない。• 関与するエンジニア全員が覚悟をもって取り組まないと、絶対に頓挫する。

Page 10: Behat Driven Development

2. 自動テストの利点

Page 11: Behat Driven Development

自動テストが効果を持つ場所• デグレがよく起こる箇所の事前検査• ビジネス的に重要な箇所の事前検査• テスト手順が煩雑な箇所の検査• 放置状態の機能の死活監視

Page 12: Behat Driven Development

個人的に感じるメリット• リリースに自信がでる。 ( よく聞く )• リファクタリングに勇気がでる。 ( よく聞く )• 面接の時言える。• 自動テストは、意識高そう。

Page 13: Behat Driven Development

自動テストに吹く逆風• テストを作成するコスト、教育にかかるコスト• コストが高い場合は、周囲の理解を得られないことが多い。• テスト書いたことの無いエンジニアの自動テストアレルギーは侮れない。

Page 14: Behat Driven Development

まとめ• メリットはある。 ( 断言 )• 既存機能の改修と、安定したリリースに確実に貢献する。• コストが高いというイメージはつきまとう。

Page 15: Behat Driven Development

3. 自動テスト失敗の体験談

Page 16: Behat Driven Development

ケース 1) テスト作れない

Page 17: Behat Driven Development

テスト作れない問題• やったことない。• どうやればいいか分からない。• 教育工数が取れない。• 結果的に、日々の作業に追われて業務が改善されない。

Page 18: Behat Driven Development

テスト作れない理由• そもそも教育工数が取れない組織自体に問題がある。• 自動テストへの心理的ハードルは、結構高い。• 効率の良い運用が出来なくて、時間がなくなっていく負のスパイラル

Page 19: Behat Driven Development

ケース 2) 自動テストの遺跡

Page 20: Behat Driven Development

遺跡が生まれる過程• 新規プロジェクトで新しい WAF を採用!• このタイミングで TDD 導入!• メンバーもノリノリ。

【プロジェクト初期】

Page 21: Behat Driven Development

遺跡が生まれる過程• controller も model もテストできる• DI コンテナ万歳!\ (^o^)/• よーし、 fixture でテストデータ登録しちゃうぞー

【プロジェクト中期】

Page 22: Behat Driven Development

遺跡が生まれる過程• 駆け込みで作る機能はテスト無し• いいから動くものを・・・• 外注の部分はごっそりテストがない・・・• 応援メンバーへのテストツール教育が・・・

【プロジェクト後期】

Page 23: Behat Driven Development

遺跡• アレ、 test が動かない。でもバグ修正は今日。• この「 test 」というディレクトリは何ですか?• そして、誰も触れなくなってくる。

【運用期間】

Page 24: Behat Driven Development

遺跡が生まれる理由• アプリ全体を網羅しようとする完璧主義• CI不在で、テストが定期的に実行されていない。• CI不在だと、特定個人の環境でしかテストが動かないなどの問題がある• 不完全でも特定環境に依存しない形で CI されないと遺跡化する。

Page 25: Behat Driven Development

ケース 3) テストの放置

Page 26: Behat Driven Development

テストは動いている・・・• Jenkins にテスト実行ログとかはグラフででてる。• グラフは綺麗。• テストを実行しているだけ、失敗・成功の通知が ML に飛んでいるが、誰も反応しない。• 最悪、失敗状態でリリースを重ねてたりする。

Page 27: Behat Driven Development

放置テストの理由• リリースツールは、テスト失敗時はリリース出来ちゃダメ。• 通知が ML だと、他人事にする人が多い。• 自動テスト導入後の運用も含めてトータルに考えないと、あっという間に廃れる

Page 28: Behat Driven Development

自動テストの成功を阻む要因1. テストツールの教育不足2. 個人依存のテスト実行環境3. 導入後の通知や運用ルールの不備

※ 組織の政治的な理由による場合は○クルートエー○ェントとかに相談してください。

Page 29: Behat Driven Development

余談• 押し付けても現場に自動テストは浸透しない• 現場における平均レベルのエンジニアが自然と実行できるレベルにまで噛み砕く。• オラっても上手くいかない。 ( 体験談 )

Page 30: Behat Driven Development

4. Behat について

Page 31: Behat Driven Development

Behat って何 ?

• BDD テストフレームワーク• Cucumber に inspire された• テストシナリオは Gherkin形式• PHP製 ( ココ大事 )

Page 32: Behat Driven Development

Behat で出来ること• デフォルト状態では何もない• テスト (feature), アサーション (step) は自分で作る• 一般的には extension を導入して使う

Page 33: Behat Driven Development

主な extension

• Mink => 汎用 Web アプリ向けテスト拡張• Symfony2• Laravel• CakePHP

Page 34: Behat Driven Development

実際の 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 ( テストシナリオ )

Page 35: Behat Driven Development

実際の 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(); }}

Page 36: Behat Driven Development

構成はシンプル.├─ behat.yml└─ features/ ├── bootstrap │   └── FeatureContext.php └── sample.feature•behat の設定ファイル• feature ( テストシナリオ )•step (PHP で記述されたテストコード )

Page 37: Behat Driven Development

Behat とは ( まとめ )

• Cucumber ライクなテストツール• PHP製で、拡張が簡単

特殊なツールではないし、すごく目新しいわけでもない。ほどよく簡単。

Page 38: Behat Driven Development

5. Behat と現場の相性

Page 39: Behat Driven Development

Behat はバランスが良い1. 低コスト ( 時間 )

2. テスト対象を問わない3. 既存のプロジェクトに後付が簡単。4. Composer 利用で CI との相性も良い

Page 40: Behat Driven Development

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 分で制作 ]

Page 41: Behat Driven Development

2. テスト対象は問わない• PHP4 でも、 PHP5.2以下でも・・・• もっと言うなら、 RoR でも Python, Perl のアプリでも。

Page 42: Behat Driven Development

3. 後付が簡単。• E2E テスト• メソッドの詳細をテストするわけではない。• ブラウザ操作レベルに抽象化出来る。

Page 43: Behat Driven Development

4. CI との相性• Composer でインストール OK

language: phpphp: - 5.5 - 5.4

before_script: - composer install

script: - vendor/bin/behat(例 ) .travis.yml

Page 44: Behat Driven Development

6. Behat Driven Dev

ここで 5 分余ってないとやばい

Page 45: Behat Driven Development

自動テストの成功を阻む要因1. テストツールの教育不足2. 個人依存のテスト実行環境3. 導入後の通知や運用ルールの不備

おさらい

Page 46: Behat Driven Development

1. テストツールの教育• PHP製という強み• Qiita や、後述の参考資料の内容を 1 時間程度やれば、十分把握可能• E2E テスト前提であれば、 Mink拡張を利用するだけなので、 PHP のコードは一行も書かない。

Page 47: Behat Driven Development

2. 個人非依存のテスト実行環境• Composer で install 可能 • 近代的な CI ツールなら簡単に構築可能 ( 前述 )

※ composer を知らない PHPer は存在しないという前提だが、大丈夫。問題ない。

Page 48: Behat Driven Development

3. 導入後の通知や運用ルール整備• 最近の CI ツールは通知拡張を備えている

(slack とか )• テスト失敗時に deploy 出来ないフローにする。• PR 開発によるコードレビューは相性が良い。

Page 49: Behat Driven Development

BeDD の必須構成要素VCS CI

Notification

Page 50: Behat Driven Development

BeDD のフロー 1

2. Webhook でテスト実行

1. ソースコードの push

Page 51: Behat Driven Development

BeDD のフロー 2

テスト用既存アプリBehat テスト

1. 実行

2. 通知

PHP5.3 以上であれば、既存アプリにテストを含めるのもアリ。

Page 52: Behat Driven Development

BeDD のフロー 3

本番環境

1. テスト OK であれば、 deploy が走る

2. 通知

Page 53: Behat Driven Development

参考資料

Page 55: Behat Driven Development

( 参考 ) トレンド

Page 56: Behat Driven Development

( 参考 ) トレンド 2

Page 57: Behat Driven Development

Any questions?

Ask me @hanhan1978