PHPUnit は、PHP 言語用の単体テストフレームワークです。
PEAR を使うと、PHPUnit を簡単にインストールすることができます。
$ pear config-set auto_discover 1
$ pear install pear.phpunit.de/PHPUnit
インストール作業が終わったら、下記のように実行してみてください。
$ php -i | grep include_path
これで表示されるインクルードパスに、PHPUnit/Framework/TestCase.php などのファイルが含まれていれば、正常にインストールが完了しています。
以下のサンプルでは、内部で数値をカウントするクラス Counter を、テストコード CounterTest.php でテストしています。
<?php
class Counter {
private $count; // make it private
public function __construct() {
$this->count = 0;
}
public function getCount() {
return $this->count;
}
public function increment() {
++$this->count;
}
}
<?php
require_once 'Counter.php';
class CounterTest extends PHPUnit_Framework_TestCase {
public function testConstruct() {
$cnt = new Counter();
$this->assertSame($cnt->getCount(), 0);
}
public function testIncrement() {
$cnt = new Counter();
$cnt->increment();
$cnt->increment();
$cnt->increment();
$this->assertEquals($cnt->getCount(), 3);
}
}
テストケースとなるクラス (CounterTest) は PHPUnit_Framework_TestCase を継承し、test〜 という名前でテストメソッドを実装していきます。
テストの成功条件は、テストメソッドの中で assert〜 というメソッドを呼び出すことによって表現します(内部的に == で比較する assertEquals よりも、=== で厳密な比較を行う assertSame を使用することをオススメします)。
テストを実行するには、phpunit コマンドに、テストを実装している PHP ファイル名(テストケース名)を指定して実行します(.php は省略可能)。
$ phpunit CounterTest
PHPUnit 3.7.1 by Sebastian Bergmann.
..
Time: 0 seconds, Memory: 4.50Mb
OK (2 tests, 2 assertions)
各テストメソッド(test〜)の実行前と実行後には、それぞれ setUp() と tearDown() メソッドが呼び出されるので、各テストに共通の処理をここに記述しておくことができます。
class CounterTest extends PHPUnit_Framework_TestCase {
private $cnt;
/* Called before each test. */
public function setUp() {
$this->cnt = new Counter();
}
/* Called after each test. */
public function tearDown() {
}
...
}
上記のサンプル内で、CounterTest クラスは PHPUnit_Framework_TestCase を extends していますが、phpunit コマンドでユニットテストを実行する場合は、何も require_once する必要はありません。
phpunit コマンドは実際には PHP スクリプトですが、この内部で PHPUnit/Autoload.php をロードし、PHPUnit 関連のクラスを使用したときに、自動的に適切な PHP ファイルがロードされるように設定されています。