PHPUnitの使い方。スケルトンの生成から実際の開発までを例をあげて解説

PHP Evo / PEAR hacks

PHPUnitの使い方

ProEvo / PHP Evo / PHPUnitの使いかた


1. PHPUnitとは何か?

1.1 PHPUnitとは

PHPUnitとは、XPで提唱されているテスティングフレームワークのPHP版です。XPではTDD(Test Driven Development)といってテストをつくってから、テストにパスするようにプログラミングをしていくのですが、このときにPHPUnitを使います。

今回使用するPHPUnitはPEAR版ですので、通常のPHPにはついているものと思います。 インストールしていないという人は、PHPUnitのインストールを見てインストールしてください。

2. PHPUnitを使ってみる

2.1 formCreatorをつくる

PHPUnitはあくまでもプログラムをつくるための道具です。ここでは、サンプルとしてformCreatorを作成します。
formCreatorはPHPで入力フォームを造るときに使うライブラリです。 ここでは、機能の一部であるコンボボックスの出力機能を作成します。

2.2 環境設定

ファイル名とディレクトリ構成は次のようにします。

+
+-- Test/
|        |-- formCreatorTest.php
|
+- formCreator.inc
+- alltests.php

元のソースはクラス名とおなじ"formCreator"を使いライブラリなので拡張子は.incとし、ファイル名は"formCreator.inc"となります。
テストはTestディレクトリにまとめておきます。各テストはテストするクラスのテストなので"<<元のクラス名>>Test"、つまり"formCreatorTest"となりファイル名も"formCreator.php"となります。
またテストの実行プログラムとして"alltests.php"を作成します。

2.3 スケルトンの作成

早速、プログラミングに取り掛かります。まずはテストのスケルトンを作成します。
ソースは次のようになります。

alltest.php
<?php
require_once 'PHPUnit/GUI/HTML.php';
// Test Suites
require_once 'Tests/formCreatorTest.php';

// run Test Suites
$suite = new PHPUnit_TestSuite("formCreatorTest");
$result = new PHPUnit_GUI_HTML($suite);
$result->show();
?>
Tests/formCreatorTest.php
<?php
require_once 'PHPUnit.php';
require 'formCreator.inc';

class formCreatorTest extends PHPUnit_TestCase {
    function formCreatorTest($name)
    {
        $this->PHPUnit_TestCase($name);
    }

    function setUp()
    {
    }

    function tearDown()
    {
    }

    function testSetup()
    {
        $this->fail("no implementation");
    }
}
?>
	
同様にformCreator.incも作成します。 これは、次のようになります。
formCreator.inc
<?php

?>

早速テストを実行してみましょう。 画面は次のようになります。
[PHPUnit 実行結果]

まだテストは実行されていません。チェックボックスにチェックを入れてテストを実行してみます。
結果は、次のようになります。
[PHPUnit 実行結果]

橙色のバーはテストが失敗していることを示しています。
そして、失敗したテストケース(メソッド名)と失敗したときのメッセージが表示されています。 これを参考にコーディングを行い、プログラムを作成します。

3. クラスを作成する

3.1 初期化テストを作成する

早速プログラムを作成します。まずは、テストするクラスである"formCreator.inc"をつくるところから。
次のようにテストを作成します。

Tests/formCreatorTest.php
<?php
require_once 'PHPUnit.php';
require_once 'formCreator.inc';

class formCreatorTest extends PHPUnit_TestCase {
    var $form;

    function formCreatorTest($name)
    {
        $this->PHPUnit_TestCase($name);
    }

    function setUp()
    {
        $this->form = new formCreator();
    }

    function tearDown()
    {
    }

    function testSetup()
    {
        $this->assertEquals("formcreator", get_class($this->form));
    }
}
?>

テストを実行します。結果は次のようになります。

クラスが作成されていないためFatal errorが発生します。
ここで、テストが失敗することを確認します。

3.2 クラスを作成する

実際のformCreator.incを作成します。
ソースは次のようになります。

formCreator.inc
<?php
class formCreator {
}
?>

テストを実行します。
結果は、次のようになります。

上記のように緑のバーだけになれば、正常です。

4. メソッドをつくる

4.1 メソッドのインターフェースを決める

メソッド名と引数、リターン値を決めます。
コンボボックスを作成するメソッドなので"makeCombobox"

メソッドの形式は
makeCombobox(<項目名>, <項目一覧>)
とします。

4.2 テストケースを書く

メソッドが決まったので、メソッドを実装するためのテストケースを書きます。
項目名がnullの場合はリターン値はnullが返るものとします。
この場合はテストケースは次のようになります。

Tests/formCreatorTest.php
    function testMakeCombobox()
    {
        $output = $this->form->makeCombobox(null, null);
        $this->assertNull($output, "項目名:null");
    }

テストを実行します。結果は、つぎのようになります。

