behat 3.0とphantomjsでBDDに挑戦(4)

zombiejsは我々の中でも最弱

関連記事:

 * [behat3とzombiejsでBDDに挑戦(1)]
 * [behat3とzombiejsでBDDに挑戦(2)]
 * [behat 3.0 とzombiejsでBDDに挑戦(3)]
 * behat 3.0とphantomjsでBDDに挑戦(4)
 * [behat 3.0とJenkins CIでBDDに挑戦(5)]
 * [behatとChrome HeadlessでBDDを実践(6)]
[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
[behat 3.0とJenkins CIでBDDに挑戦(5)]:http://qiita.com/dozo/items/4de280e580bdc48c9d93
[behatとChrome HeadlessでBDDを実践(6)]:https://qiita.com/dozo/items/f023c3a4ae9c35768a65

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

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

# [zombie.js]について

運用すればわかるが[zombie.js]ではいろいろ不都合がある。
まず、同じテストが成功したり失敗したりと安定しない。
サイトのレスポンスに時間がかかっても返答を待ってくれないので、
データが取得できずに失敗扱いとなるわけだ。

それからCPUをフルパワーで使うぐらい重い。

あと、個人的にやりたかったスクリーンショットを撮るということができない。
テストに失敗したとき、どう失敗したのかを知りたくてもヒントなしになるので、
解決に時間がかかってしまう。
スクリーンショットが取れれば解決も早くなるだろう。

それらを解決するの方法が[phantomjs]利用というわけ。
[behat3]について全体的に把握できたので、
以前失敗した[phantomjs]を導入してみる。

一つ勘違いをしていたのだが。
[phantomjs]は2012年12月に独自でWebDriverに対応していた。
([PhantomJS 1.8 Release Notes]参照)
検証のために読んでいた各種記事通りに動作しないのはこのためか。
seleniumがいらなくなるのはありがたい。

例によって以前の環境と別にするため、
ディレクトリは別に切ることにする。
phpとnodeはyumで入れている(第２回参照)前提で話す。

```shell-session
$ mkdir behat_phantom
$ cd behat_phantom
```

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

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

------------------- ↓ 本題はここから ↓-------------------

# [behat3]と[phantomjs]のインストール
### [phantomjs]のインストール

```shell-session
$ sudo npm -g install phantomjs
```

※2014/10/15追記
後で知ったが[phantomjs]はnodejsをインストールをしなくても、
バイナリファイルをダウンロードして利用することもできる。


Z### [behat3]のインストール

毎度毎度、ゼロからインストールしていているのは、
検索からこの記事に直接来たときでも問題ないようにするためで、
必要なければ読み飛ばしてもらっていい。

##### composerのインストール

```shell-session
$ curl http://getcomposer.org/installer | php  # composerのダウンロード
$ ./composer.phar init -n                      # composer.jsonの生成
$ ./composer.phar config bin-dir "bin/"        # binディレクトリ指定
$ ./composer.phar install                      # venderディレクトリ生成
$ ./composer.phar require "behat/behat 3.*@stable" "behat/mink 1.6.*@dev" "behat/mink-extension 2.*@dev" "behat/mink-browserkit-driver *@dev" "behat/mink-goutte-driver *@dev" "behat/mink-selenium2-driver *@dev" --prefer-dist # 各種インストール
```

##### インストール確認
```shell-session
$ ./bin/behat --version
behat version 3.0.8
```

##### [behat3]の設定
behatのプロジェクトを初期化する。
featuresディレクトリが新規に作成され必要なファイルが生成される。

```shell-session
$ ./bin/behat --init
+d features - place your *.feature files here
+d features/bootstrap - place your context classes here
+f features/bootstrap/FeatureContext.php - place your definitions, transformations and hooks here
```

### extensionの設定

[zombie.js]と同様[phantomjs]を使うにはextensionを登録する必要がある。

##### behat.yml作成

[phantomjs]実行シェル作成とと[behat]設定ファイルbehat.ymlの作成をする
テンプレートがmink-extendsのインストール先にあるので、それを使う

```shell-session
$ cp vendor/behat/mink-selenium2-driver/bin/run-phantomjs.sh ./bin   # phantomjs起動シェル
$ cp vendor/behat/mink-extension/behat.yml.dist ./behat.yml  # behat設定ファイル
$ vi behat.yml 
```
```behat.yml
default:
  suites:
    default:
      paths: # ←↓ここ修正
        - %paths.base%/features
      contexts: # ←↓ここ修正
        - FeatureContext
        - Behat\MinkExtension\Context\MinkContext
  extensions:
    Behat\MinkExtension:
      base_url: http://en.wikipedia.org/
      sessions:
        default:
          selenium2: # ←↓ここ修正
            wd_host: http://127.0.0.1:4444/wd/hub
```
動作確認だけしておこう。(エラーメッセージが出なければ成功)

```
$ sh ./bin/run-phantomjs.sh  # phantomjs起動。初回のみ。停止のときはpkill node。
$ ./bin/behat
No scenarios
No steps
0m0.05s (15.05Mb)
```

設定はこれで完了。
実際のフィーチャファイルで動作を確認する。

```shell-session
$ cp vendor/behat/mink-extension/features/search.feature ./features # behat設定ファイル
$ ./bin/behat
```

dlオプションでフィーチャファイル内で使える用語リストが取得できるのだが、
Extensionが設定できていないと取得できない。
これを利用して動作確認する。

```shell-session
$ ./bin/behat -dl --lang=ja
default | Given /^(?:|I )am on (?:|the )homepage$/
default |  When /^(?:|I )go to (?:|the )homepage$/
default | Given /^(?:|ユーザーは )"(?P<page>[^\s]+)" を表示している$/u
default |  When /^(?:|ユーザーが )"(?P<page>[^\s]+)" へ移動する$/u
・・・
```


また、下記のコマンドに表示される内容はフィーチャファイル作成時に必要になるので、
どこかにメモとして保管して置くといいだろう。

```shell-session
$ ./bin/behat --story-syntax --lang=ja # フィーチャ書式構文
$ ./bin/behat -dl --lang=ja            # 書式一覧
$ ./bin/behat -di --lang=ja            # 書式一覧＋詳細説明
$ ./bin/behat --config-reference       # behat.yml設定パラメータ
```



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

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

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

 * [phantomjs]の起動オプション

[phantomjs]を起動するときに使っているrun-phantomjs.shだが、
現状の状態ではいろいろ問題があったのでいかのように修正している

```run-phantomjs.sh
#!/usr/bin/env sh
set -e

phantomjs --version
echo '    Running PhantomJS'
phantomjs --webdriver=4444 --ignore-ssl-errors=yes --cookies-file=/tmp/webdriver_cookie.txt > /tmp/webdriver_output.txt &
```
 * エラー1
                                                           
>  [RuntimeException]
>  Install MinkGoutteDriver in order to use goutte driver.  
                                                           
behat.ymlの設定ミス。
以下の記述を削除すればよい

```behat.yml
   Goutte: ~
```

 * エラー2

> [Behat\Behat\Context\Exception\ContextNotFoundException]
> ``Behat\MinkExtension\Context\MinkContextontexts`` context class not found and can not be used.  
                                                                                                 
[PhantomJSが起動していない。
以下のコマンドを実行し、再度試してほしい。

```shell-session
$ sh ./bin/run-phantomjs.sh 
```


[behat]:http://behat.org/
[behat3]:http://behat.readthedocs.org/en/latest/
[zombie.js]:http://zombie.labnotes.org
[phantomjs]:http://phantomjs.org/
[PhantomJS 1.8 Release Notes]:http://phantomjs.org/release-1.8.html