第1回と第2回とテスティングフレームワークの最低限あるべき部分を紹介しましたがあまりにも基本的すぎて少々退屈でした。本日は少し楽しいかもしれません。covarage(カバレッジ、網羅率)のお話です。
カバレッジってなに?
(テストした実効コード / 全体の実効コード) です。以上、説明終わり。
xdebugのインストール
lime_coverageはカバレッジの測定にxdebugを利用します。手元の環境にxdebugがインストールされているか調べてみましょう。
php -i |grep -i xdebug
インストールされていなければxdebugをpearコマンドでインストール
sudo pear install pecl/xdebug-beta
最後にCLI版のphp.ini(php-cli.php)に以下を追加します。
zend_extension="/path/to/xdebug.so" #もしくは zend_extension_ts="/path/to/xdebug.so"
php -vとして以下のようにxdebugが表示されれば成功です。
PHP 5.2.0 (cli) (built: Nov 5 2006 15:14:03) Copyright (c) 1997-2006 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies with Xdebug v2.0.0RC2-dev, Copyright (c) 2002, 2003, 2004, 2005, 2006, by Derick Rethans
サンプルプログラムの作成
lime-trialの下に sampleというディレクトリを作ってその中にdayofweek.phpというファイルをおきます。
<?php function get_dayofweek($year,$month,$day){ $time = mktime(0,0,0,$month,$day,$year); $week = date("N",$time); switch($week){ case 1: $r = "Mon"; break; case 2: $r = "Tue"; break; case 3: $r = "Wed"; break; case 4: $r = "Thu"; break; case 5: $r = "Fri"; break; case 6: $r = "Sat"; break; case 7: $r = "Sun"; break; } if($week >= 6){ $r .= " have a nice weekend"; }else{ $r .= " have a nice day"; } return $r; }
カバレッジの測定のためのサンプルなので意図的に非効率なコードを書いています。
テストの作成
get_dayofweek 関数のテストを書きます。testsディレクトリの下にdayofweek.test.phpとして下記のコードを置きました。
<?php require_once("lime/lib/lime.php"); require_once(dirname(__FILE__)."/../sample/dayofweek.php"); $t = new lime_test(null,new lime_output_color); $t->is(get_dayofweek(2006,12,13),"Wed have a nice day","13/12/2006");
本日(12/13)は水曜日なのでその曜日が正しく帰ってくるかを調べています。
テストの実行
以下のようにテストを実行するファイルをlime-trialの下にtest2.phpとして作成しました。
<?php require_once("lime/lib/lime.php"); $h = new lime_harness(new lime_output_color); $h->register("tests/dayofweek.test.php"); $h->run();
実行結果は以下のようになります。
ここまでは第2回までにやった内容ですね。
カバレッジを測定してみる
test2.phpにカバレッジを測定するコードを追加してみましょう。以下のようになります。
<?php require_once("lime/lib/lime.php"); $h = new lime_harness(new lime_output_color); $h->register("tests/dayofweek.test.php"); $h->run(); // テストの後にカバレッジを測定する $c = new lime_coverage($h); $c->base_dir = realpath(dirname(__FILE__).'/sample'); $c->register($c->base_dir.'/dayofweek.php'); $c->run();
lime_coverageをlime_harnessオブジェクトを引数に渡して構築し、に測定対象のコードをregisterすれば出来上がりです。簡単ですね。
結果は以下の通りになります。
45%ですか…もうちょっと頑張ってみましょう
<?php require_once("lime/lib/lime.php"); require_once(dirname(__FILE__)."/../sample/dayofweek.php"); $t = new lime_test(null,new lime_output_color); $t->is(get_dayofweek(2006,12,13),"Wed have a nice day","13/12/2006"); $t->is(get_dayofweek(2006,12,14),"Thu have a nice day","14/12/2006"); $t->is(get_dayofweek(2006,12,16),"Sat have a weekend","16/12/2006");
75%まであがりました!
ところでテストカバレッジはどれくらいを目指すべきでしょうか?サンプルのような小さなプログラムであればちょっとコードを書くだけでカバレッジが簡単に上昇しますが、ちょっと大きなプロジェクトになってくると50%位でも結構きついです。カバレッジを上げるコツはなるべく人間がコードを書かないようにする事、テスト対象のコードを減らす努力をすれば少ないテストですみますから。コードを減らすにはsymfonyというフレームワークがおすすめです。
さて、3回にわたってsymfonyに1.0.0から採用された新しいテスティングフレームワークをsymfony無しで試してきました。次は少し間を置いて「lime with symfony」を予定しています。

