since 2012-02-07
PHP で使えるテストフレームワーク。
Selenium を組み合わせるとブラウザーの自動操縦によるテストができる。
http://www.phpunit.de/manual/3.6/ja/installation.html
ここでは MacPorts の pear を使う。
$ which pear /opt/local/bin/pear
過去に別の方法で環境を作ったので ~/.pearrc をいったん消す。
$ sudo pear channel-discover pear.phpunit.de $ sudo pear channel-discover pear.symfony-project.com $ sudo pear install --alldeps pear.phpunit.de/PHPUnit $ sudo pear install --alldeps pear.phpunit.de/DbUnit
インストールされたコマンド:
$ which phpunit /opt/local/bin/phpunit $ which dbunit /opt/local/bin/dbunit
dbtest はよくわからない。。
since 2012-02-13
http://www.phpunit.de/manual/3.6/ja/selenium.html#selenium.seleniumtestcase
サーバーはここから http://seleniumhq.org/download/ ダウンロードして
$ cat /opt/selenium/run.sh java -jar /opt/selenium/selenium-server-standalone-2.19.0.jar $ /opt/selenium/run.sh
のようにインストールしてバックグラウンドで実行。
クライアントを入れる。
$ sudo port install php5-curl $ sudo pear install pear.phpunit.de/PHPUnit_Selenium (omitted) install ok: channel://pear.phpunit.de/PHPUnit_Selenium-1.2.1
<?php require_once 'PHPUnit/Extensions/SeleniumTestCase.php'; define('SITE_URL', 'http://localhost/project/index_dev.php'); class MySeleniumTest extends PHPUnit_Extensions_SeleniumTestCase { protected function setUp() { $this->setBrowser('*firefox'); $this->setBrowserUrl(SITE_URL); } public function testTitle() { $this->open(SITE_URL); // $this->assertTitleEquals('ログイン'); // $this->assertEquals($this->getTitle(), 'ログイン'); $this->assertTitle('ログイン'); } } ?>
phpunit MySeleniumTest
でブラウザが自動的に起動し、テストが動く。
PHPUnit ドキュメントに書かれていた例は assertTitleEquals メソッドがないと怒られたので
$this->assertEquals($this->getTitle() ...
に直したのだが、
assertTitle()
でよいことがわかった。ドキュメントのバージョンを確認すること。。
less /opt/local/lib/php/PHPUnit/Extensions/SeleniumTestCase.php
でコメントを見れば使えそうなメソッドは確認できるが assertTitle はない。 getTitle から動的に生成しているのだろうか。。
http://mindia.jp/book/akkun/keyword/Selenium
ログインのテストをする例:
public function testLogin() { $this->open(SITE_URL; $this->assertTitle('ログイン'); $this->type('name=user_name', 'user'); $this->type('name=password', 'pass'); $this->click('id=loginButton'); $this->waitForPageToLoad('10000'); $this->assertTitle('アカウント'); }
あとで気づいたが clickAndWait というメソッドがある。
テストが落ちたときにキャプチャーを撮る。クラスの最初に書いておく:
protected $captureScreenshotOnFailure = TRUE; protected $screenshotPath = '/opt/local/www/screenshots'; protected $screenshotUrl = 'http://localhost/screenshots';
/opt/local/www/screenshots は事前に sudo chmod 755 しておく。
テキストボックスに値が type されたかどうかを確認:
$this->assertValue('name=user_name', 'user1');
submit した先の画面にその文字列がある(ない)ことを確認:
$this->assertElementContainsText('id=confirmation', 'user1'); $this->assertElementNotContainsText('id=confirmation', 'pass1');