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
<?php ?>
早速テストを実行してみましょう。
画面は次のようになります。
![[PHPUnit 実行結果]](images/phpunit_howto-01.jpg)
まだテストは実行されていません。チェックボックスにチェックを入れてテストを実行してみます。
結果は、次のようになります。
橙色のバーはテストが失敗していることを示しています。
そして、失敗したテストケース(メソッド名)と失敗したときのメッセージが表示されています。
これを参考にコーディングを行い、プログラムを作成します。
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 実行結果]](images/phpunit_howto-09.jpg)
上記のようにグリーンのバーになればソースの修正は終了です。
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の実行結果]](images/phpunit_howto-10.jpg)
上記のようにエラーが出ていれば正常です。
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の実行結果]](images/phpunit_howto-11.jpg)
このようにグリーンのバーになれば修正は完了です。
以上で、メソッドの作成は終了です。
このようにしてPHPUnitを使用して開発します。