<更新記録>
2008年 5月 30日
執筆

姉妹サイトから検索 Web検索

SWT - JavaでGUIプログラミング
きままにインデックス
JavaScriptノート
ゴルフ道具研究所

PHPUnitのテスト作成と実行

PHPUnitをインストールしたら、早速使ってみます。

テストを作成する

まず、テスト対象のファイル「ArrayTest.php」を作成します。
(本家ページより抜粋)

ArrayTest.php
<?php
require_once 'PHPUnit/Framework.php';
 
class ArrayTest extends PHPUnit_Framework_TestCase
{
    public function testNewArrayIsEmpty()
    {
        // Create the Array fixture.
        $fixture = array();
 
        // Assert that the size of the Array fixture is 0.
        $this->assertEquals(0, sizeof($fixture));
    }
 
    public function testArrayContainsAnElement()
    {
        // Create the Array fixture.
        $fixture = array();
 
        // Add an element to the Array fixture.
        $fixture[] = 'Element';
 
        // Assert that the size of the Array fixture is 1.
        $this->assertEquals(1, sizeof($fixture));
    }
}
?>

まず、require_onceで、PHPUnit/Framework.phpをインポートしておきます。
PHPUnit/Framework.phpは、PEARのライブラリ内に存在しているはずです。(存在しない場合は正しくインストールされていない可能性があります)

次に、テストを行うためのクラスを作成します。
この時、

  • クラス名は、ファイル名と同じでなければならない(拡張子は省く)
  • PHPUnit_Framework_TestCaseを継承する
の2つを満たす必要があります。

テストは、メソッド内に記述します。ArrayTest.phpでは、testNewArrayIsEmpty()とtestArrayContainsAnElement()がそうです。
この時、テストメソッドは

  • publicでなければならない
  • メソッド名は「test」から始まっていなければならない
等の制約を守る必要があります。

testNewArrayIsEmpty()メソッドでは、作成したての配列は、sizeofで計るサイズは0であるはずということをテストしています。

testArrayContainsAnElement()メソッドでは、要素が1つ入っている配列のサイズは1であるはずということをテストしています。

$this->assertEquals()は、継承元のPHPUnit_Framework_TestCaseのメソッドで、引数の両方が等しいことを検証するためのものです。

テストの実行

ファイルの場所にて、コマンドラインで
phpunit <テストのクラス名>
のように入力します。
クラス名を入力して実行するのは、どことなくJavaを連想させますね。 PHPUnitの仕様も、元はといえばJUnitを元に作られているからでしょうか。

C:\>phpunit ArrayTest
PHPUnit 3.2.19 by Sebastian Bergmann.

..

Time: 0 seconds


OK (2 tests)

実行すると、1行目はただの著作権表記です。
その次に「..」と表示されていますが、「.」(ピリオド)は、テストが成功したことを表しています。
テストが1つ成功するたびに1つ表示されるので、今回はtestNewArrayIsEmpty()メソッドとtestArrayContainsAnElement()メソッドの2つが成功したことを示しています。
テストが成功しなかった場合には、代わりに「F」(失敗)や「E」(エラー)、「S」(スキップされた)等が表示されます。

追記

PHPUnitのテストメソッドの制約の1つに、「testで始まるメソッド名であること」というのがありましたが、 この制約は、@testアノテーションをメソッドに付加することで無視することができます。

/**
 * @test
 */
public function myExample() {
	// メソッド名はtestから始まっていないが、アノテーションによってテストと認識される。
}

Powered by VeryEasyCMS