オープンソースこねこね

Webプログラミングなどについてあれこれ。

PHP WebアプリケーションのテストにSeleniumを使う - その2:PHPからテストを実行する

前回のお話

PHP WebアプリケーションのテストにSeleniumを使う - その1:SeleniumIDE編

に引き続きSeleniumについて。今回はSelenium Serverを立てて、PHPUnitと連携させてみます。 これができるとユニットテストでは難しいMVCのコントローラのテストや、エンドツーエンドテストができて、 クラス全体の構成を大きく変えるような粒度の大きいリファクタリングを安全に行うことができるようになります。

なお、以下のオペレーションはすべてCentOS6上を想定しています。

Selenium Server

PHPUnitSeleniumの連携については公式ドキュメント(日本語訳あり)があります。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はそのFireFoxGUI環境がないサーバ上でも起動させられるようにする仮想の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を作ったので、起動スクリプトの内容などは以下を参照してください。

Chef cookbooks selenium

PHPUnitPHPUnit_Seleniumをインストールする

ようやくPHPの話になりました。Selenium ServerとPHPUnitを連携するため、PHPUnitPHPUnit_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ディレクトリにPHPUnitPHPUnit_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)]で利用できるテストケースを出力することができます。

長くなって気力がつきたのでまた次回

次回はテスト時の初期処理、カバレッジレポートの取得などについて書こうかと思います。

気力が回復すれば書きます。たぶん。