ここ数日 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 したりして、ほんのちょびっとだけど、プロジェクトへの貢献ができたことで更に自己満足(笑)