Prev Next

第18章 PHPUnit と Selenium

Selenium RC

Selenium RC はテストツールのひとつです。これを使用すると、 ウェブアプリケーションのユーザインターフェイスについてのテストを自動化することができます。 あらゆるプログラミング言語で稼動しているウェブサイトに対応しており、 現在主流のあらゆるブラウザで使用することができます。Selenium RC は Selenium Core を使用しています。これは、ブラウザ上でのタスクを自動的に実行する JavaScript のライブラリです。Selenium でのテストは、 一般のユーザが使用するのと同じようにブラウザ上で直接実行されます。 主な使用例としては、受け入れテスト (各システム単体のテストではなく、結合されたシステム全体に対するテスト) や ブラウザの互換性のテスト (ウェブアプリケーションを、さまざまなオペレーティングシステムやブラウザでテストする) などがあります。

Selenium RC のインストール手順は、次のようになります。

  1. Selenium RC の配布アーカイブをダウンロードする。
  2. アーカイブを展開し、server/selenium-server.jar/usr/local/bin などにコピーする。
  3. java -jar /usr/local/bin/selenium-server.jar などのようにして Selenium RC サーバを起動する。

これで、クライアント/サーバ プロトコルを用いて Selenium RC サーバにコマンドを送信できるようになりました。

PHPUnit_Extensions_SeleniumTestCase

PHPUnit_Extensions_SeleniumTestCase は、Selenium RC と通信するための クライアント/サーバ プロトコルを実装したものです。 また、ウェブのテスト用に特化したアサーションメソッドも提供します。

例 18.1 は、 ウェブサイト http://www.example.com/<title> 要素の内容をテストする方法を示したものです。

例 18.1: PHPUnit_Extensions_SeleniumTestCase の使用例

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp()
{
$this->setBrowser('*firefox /usr/lib/firefox/firefox-bin');
$this->setBrowserUrl('http://www.example.com/');
}

public function testTitle()
{
$this->open('http://www.example.com/');
$this->assertTitleEquals('Example Web Page');
}
}
?>

PHPUnit_Framework_TestCase クラスとは異なり、 PHPUnit_Extensions_SeleniumTestCase を継承したテストケースクラスは setUp() メソッドが必須となります。 このメソッド内で、Selenium RC セッションの設定を行います。 ここで使用できるメソッドの一覧は 表 18.1 を参照ください。

表18.1 Selenium RC API: セットアップ

メソッド 意味
void setBrowser(string $browser) Selenium RC サーバが使用するブラウザを設定します。
void setBrowserUrl(string $browserUrl) テストするベース URL を設定します。
void setHost(string $host) Selenium RC サーバに接続する際のホスト名を設定します。
void setPort(int $port) Selenium RC サーバに接続する際のポートを設定します。
void setTimeout(int $timeout) Selenium RC サーバに接続する際のタイムアウト値を設定します。
void setSleep(int $seconds) Selenium RC クライアントが、Selenium RC サーバにアクションコマンドを送信してから待機する秒数を設定します。

複数のブラウザを使用してテストを行なうこともできます。この場合は、 setBrowser() でブラウザの設定を行うかわりに、 テストケースクラスの中で $browsers という名前の public static な配列を作成します。 この配列の各項目が個々のブラウザの設定を表します。 これらのブラウザは、それぞれ別の Selenium RC サーバで管理することができます。

例 18.2: 複数のブラウザの設定管理

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class WebTest extends PHPUnit_Extensions_SeleniumTestCase
{
public static $browsers = array(
array(
'name' => 'Firefox on Linux',
'browser' => '*firefox /usr/lib/firefox/firefox-bin',
'host' => 'my.linux.box',
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Safari on MacOS X',
'browser' => '*safari',
'host' => 'my.macosx.box',
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Safari on Windows XP',
'browser' => '*custom C:\Program Files\Safari\Safari.exe -url',
'host' => 'my.windowsxp.box',
'port' => 4444,
'timeout' => 30000,
),
array(
'name' => 'Internet Explorer on Windows XP',
'browser' => '*iexplore',
'host' => 'my.windowsxp.box',
'port' => 4444,
'timeout' => 30000,
)
);

protected function setUp()
{
$this->setBrowserUrl('http://www.example.com/');
}

public function testTitle()
{
$this->open('http://www.example.com/');
$this->assertTitleEquals('Example Web Page');
}
}
?>

