Old/Zend Studio/6
PHPUnitテスト
PHPクラスの作成で作成したクラス businessPartner に対してテストメソッドを1つ実装し、実行した例を紹介します。
PHPクラスの作成 と同様に Zend Studio for Eclipse 6.1 日本語版を使用して説明します。
環境の準備
PHPUnit のライブラリを include_pathに設定する必要があります。
- PHPエクスプローラービュー上のPHPプロジェクトを右クリックし、表示されたメニューからincludeパスライブラリの設定を選びます。
- プロパティーダイアログが表示されます。
3種類表示されるタブのうち、ライブラリタブを選びます。
ライブラリタブの右側部分にある、変数追加ボタンを押します。
- PHPUNIT_HOME を選択してOkボタンを押します。
PHPUNIT_HOME は Zend Studioに同梱されたPHPUnitライブラリの場所を示す変数です。
- さらに、最初に表示されていたダイアログの右下のOKボタンを押します。
- プロジェクトのビルドが行われます。
ビルドが終了するとPHPエクスプローラー上のInclude Paths 配下に PHPUNIT_HOMEがぶら下がって表示されます。
この状態になると、PHPUnitライブラリが利用できます。
テストメソッドの実装
Unitテスト用の骨格を生成後、メソッドを1つ実装するまでの手順を説明します。
- 初めに、businessPartner クラス上で右クリックします。
表示されるメニューから新規を選び、次いでPHPUnitテストケースを選びます。
- 新規PHPUnitテストケースダイアログが表示されます。
そのダイアログ上の「テストする要素」入力欄にクラス名の businessPartner が表示されることを確認します。
このクラス名の末尾に「Test」を追加した文字列 businessPartnerTest が「テストクラス名」として表示されることを確認して、完了ボタンを押します。
- businessPartnerTest のコードが自動生成されます。
businessPartner の各メソッドごとにテスト用メソッドが生成され、各メソッド名の先頭には test がつきます。
例えば set_address メソッドに対して testSet_address メソッドが生成されます。
ただし、この状態ではまだ骨格だけです。
実際にテストすべき内容を TODO タグの箇所に記述する必要があります。
- これらのテスト用メソッドのうち、試しに testSet_address メソッドを実装します。
一例として、 set_address メソッドで設定した住所を、 get_address メソッドで取得できるかテストしましょう。
public function testSet_address() {
//TODO Auto-generated businessPartnerTest->testSet_address()
//$this->markTestIncomplete('set_address test not implemented');
$this->businessPartner->set_address('東京都渋谷区');
$this->assertEquals('東京都渋谷区',
$this->businessPartner->get_address(),
'address is different from which you specified');
}
- この例で使用した assertEquals メソッドは 第1引数と第2引数が等しい (equal)かどうかチェックします。
等しければ true、等しくなければ false を返して第3引数のメッセージをPHPUnit ビューに表示します。
この例では、get_address メソッドの返り値が、 set_address メソッドの引数に渡した「東京都渋谷区」と同じかどうかテストします。
makeTestIncomplete メソッドは不要になるのでコメントアウトします。
このメソッドは、まだテストを実装していないことを明示するためのメソッドです。
他にも数々のメソッドが用意されています。
実行の構成及び結果確認
正しく set_address 及び get_address メソッドが実装されたかテストして確認します。
- メニューから実行を選び、さらに表示されたメニューから実行構成を選びます。
- 実行構成ダイアログが表示されます。
PHP Web ページ、PHPUnit、PHPスクリプトの3つの選択肢のうち、PHPUnitを選んで右クリックし、表示されたメニューから新規を選びます。
- 実行構成の詳細画面が表示されます。
今回は、変更すべき箇所が特に無いので、そのまま適用ボタンを押し、実行ボタンを押して開始します。
XML形式のレポートが全く不要であれば、XMLレポートの生成のチェックを外しても構いません。
- PHPUnitビューが表示されます。
テストが成功すると、PHPUnitビューの右上の帯が緑色で表示されます。
ほとんどのテスト用メソッドでは makeTestIncomplete メソッドの引数に指定されたメッセージが表示されます。
しかし、testSet_address メソッドでは何もメッセージが表示されないはずです。
テストが失敗した場合は、PHPUnitビューの右上の帯が緑色の代わりに茶色で表示され、
左下の testSet_addressメソッドに×印がつきます。
さらに、assertEquals の第3引数で指定したメッセージが表示されます。
- PHPUnitビューの右側の部分にコードカバレッジが表示されます。
PHPUnitテストでコードをどれだけカバーできたか確認できます。
- コードカバレッジのカバー行の調査済、有効行、合計の項目が、それぞれ、テストでカバーできた行数、テストでカバーすべき行数、全行数を意味します。
たとえば、それぞれ 2, 10, 108 と表示された場合、businessPartner 全体の 108行のうち、カバーすべき行数は 10行で、そのうち2行をカバーできたことになります。
- コードカバレッジで太くて青く表示されている数字をクリックすると、 businessPartner のコードが色分けして表示されます。
テストを実行した行の背景は薄い青紫色で、まだ実行していない行では薄いピンク色で表示されます。
get_addressメソッド及び set_addressメソッドをカバーできたことが分かります。
全てのテストメソッドを実装し終わってから、実行すると下記のようになるでしょう。
1)コードカバレッジにて、有効行と調査済の行数が等しくなる。
2)businessPartner のコードの色分けで、背景が薄いピンク色の行が無い。
XMLデータでの出力
実行結果をXML形式で出力することもできます。
レポートの出力先は、実行構成ダイアログで環境タブを選ぶと確認できます。
ZEND_PHPUNIT_LOG_XML に指定されたパスが出力先です。
下はXMLレポートの例です。
見やすくするために改行を適宜追加しています。
Zend Studio 上での所要時間 (time) や、メッセージ、テスト失敗箇所数 (failures) などが出力されます。XXXXXとした箇所はWindowsのユーザー名が記述されている箇所です。
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite name="businessPartnerTest" tests="10"
file="C:\Documents and Settings\XXXXX\Zend\workspaces\DefaultWorkspace\unittest\businessPartnerTest.php"
line="10" failures="0" errors="0" time="0.22416400909423">
<testcase class="businessPartnerTest" name="testGet_address"
file="C:\Documents and Settings\XXXXX\Zend\workspaces\DefaultWorkspace\unittest\businessPartnerTest.php"
line="45" time="0.021947145462036">
<error type="PHPUnit_Framework_IncompleteTestError"
file="C:\Program Files\Zend\Zend Studio for Eclipse - 6.1.2\plugins\com.zend.php.phpunit_6.1.2.v20090318-1524
\resources\library\PHPUnit\Framework\Assert.php"
line="2046">
<message><![CDATA[get_address test not implemented]]></message>
<traceframes>
<traceframe file="C:\Documents and Settings\XXXXX\Zend\workspaces\DefaultWorkspace\unittest\businessPartnerTest.php"
line="46" call="PHPUnit_Framework_Assert::markTestIncomplete()"/>
</traceframes>
</error>
</testcase>