behat 3.0 でBDD:機能拡張

本当はもっと早く記事にする予定だったが。。。

[behat]:http://behat.org/
[behat3]:http://behat.readthedocs.org/en/latest/
[zombie.js]:http://zombie.labnotes.org
[phantomjs]:http://phantomjs.org/
[Behat Custom Helper]:https://github.com/sanpii/behatch-contexts

関連記事:

 * [behat3とzombiejsでBDDに挑戦(1)]
 * [behat3とzombiejsでBDDに挑戦(2)]
 * [behat 3.0 とzombiejsでBDDに挑戦(3)]
 * [behat 3.0とphantomjsでBDDに挑戦(4)]
[behat3とzombiejsでBDDに挑戦(1)]:http://qiita.com/dozo/items/be0ff9e9443413a32d25
[behat3とzombiejsでBDDに挑戦(2)]:http://qiita.com/dozo/items/4cb29ee55c4bd8891786
[behat 3.0 とzombiejsでBDDに挑戦(3)]:http://qiita.com/dozo/items/ec0448ffcbb703df9e43
[behat 3.0とphantomjsでBDDに挑戦(4)]:http://qiita.com/dozo/items/5a5f81061a5aade383d6


ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------

さて、以前の記事でwait設定をしたことがあるが、
その他にも[behat3]単独では不足している機能がたくさんある。
待ち時間一つとっても、ｎ秒待つだけではなく、
画面に現れるまで待つとか、
画面の表示、非表示を確認したいとか。
ピンポイントでスクリーンショットを撮りたいとか、
json, xmlの状態確認したいとか。

そのほかもろもろ拡張機能を加えたいが一つ一つをContextに追加していてはちょっと面倒だ。
そこで最初から必要なものをあらかじめ用意しているパッケージがある。
> [Behat Custom Helper]

今回はそれを使うことにする。

------------------- ↑ 余談はここまで ↑-------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------
# [Behat Custom Helper]のインストール

### composerでインストール

composerより追加し設定ファイルを書き換えればOK。

```shell-session
$ ./composer.phar require "sanpi/behatch-contexts *@dev" --prefer-dist 
$ vi ./behat.yml
```

### 設定ファイル変更

設定ファイルに記述を追加する
extensionとcontexts項目に記述を追加
contextsには必要なものだけ追加する形でも良い。

```behat.yml
default:
  suites:
    default:
      paths:
        - %paths.base%/features
      contexts:
        - FeatureContext
        - Behat\MinkExtension\Context\MinkContext
        - behatch:browser: # ←ここ追加
        - behatch:debug:   # ←ここ追加
        - behatch:json:    # ←ここ追加
        - behatch:rest     # ←ここ追加
        - behatch:system:  # ←ここ追加
        - behatch:table    # ←ここ追加
        - behatch:xml      # ←ここ追加
  extensions:
    Behat\MinkExtension:
      base_url: http://en.wikipedia.org/
      sessions:
        default:
          selenium2:
            wd_host: http://127.0.0.1:4444/wd/hub
    Sanpi\Behatch\Extension: ~  # ←ここ追加
```

### インストール確認

```shell-session
$ ./bin/behat -dl
```
デフォルトの状態より圧倒的にフィーチャ文脈が増えていることが確認できる。
contextにbehatch:browserを追加してしていると以下の記述が見つかると思う。

> Then /^(?:|私が)"(?P<text>[^"]*)"を見るまで(?P<seconds>\d+)秒間?待つ$/u
> Then /^(?:|私が)"(?P<text>[^"]*)"を見るまで待つ$/u
> Then /^(?:|私が)"(?P<element>[^"]*)"要素(?:で|に)"(?P<text>[^"]*)"を見るまで(?P<seconds>\d+)秒間?待つ$/u
> Then /^(?:|私が)(?P<seconds>\d+)秒間?待つ$/u

これをフィーチャに追加すればwait機能が使えることになる。
ではサンプルにあったwikipedia検索に追加してみる。
(サンプルは英語記述なのでフィーチャ分も英語バージョンを使っている)

```features/search.feature
Feature: Search
  In order to see a word definition
  As a website user
  I need to be able to search for a word

  Scenario: Searching for a page that does exist
    Given I am on "/wiki/Main_Page"
    Then I wait 10 seconds               # ← ここに追加
    When I fill in "search" with "Behavior Driven Development"
    And I press "searchButton"
    Then I should see "agile software development"

  Scenario: Searching for a page that does NOT exist
    Given I am on "/wiki/Main_Page"
    Then I wait 10 seconds               # ← ここに追加
    When I fill in "search" with "Glory Driven Development"
    And I press "searchButton"
    Then I should see "Search results"
```

これからはとりあえず組み込んでおいて、
使うか使わないかは後で決めるって方向でいいのではないかな。

------------------- ↑ 本題はここまで ↑ -------------------

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪

------------------- ↓ 補足はここから ↓-------------------

実は[behat3]のmink-extensionや今回の[Behat Custom Helper]の日本語の調整を少し手伝った。
プルリクエスト（変更内容を適用してくれ依頼のこと）を送信したのが３か月前。
一部テストに不具合があったので修正をすぐに入れたのだが、
何か月も放置状態だった。

いったん取り消して再度送ったら適用されたので、
どうやら修正分に気づいていなかったっぽい。
githubちゃんもうちょっとどうにかしてほしい。