PHPUnit_Extensions_SeleniumTestCase を使用すると、 Selenium で実行したテストのカバレッジ情報を収集することができます。

  1. PHPUnit/Extensions/SeleniumTestCase/phpunit_coverage.php をウェブサーバのドキュメントルートディレクトリにコピーします。
  2. ウェブサーバ上の php.ini ファイルで、PHPUnit/Extensions/SeleniumTestCase/prepend.phpPHPUnit/Extensions/SeleniumTestCase/append.php をそれぞれ auto_prepend_file および auto_append_file に設定します。
  3. PHPUnit_Extensions_SeleniumTestCase を継承したテストケースクラスで、
    protected $coverageScriptUrl = 'http://host/phpunit_coverage.php';
    
    のようにして phpunit_coverage.php スクリプトの URL を指定します。

表 18.2 は、PHPUnit_Extensions_SeleniumTestCase が提供するさまざまなアサーションメソッドの一覧です。

表18.2 アサーション

アサーション 意味
void assertAlertPresent() alert が発生していない場合にエラーを報告します。
void assertNoAlertPresent() alert が発生している場合にエラーを報告します。
void assertChecked(string $locator) $locator で表される要素がチェックされていない場合にエラーを報告します。
void assertNotChecked(string $locator) $locator で表される要素がチェックされている場合にエラーを報告します。
void assertConfirmationPresent() 確認ダイアログが表示されていない場合にエラーを報告します。
void assertNoConfirmationPresent() 確認ダイアログが表示されている場合にエラーを報告します。
void assertEditable(string $locator) $locator で表される要素が編集可能でない場合にエラーを報告します。
void assertNotEditable(string $locator) $locator で表される要素が編集可能な場合にエラーを報告します。
void assertElementValueEquals(string $locator, string $text) $locator で表される要素の値が $text と異なる場合にエラーを報告します。
void assertElementValueNotEquals(string $locator, string $text) $locator で表される要素の値が $text と等しい場合にエラーを報告します。
void assertElementContainsText(string $locator, string $text) $locator で表される要素が $text を含まない場合にエラーを報告します。
void assertElementNotContainsText(string $locator, string $text) $locator で表される要素が $text を含む場合にエラーを報告します。
void assertElementPresent(string $locator) $locator で表される要素が存在しない場合にエラーを報告します。
void assertElementNotPresent(string $locator) $locator で表される要素が存在する場合にエラーを報告します。
void assertLocationEquals(string $location) 現在の位置が $location と異なる場合にエラーを報告します。
void assertLocationNotEquals(string $location) 現在の位置が $location と等しい場合にエラーを報告します。
void assertPromptPresent() プロンプトが表示されていない場合にエラーを報告します。
void assertNoPromptPresent() プロンプトが表示されている場合にエラーを報告します。
void assertSelectHasOption(string $selectLocator, string $option) 指定したオプションが使用できない場合にエラーを報告します。
void assertSelectNotHasOption(string $selectLocator, string $option) 指定したオプションが使用できる場合にエラーを報告します。
void assertSelected($selectLocator, $option) 指定したラベルが選択されていない場合にエラーを報告します。
void assertNotSelected($selectLocator, $option) 指定したラベルが選択されている場合にエラーを報告します。
void assertIsSelected(string $selectLocator, string $value) 指定した値が選択されていない場合にエラーを報告します。
void assertIsNotSelected(string $selectLocator, string $value) 指定した値が選択されている場合にエラーを報告します。
void assertSomethingSelected(string $selectLocator) $selectLocator で表される項目が選択されていない場合にエラーを報告します。
void assertNothingSelected(string $selectLocator) $selectLocator で表される項目が選択されている場合にエラーを報告します。
void assertTextPresent(string $pattern) 指定したパターン $pattern が存在しない場合にエラーを報告します。
void assertTextNotPresent(string $pattern) 指定したパターン $pattern が存在する場合にエラーを報告します。
void assertTitleEquals(string $title) 現在のタイトルが $title と異なる場合にエラーを報告します。
void assertTitleNotEquals(string $title) 現在のタイトルが $title と等しい場合にエラーを報告します。
void assertVisible(string $locator) $locator で表される要素が不可視な場合にエラーを報告します。
void assertNotVisible(string $locator) $locator で表される要素が可視の場合にエラーを報告します。

