Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

zombiejsは我々の中でも最弱

関連記事:

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

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

zombie.jsについて

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

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

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

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

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

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

$ mkdir behat_phantom
$ cd behat_phantom

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

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

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

behat3phantomjsのインストール

phantomjsのインストール

$ sudo npm -g install phantomjs

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

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

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

composerのインストール
$ 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 # 各種インストール
インストール確認
$ ./bin/behat --version
behat version 3.0.8
behat3の設定

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

$ ./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のインストール先にあるので、それを使う

$ 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)

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

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

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

$ ./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
・・・

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

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

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

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

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


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が起動していない。
以下のコマンドを実行し、再度試してほしい。

$ sh ./bin/run-phantomjs.sh 
dozo
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away