[Play!][CakePHP]Selenium周りを整備する


Seleniumに関しては、前々からちょこちょこと意識していたものの、本格的に使っていこうと思い出したのはPlayFrameworkを使い始めてから。

Seleniumが完全に統合されており、かっこよすぎる

というのも、PlayFrameworkではデフォルトでSeleniumによるテスト環境が整備されており、ちょちょいのちょいで始める事が出来る。この偉大な環境に僕は心酔し、Seleniumの世界へのめりこむこととなった。僕は元々フロント周りに強い人であったので、フロント周りのテストにも強い人として更なるパワーアップに期待したいところである。

ということで、PlayFrameworkに関して言えば、インストール時に既にSelenium周りが整備されているので言う事はない。

問題はもう1つの溺愛フレームワークであるCakePHPのほうだ。
CakePHPは、現実案件が1.3系で進んでいることもあり、1.3ベースでの整備を考えていきたい。

ググった限りではSeleniumを使ったSimpleTestの話題はあまり存在せず、PHPUnitベースのものが普及しているようだった。
CakePHPは2.0からPHPUnitベースのテストとなるので、このあたりでPlayFrameworkのようなエレガントなユニットからWebテストまでをオートテスティングできるような統合がされて欲しいと思っている(っていうかもうされている?よく追えてない)

さて、CakePHPでSeleniumという場合、

http://cakebaker.42dh.com/downloads/

にて、Selenium Helperとかそういうものが配布されており、これに関する言及もいろいろなところでされているが、いかんせんネタ自体が2006年や2007年のものが多くて不安になる。

CakePHPに限らずSeleniumをPHP環境で使う場合は、Selenium IDEを使ったHTMLベースのテストをすると、何の障害もなく進む。

そうではないPHPUnitを使った場合でも、まずSelenium RCサーバーをセットアップして起動を行い(Selenium RCのセットアップはググるといろいろ出てくるので割愛)、

$ java -jar ~/selenium/selenium-server-standalone-2.11.0.jar

コマンド上からPHPUnitを起動する(PHPUnitのセットアップはググるといろいろ出てくるので割愛)ことで、実現ができる。

$ phpunit --verbose /var/www/htdocs/hoge/app/tests/selenium/myapp.php

上記のPHPコードは、こんな感じだ。

<?php
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
class WebTest extends PHPUnit_Extensions_SeleniumTestCase {
    protected function setUp() {
        $this->setBrowser('*firefox');
        $this->setBrowserUrl('http://localhost:8808/');
    }

    public function testText() {
        $this->open('http://localhost:8808/users/');
        $this->assertElementContainsText('id=content', 'Hello');
    }
}
?>

このコードで行っていることは、通常のSeleniumのテストのコマンドライン版である下記

$ java -jar ~/selenium/selenium-server-standalone-2.11.0.jar -htmlSuite "*firefox" "http://localhost:8808/" "/var/www/htdocs/selenium_sample/app/tests/selenium/myapp.html" "/Applications/MAMP/htdocs/selenium_sample/app/tests/selenium/myapp_result.html"

の引数などをPHPから扱えるインターフェースにして、テストスイートを書く必要がなく、簡潔なコードでアサーションを書けるということである。

これをCakePHPに組み込む場合、まずテストケースをCakePHPのテスト関係が入っているフォルダに入れるというのが考えられる。続けて行う事としては、他のテストが実行される段階で同時に上記コマンドを実行するようにしてテストを走らせるか、もしくはクラスを使ってテストケース内で実行することにするかということになる。

個人的には、コマンドラインから走らせて結果がわかるというだけでも十分いいんだけどね。
PlayFrameworkのエレガントさを見てしまうと、CakePHPでもああいう感じで一気貫通で行いたいとか思ってしまったりなのだ。

※OSXでSelenium RCを動かしていると、Seleniumを終了させた後でサーバーであるJettyが終わらずに残ってしまうことがあり、ここはちょっと困ったなあという感じ。

Comments are closed.