behat3とzombiejsでBDDに挑戦(2)

なんでbehat"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


さて、使ったことないツールをインストールするとなると、
まず重要なのは”動くようにする”こと。
バージョンやら、構成やらは後で変えればよくて、
まず動くようにしてから次に進む。

[behat]は現在（2014/06/07）でstableのバージョンは3.0.8。
だが、マニュアルを読むと2.4を使う方法しか載ってない。
やってみるとわかるがバージョンを３にしたら、
後方互換が微妙で全部動かなくなるのだ。
バージョン３については次回書くとして、
まずはバージョン２をマニュアル通り動かすことを考えよう。

構成は以下の通り

|モジュール|バージョン|
|:-------|:--------|
|CentOS|6|
|PHP(CLI)|5.4|
|nodejs|0.10.28|


### ミドルウェアのインストール

PHPとnode.jsを使うのでそれをインストール。
リポジトリにepelを使うのでそれを登録するところからやっているが、
すでに登録済みならすっとばしてもらえばいい。

```shell-session
$ sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
$ wget  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm 
$ sudo rpm -K epel-release-*.rpm
$ sudo yum install epel-release-6-8.noarch.rpm
$ sudo yum --enablerepo=epel install nodejs-cli npm
$ sudo yum install php-cli  php-mbstring php-xml
```

動作確認

```shell-session
$ node --version
$ npm --version
$ php -v
```
### [zombie.js]のインストール

先にヘッドレスブラウザのインストール。
nodejsのパッケージ管理ツールnpmを使ってインストール。
バージョンは最新の2.0系。

```shell-session
$ sudo npm -g install zombie@1.4.1
```

インストール先はデフォルトで

> /usr/lib/node_modules/

となる

### [behat]2のインストール

適当なディレクトリを作成し、
そこに[behat]をインストールする。

```shell-session
$ mkdir behat2
$ cd behat2
```

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

[behat]はPHPのパッケージ管理ツールcomposerを使ってインストールする。
初めて使う人にはわかりにくいツールだが、
PEARが荒廃した状態では使わざるを得ないだろう。
今回は表記しやすいようにコマンドライン形式で書いているが、
通常はcomposer.jsonを編集することが多い。

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

##### インストール確認

```shell-session
$ ./bin/behat --version
Behat version 2.5.3
```

##### [behat]2の設定

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

```shell-session
$ ./bin/behat --init
+d features - place your *.feature files here
+d features/bootstrap - place bootstrap scripts and static files here
+f features/bootstrap/FeatureContext.php - place your feature related code here
```

これでbehatのインストールは完了。
一回動かしてみよう。

```shell-session
$ ./bin/behat
シナリオがありません
ステップがありません
0m0.003s
```

なにやらメッセージが出ているがとりあえずおいておく。

### extensionの設定

一応インストールはこれで終わりなのだが、
[zombie.js]を使うにはextensionを登録する必要がある。

##### behat.yml作成

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

```shell-session
$ cp vendor/behat/mink-extension/behat.yml.dist ./behat.yml  
$ vi behat.yml 
```
設定は以下のように変更
base_urlは自身がテストしたいURLに変えてもらえばいいだろう

```behat.yml 
default:
  extensions:
    Behat\MinkExtension\Extension:
      base_url: http://qiita.com/
      default_session: zombie
      javascript_session: zombie
      zombie: 
        node_modules_path: '/usr/lib/node_modules/'
```

動作確認だけしておこう。(エラーメッセージが出なければ成功)

```
$ ./bin/behat
シナリオがありません
ステップがありません
0m0.003s
```

##### FeatureContext.phpの調整

次にFeatureContextを調整する。
変更するのは__constructメソッド。

```shell-session
$ vi features/bootstrap/FeatureContext.php
```

```FeatureContext.php
    public function __construct(array $parameters)
    {
        $this->useContext('mink', new Behat\MinkExtension\Context\MinkContext);
    }
```

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

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

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

```shell-session
$ ./bin/behat -dl --lang=ja
$ ./bin/behat -di --lang=ja
$ ./bin/behat --story-syntax --lang=ja
```
あとはfeaturesディレクトリにテストコード(フィーチャ)を設置すればテストが始まる。

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

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

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

|  https://qiita.com/

    かつ print current URL # Behat\MinkExtension\Context\MinkContext::printCurrentUrl()

1 個のシナリオ (1 個成功)
2 個のステップ (2 個成功)
0m2.986s
```

さて、使うまでのハードルは高めだが、
これで一応動いているので、
featureやFeatureContext.phpをいじってテストを進めてもらって大丈夫。


次回はbehat3のインストールをやってみようと思う。


[behat]:http://behat.org/
[zombie.js]:http://zombie.labnotes.org