phpunit

since 2012-02-07

PHP で使えるテストフレームワーク。

Selenium を組み合わせるとブラウザーの自動操縦によるテストができる。

http://pear.phpunit.de/

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 はよくわからない。。

Selenium

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

でブラウザが自動的に起動し、テストが動く。

  • オプション –stop-on-failure をつけると最初の失敗でプログラムを終了する。デフォルトはすべてのテストを実行する。
  • 引数はクラス名ではなくディレクトリ名にすれば、そのディレクトリの中のすべてのテストが実行される。

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');
phpunit.txt · 最終更新: 2012/05/08 11:11 by Takuya Nishimoto
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0