雑文発散

«前の日記(2012-03-10) 最新 次の日記(2012-03-17)» 編集
過去の日記

2012-03-14 [長年日記]

[PHP] PHPUnit_Selenium 1.2.4 では複数のブラウザでのテスト実行ができないが、HEAD では直っている

ここ数日 PHPUnit + Selenium を実践的に学んでいた。

基礎的な動作は把握できたので、複数のブラウザで回すための仕込みをしようとして、マニュアルの「第17章 PHPUnit と Selenium」の「例 17.4: 複数のブラウザの設定管理」を参考にテストケースを実装してもうまく動かなかった。

まぁ、いきなり自分のテストケースに組み込んじゃったのが失敗で、まずは基本の例から実行してみようと思って、前述の「例 17.4: 複数のブラウザの設定管理」をほぼそのままのテストケースを実行しても動かない。

マニュアル通りなら、$browsers に設定した Selenium Server に対して、それぞれ接続しにいくはず。例えば下記の例だと my.linux.box:4444 と my.macosx.box:4444 と my.windowsxp.box:4444 と my.windows.box:4444 の4つの Selenium Server へアクセスしてくれるはず。

<?php
 require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
 
 class WebTest extends PHPUnit_Extensions_SeleniumTestCase
 {
 
    public static $browsers = array(
      array(
        'name'    => 'Firefox on Linux',
        'browser' => '*firefox',
        '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,
      )
    );

ところが、PHPUnit_Selenium 1.2.4 では、どの設定も localhost:4444 へ接続しにいってしまい、リモートの Selenium Server へ接続しにいかない。

なんかおかしいなと思って、いろいろ調べていくうちに、PHPUnit_Selenium 内の SeleniumTestCase.php に不具合があるところを突き止めて、なんとか修正コードを作るところまで至った。

では、本家に修正コード投げて見ちゃう!?と思って、phpunit-selenium を fork した。

pull request を投げる前に、テストコードも書かなきゃなと思って、phpunit-selenium のテストを実行できる環境を用意。テストコードも書いてみて、まずはそのまま実行して失敗するところの確認をしたら、、、失敗しない。なぜか正常に動く。

テスココードの書き方がおかしいのか!?といろいろやっていたのだけど、結局、master ブランチの HEAD にある SeleniumTestCase.php には修正が入っていて、正しく動く状態になっていた。

世の中にいるかどうか分らないけど、PHPUnit_Selenium 1.2.4 を使っていて、複数ブラウザでの実行がうまくいかないって悩んでいる人は、GitHub から最新版の SeleniumTestCase.php を落としてきて差し替えると良いよ。

ということで、散々悩んだりしていたんだけど、そのお陰でだいぶ PHPUnit + Selenium 関係を頭の中で整理できた。今までマニュアルを一部しか読んでなくて、あやふやな部分が多かったんだけど、この機会に全部読みなおして、スッキリした。

ついでにドキュメントを読んでいて見つけた typo の修正を pull request したりして、ほんのちょびっとだけど、プロジェクトへの貢献ができたことで更に自己満足(笑)