4.2 メソッドを実装する

4.1で規定したメソッドを実装します。 ソースは次のようになります。

formCreator.inc
    function makeCombobox($item, $values)
    {
        return null;
    }

実行結果は次のようになります。

4.3 項目名を指定したときの処理

項目名を設定した場合の処理を追加します。
まずは選択すべきアイテムがない場合を考えます。ここではnullが返って来るとします。

これにあわせてテストを追加します。
ソースは次のようになります。

Tests/formCreatorTest.php
    function testMakeCombobox()
    {
        $output = $this->form->makeCombobox(null, null);
        $this->assertNull($output, "項目名:null");
        $output = $this->form->makeCombobox('fruits', null);
        $this->assertNull($output, "項目名:null");
    }

テストを実行します。
結果は次のようになります。

ここではグリーンのバーだけなので、実装はせずに次にすすみます。

4.4 項目名を指定したときの処理

どうようにメニューを設定したときの処理を追加します。
メニューは連想配列で指定します。
パラメータはこんな感じになります。

$values = array(
  "1" => "りんご",
  "2" => "みかん",
  "3" => "パイナップル",
);

これからできるソースは次のようになります。

<select name="fruits">
  <option>---</option>
  <option value="1">りんご</option>
  <option value="2">みかん</option>
  <option value="3">パイナップル</option>
</select>

実際のフォームは次のとおりです。

上記のソースが返ってくるようにテストを追加します。
ソースは次のようになります。

Tests/formCreatorTest.php
        $item="fruits";
        $values = array(
            "1" => "りんご",
            "2" => "みかん",
            "3" => "パイナップル",
        );
        $output_org = '<option name="fruits">
  <select>---</select>
  <select value="1">りんご</sleect>
  <select value="2">みかん</sleect>
  <select value="3">パイナップル</sleect>
</option>
';
        $output = $this->form->makeCombobox($item, $values);
        $this->assertEquals($output_org, $output, "with item & values\n");

テストを実行します。

上記のようにテストに失敗していれば正常です。

4.5 項目名の処理を実装する

上記のテストでエラーが出ないようにソースを修正します。
修正したソースは次のようになります。

formCreator.inc
    function makeCombobox($item, $values)
    {
        if ($item=='' || $values=='')    return null;
        $output = "<select ";
        $output .= "name=\"" .  htmlspecialchars($item) ."\">\n";
        $output .= "  <option>---</option>\n";
        foreach ($values as $k => $v) {
            $output .= "  <option value=\"" . htmlspecialchars($k) . "\">";
            $output .= htmlspecialchars($v);
            $output .= "</option>\n";
        }
        $output .= "</select>\n";
        return $output;
    }

実行結果は、次のようになります。
[PHPUnit 実行結果]
上記のようにグリーンのバーになればソースの修正は終了です。

4.6 値つきの場合の処理

次に値が設定されているときの処理を追加します。
4.4と同様に、まずは正常なときのソースを作成します。
ソースは次のようになります。

<select name="fruits">
  <option>---</option>
  <option value="1">りんご</option>
  <option value="2" selected>みかん</option>
  <option value="3">パイナップル</option>
</select>

実際のフォームは次のとおりです。

上記のソースが返ってくるようにテストを作成します。
テストは次のようになります。

Tests/formCreatorTest.php
 .
 .
 .
        $output_org = '<select name="fruits">
  <option>---</option>
  <option value="1">りんご</option>
  <option value="2" selected>みかん</option>
  <option value="3">パイナップル</option>
</select>
';
        $output = $this->form->makeCombobox($item, $values, 2);
        $this->assertEquals($output_org, $output, "with default\n");

実行結果は次のようになります。
[PHPUnitの実行結果]
上記のようにエラーが出ていれば正常です。

4.7 デフォルト値の処理を実装する

4.6で指定したソースを出力するようにソースを修正します。
修正後のソースは次のようになります。

formCreator.inc
    function makeCombobox($item, $values, $default=null)
    {
        if ($item=='' || $values=='')    return null;
        $output = "<select ";
        $output .= "name=\"" .  htmlspecialchars($item) ."\">\n";
        $output .= "  <option>---</option>\n";
        foreach ($values as $k => $v) {
            if ($k == $default) $selected = ' selected';
            else                $selected = '';
            $output .= "  <option value=\"" . htmlspecialchars($k) . "\"" . $selected . ">";
            $output .= htmlspecialchars($v);
            $output .= "</option>\n";
        }
        $output .= "</select>\n";
        return $output;
    }

テストの実行結果は次のようになります。
[PHPUnitの実行結果]
このようにグリーンのバーになれば修正は完了です。

以上で、メソッドの作成は終了です。
このようにしてPHPUnitを使用して開発します。


$Revision: 2 $
Last Update: $Date: 2007-02-28 23:35:40 +0900 (豌エ, 28 2譛 2007) $