表 18.3 は、 PHPUnit_Extensions_SeleniumTestCase の 2 つのテンプレートメソッドをまとめたものです。

表18.3 テンプレートメソッド

メソッド 意味
void defaultAssertions() テストケース内のすべてのテストで共有するアサーションを上書きします。 このメソッドは、Selenium RC サーバにコマンドが送信されるたびに (送信された後に) コールされます。
void sharedAssertions() テストケース内のすべてのテストで共有するアサーションを上書きします。 このメソッドは、テストが終了する直前にコールされます。

使用できるコマンドのリファレンスや実際の使用法については Selenium のドキュメント を参照ください。

runSelenese($filename) メソッドを使用すると、 Selenese/HTML の設定から Selenium のテストを実行することができます。 さらに、静的属性 $seleneseDirectory を使用すると、 Selenese/HTML ファイルを含むディレクトリから自動的にテストオブジェクトを作成することができます。 指定したディレクトリ配下を再帰的に走査し、 .htm ファイルを探します。このファイルには Selenese/HTML が含まれているものとします。例として 例 18.3 を参照ください。

例 18.3: Selenese/HTML ファイルのディレクトリをテストとして使用する

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class SeleneseTests extends PHPUnit_Extensions_SeleniumTestCase
{
public static $seleneseDirectory = '/path/to/files';
}
?>

Prev Next
1. 自動テスト
2. PHPUnit の目標
3. PHPUnit のインストール
4. PHPUnit 用のテストの書き方
データプロバイダ
例外のテスト
PHP のエラーのテスト
5. コマンドラインのテストランナー
6. Fixtures
tearDown() よりも setUp()
バリエーション
Fixture の共有
7. テストの構成
スイートレベルのセットアップ
8. テストケースの拡張
出力内容のテスト
パフォーマンス低下のテスト
9. データベースのテスト
データセット
Flat XML データセット
XML データセット
操作
データベースのテストのコツ
10. 不完全なテスト・テストの省略
不完全なテスト
テストの省略
11. モックオブジェクト
自己シャント
スタブ
12. テストの進め方
開発中のテスト
デバッグ中のテスト
13. テストファーストプログラミング
銀行口座の例
14. コードカバレッジ解析
カバーするメソッドの指定
コードブロックの無視
ファイルのインクルードや除外
15. テストのその他の使用法
アジャイルな文書作成
複数チームでのテスト
16. ログ出力
XML 形式
コードカバレッジ (XML)
JavaScript Object Notation (JSON)
Test Anything Protocol (TAP)
GraphViz マークアップ
テストデータベース
17. 雛形ジェネレータ
アノテーション
18. PHPUnit と Selenium
Selenium RC
PHPUnit_Extensions_SeleniumTestCase
19. 継続的インテグレーション
CruiseControl
phpUnderControl
Apache Maven
20. PHPUnit の実装
21. PHPUnit API
概要
PHPUnit_Framework_Assert
PHPUnit_Framework_Test
PHPUnit_Framework_TestCase
PHPUnit_Framework_TestSuite
PHPUnit_Framework_TestResult
パッケージの構成
22. PHPUnit の拡張
PHPUnit_Framework_TestCase のサブクラスの作成
アサートクラスの作成
PHPUnit_Extensions_TestDecorator のサブクラスの作成
PHPUnit_Framework_Test の実装
PHPUnit_Framework_TestResult のサブクラスの作成
PHPUnit_Framework_TestListener の実装
新しいテストランナーの作成
A. アサーション
B. XML 設定ファイル
テストスイート
グループ
コードカバレッジ対象のファイルの追加や除外
ログ出力
PMD ルール
PHP INI 項目やグローバル変数の設定
C. PHP 4 用の PHPUnit
D. 目次
E. 参考文献
F. 著作権