behat 3.0 とzombiejsでBDDに挑戦(3)

さて、お遊びはここまでだ。


関連記事:

 * [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)]
[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


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

# [behat3]について
前回の記事では[behat]2をインストールした。
全体的な流れはだいたい理解いただけたと思う。
しかし、本題はこれからバージョン３をインストールするにあたって、
前回の記事の内容は全部忘れてもらっていいだろう。

工工エエェェェェｪｪｪ(ﾟДﾟ)ｪｪｪェェエエエ工工

全部は言いすぎか。
完成系があんな感じねっていうのが掴めれば問題ない。

さて、なぜ私がバージョン３に拘るかというと、
そのアップデート内容にある。

 * スイートという概念を導入
 * フィーチャ、コンテクストの組み合わせ自由度上昇
 * テスト失敗時に状態を出力
 * Turnipフォーマットに対応
 * WebAPIのテストも可

Gherkin書式の正規表現からTurnip書式のプレースホルダになったり、
エラー時の状態把握がしやすかったり、
フィーチャの組み合わせを自由にしたり、
コンテクストの肥大化が避けられたりと。
割と魅力的な変更が行われている。

しかし、アーキテクチャもガラッと変わり、
フィーチャファイル以外は作り直す方がいいだろう。
以下は前回と異なるディレクトリでやっているつもりで見てほしい。

```shell-session
$ mkdir behat3
$ cd behat3
```

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

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

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


# [behat 3.0]と[zombie.js]のインストール
### [zombie.js]のインストール(バージョンアップ)

[behat 3.0]付属のmink-extensionはzombiejs2が必要なので先にバージョンアップをしておく。

```shell-session
$ sudo npm -g install zombie@2.x
```

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

[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-zombie-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の設定

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

##### behat.yml作成

まずは設定ファイルbehat.ymlを作成する
テンプレートがmink-extendsのインストール先にあるので、それを使う

```shell-session
$ cp vendor/behat/mink-extension/behat.yml.dist ./behat.yml  
$ vi behat.yml 
```
```behat.yml
default:
  suites:
    default:
      paths: # ←↓ここ修正
        - %paths.base%/features
      contexts: # ←↓ここ修正
        - FeatureContext
        - Behat\MinkExtension\Context\MinkContext
  extensions:
    Behat\MinkExtension:
      base_url: http://qiita.com/
      sessions:
        default:
          zombie: # ←↓ここ修正
            node_modules_path: '/usr/lib/node_modules/'
```
動作確認だけしておこう。(エラーメッセージが出なければ成功)

```
$ ./bin/behat
No scenarios
No steps
0m0.05s (15.05Mb)
```

設定はこれで完了。
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設定パラメータ
```
あとはfeaturesディレクトリにテストコード(フィーチャ)を設置すればテストが始まる。
前回と同じものを置いてみよう。

```features/qiita.feature
# language: ja
フィーチャ: Qiitaトップへ移動
 httpにアクセスしたらリダイレクトしてhttpsになる
 
 シナリオ: Qiitaトップへ移動
  前提 ユーザーは "/" を表示している
  ならば 最後のレスポンスを表示
```

```shell-session
$ ./bin/behat
フィーチャ: Qiitaトップへ移動
  httpにアクセスしたらリダイレクトしてhttpsになる

  シナリオ: Qiitaトップへ移動      # features/qiita.feature:5
    前提 ユーザーは "/" を表示している # Behat\MinkExtension\Context\MinkContext::visit()
    かつ print current URL # Behat\MinkExtension\Context\MinkContext::printCurrentUrl()
      │ https://qiita.com/

1 scenario (1 passed)
2 steps (2 passed)
0m3.80s (15Mb)
```

余裕がある人は以下を見てもらうといいだろう。
参考：
https://www.youtube.com/watch?v=xOgyKTmgYI8
http://www.slideshare.net/everzet/behat-30-meetup-march


[behat3]についてはいいのだが、[zombie.js]については不満が出てきた。
なので、次回はphantomjsを使ってみることにする。

[behat]:http://behat.org/
[behat3]:http://behat.readthedocs.org/en/latest/
[behat 3.0]:http://behat.readthedocs.org/en/latest/
[zombie.js]:http://zombie.labnotes.org