PHP WebアプリケーションのテストにSeleniumを使う - その2:PHPからテストを実行する
前回のお話
PHP WebアプリケーションのテストにSeleniumを使う - その1:SeleniumIDE編
に引き続きSeleniumについて。今回はSelenium Serverを立てて、PHPUnitと連携させてみます。 これができるとユニットテストでは難しいMVCのコントローラのテストや、エンドツーエンドテストができて、 クラス全体の構成を大きく変えるような粒度の大きいリファクタリングを安全に行うことができるようになります。
なお、以下のオペレーションはすべてCentOS6上を想定しています。
Selenium Server
PHPUnitとSeleniumの連携については公式ドキュメント(日本語訳あり)があります。Selenium Serverのインストール方法もここに記載されています。
http://phpunit.de/manual/current/ja/selenium.html
前回のSeleniumIDEはFireFoxのアドオンでしたが、Selenium ServerはJavaで書かれたサーバプログラムで、起動するとサーバプロセスとしてシステムに常駐します。このサーバに対してテストコマンドをリクエスト(プロトコルはHTTP)すると、Selenium Serverがブラウザを立ち上げて、テストオペレーションを実行してくれる仕組みになっています。
インストールは上記のサイトに書いてあるようにselenium-server-standalone-2.xx.x.jarをダウンロードして適当なディレクトリにおくだけです。 また実行にJavaが必要です。Javaをyumでインストールする場合は以下のようにしましょう。
# yum install java-1.7.0-openjdk
XvfbとFireFox
さて、Selenium Serverがテストを実行するにあたって他に次の2つが必要です。
FireFoxはテストを実行するブラウザで、XvfbはそのFireFoxをGUI環境がないサーバ上でも起動させられるようにする仮想のGUI環境というわけであります。
これらはyumによって以下のコマンドでインストールできます。
# yum install xorg-x11-server-Xvfb
# yum install firefox
XvfbとSelenium Serverを起動
XvfbとSelenium Serverはサーバプロセスなので、それぞれ起動して実行中にしておきます。
Xvfb
$ /usr/bin/Xvfb :99 -screen 0 1024x768x8
Selenium Server
$ java -jar selenium-server-standalone-2.33.0.jar -port 4444
ただ、私はサーバプロセスは/etc/init.d/
配下の起動スクリプトでコントロールしたいと考えていたので、直接上記のコマンドは叩かず、起動スクリプトを書いてそれを実行するようにしました。この場合以下のような起動方法になります。
# /etc/init.d/xvfb start
# /etc/init.d/selenium start
インストールを含めてchefのcookbookを作ったので、起動スクリプトの内容などは以下を参照してください。
PHPUnitとPHPUnit_Seleniumをインストールする
ようやくPHPの話になりました。Selenium ServerとPHPUnitを連携するため、PHPUnitとPHPUnit_Seleniumをインストールします。 これはComposerでのインストールに対応しているのでComposerを使います。
Composerについてはここで詳細な解説しませんが、PHPのモジュール管理の仕組みです。RubyでいうところのBundlerですね。
composer.json
ファイルを以下のように作成して
{
"require": {
},
"require-dev": {
"phpunit/phpunit": "3.*",
"phpunit/phpunit-selenium": ">=1.3.1"
}
}
composer install
コマンドを実行します。
$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install
これでプロジェクトのカレントディレクトリ配下のvendorディレクトリにPHPUnitとPHPUnit_Seleniumがインストールされます。
テストケースを作成する
http://phpunit.de/manual/current/ja/selenium.html
にサンプルのテストケースがあるのでそれを実行してみましょう。URLなどは適宜読み替えてください。
<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp()
{
$this->setBrowser('*firefox');
$this->setBrowserUrl('http://www.example.com/');
}
public function testTitle()
{
$this->open('http://www.example.com/');
$this->assertTitle('Example WWW Page');
}
}
実行は以下のようにコマンドを打ちます。
$ php vendor/bin/phpunit path/to/WebTest.php
Selenium Serverの標準出力(上記の起動スクリプトの場合は/var/log/selenium.log)にFireFoxの起動情報やテストコマンドが出力されて、Selenium Serverが動作していることが確認できると思います。
SeleniumIDEでテストケースを作る
上記のようなPHPをすべて手で書くのはきびしいです。 ところで前回解説したSeleniumIDEには、ブラウザ操作をSeleniumのテストケースとして記録してくれる機能がありました。 さらに以下のアドオンをFireFoxにインストールすると、この記録したテストケースを上記のようなPHPUnit用のテストケースに変換して出力することができます。
https://addons.mozilla.org/ja/firefox/addon/selenium-ide-php-formatters/
[ファイル]→[テストケースをエクスポート]→[PHP(PHPUnit)]で利用できるテストケースを出力することができます。
長くなって気力がつきたのでまた次回
次回はテスト時の初期処理、カバレッジレポートの取得などについて書こうかと思います。
気力が回復すれば書きます。たぶん。