PHPUnit2

今までテストテストと叫びつつ何度も挫折したPHPUnit2だけど、
PHPDAOを作るにあたり使ってみたら意外に使いやすいことがわかり
「こりゃ使わなそんや。」と思ったので布教活動。


1. とりあえず、PHPUnit2をインストールしてください。(自分はpearでもってきました)
1. んで、テストコードを書いてみる(これはPHPDAOで使ったものなので自分でテストするクラスが必要です。)

if (!defined("PHPUnit2_MAIN_METHOD")) {
      define("PHPUnit2_MAIN_METHOD", "test_phpdao_db::main");
}
require_once "../src/db.php";

require_once "PHPUnit2/Framework/IncompleteTestError.php";
require_once "PHPUnit2/Framework/TestCase.php";
require_once "PHPUnit2/Framework/TestSuite.php";
require_once "PHPUnit2/TextUI/TestRunner.php";

class test_phpdao_db extends PHPUnit2_Framework_TestCase {
    static $db = null;
    static $data = array( //{{{
            array(
                  'loginname'=>'loginname1',
                  'nickname'=>'nickname1',
                  'passwd'=>'pwd1',
                  'regdate'=>'2000-01-01 00:00:00',
              ),
            array(
                  'loginname'=>'loginname2',
                  'nickname'=>'nickname2',
                  'passwd'=>'pwd2',
                  'regdate'=>'2001-01-01 00:00:00',
              ),
            ); //}}}

    public static function main() { //{{{
        $suite  = new PHPUnit2_Framework_TestSuite("test_phpdao_db");
        $result = PHPUnit2_TextUI_TestRunner::run($suite);
    } //}}}

    /**
    * DBへの接続テスト
    */
    public function test_get() { //{{{
      try
      {
        $db = phpdao_db::get();
        if ($db === null)
          throw new exception('phpdao_db::get()');

        if( $db !== phpdao_db::get() )
          throw new exception('phpdao_db::get()');

      }catch(exception $e)
      {
        throw new PHPUnit2_Framework_IncompleteTestError;
      }
    } //}}}
    ......(略)....
}

1. エラーがない場合

kasuya@proc:~/phpdao/trunk/test$ php db.php
PHPUnit 2.3.6 by Sebastian Bergmann.

....

Time: 0.014552

OK (4 tests)

1. phpdao_db::fetch_all_row() でfalseを返した(故意にエラーを入れた)場合

kasuya@proc:~/phpdao/trunk/test$ !p
php db.php
PHPUnit 2.3.6 by Sebastian Bergmann.

...I

Time: 0.014988
There was 1 incomplete test case:
1) test_fetch_all_row(test_phpdao_db)
phpdao_db::getch_all_row()
/home/kasuya/phpdao/trunk/test/db.php:31
/home/kasuya/phpdao/trunk/test/db.php:118

OK, but incomplete test cases!!!
Tests run: 4, Incomplete Tests: 1.

1. エラー発生した場所が表示されます。

使ってみた感想だけど、やっぱり変更後のテストがコマンドライン一回だけで全部確認できるのはいいなぁ。

PHPDAOでは下のようなシェルスクリプトを書いて、DBの初期化と、すべてのテストを行っています。

kasuya@proc:~/phpdao/trunk/bin$ cat test.sh
#!/bin/bash
cd ../test/
mysql phpdaotest < ./sql/db.sql # db 初期化
x=`find . -type f -name '*.php'`
for i in $x ;
do
  echo ------------- Process:$i -------------
  php $i
  if [ $? -ne 0 ];
  then
    echo Error:$i
    exit 1
  fi
done