例外発生のテスト
特定の処理で想定している例外発生をテストする場合にはsetExpectedExceptionメソッドを使います。
発生した例外をsetExpectedExceptionメソッドに渡すことで例外が発生していることを判断します。
メソッド | 概要 |
setExpectedException(例外名) | テストの中で起こると思われる例外を指定 |
例外発生のテストを行うため、以下のようにUtil.php内のgetGoogleMapAddressメソッドに渡された緯度もしくは経度がnullだった場合に例外を発生させる処理を加えます。
function getGoogleMapAddress($lat,$lon){ if(is_null($lat) || is_null($lon)){ throw new Exception(); }
UtilTest.php内のforTestGetGoogleMapAddressメソッドに例外を発生させる緯度経度がnullで期待値がExceptionのデータを追加し、testGetGoogleMapAddressメソッドで渡された期待値がExceptionだった場合の処理を追加しています。
public static function forTestGetGoogleMapAddress(){ return array( array('35.658611', '139.745556', '東京都港区芝公園4丁目2-8'), array('35.696233', '139.570431', '東京都三鷹市下連雀1丁目1-83'), array('35.714731', '139.796756', '東京都台東区浅草2丁目3-1'), array('', '', new Exception()), ); } /** * @dataProvider forTestGetGoogleMapAddress */ public function testGetGoogleMapAddress($lat, $lon, $expected){ if($expected instanceof Exception) { $this->setExpectedException(get_class($expected)); } $address = $this->object->getGoogleMapAddress($lat, $lon); $this->assertEquals($expected, $address['pref'] . $address['city'] . $address['town'] . $address['detail']); }
testGetGoogleMapAddressメソッド内で渡された期待値が例外だった場合にはsetExpectedExceptionメソッドで例外が発生していることをテストします。
# phpunit UtilTest.php PHPUnit 3.4.13 by Sebastian Bergmann. .... Time: 1 second, Memory: 4.25Mb OK (4 tests, 5 assertions)
テストの中で例外が発生してもエラー(FAILURES! )とならずにテストが終了していることを確認できます。
setExpectedExceptionメソッドが1回実行されるとassertionsが1加算されます。
そのため「4 tests, 5 assertions」と表示されています。
コードカバレッジ解析
PHPUnitにはコードカバレッジ解析というコードのどの部分がテストされたかを解析する機能があります。
この機能を使って解析結果をHTMLに出力し、ブラウザからコードのテストされた部分を確認することができます。
以下のコマンドでUtilTest.phpのコードカバレッジ解析結果を出力します。
phpunit --coverage-html ./result UtilTest.php
ディレクトリ「result」内にコードカバレッジ解析結果がHTMLで出力されています。
Util.php.htmlにアクセスしてみると以下のように表示されます。
Util.phpのテストで実行されたメソッド、コードの部分が一目で分かるようになっています。
まとめ
PHPでのシステム開発では、オブジェクト指向に基づくフレームワークの利用が一般化してきており、部品単位でのコーディングが多くなっていると思われます。
そのため、これまで以上に単体テストでのチェックがシステム全体の出来具合において重要になっていると考えられます。
PHPUnitを利用すると単体テストが容易に行えるだけでなく、速く効率的に行うことができるでしょう。