WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [PHP] PHPUnitで全てのテスト終了後に処理を実行

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

最近アジャイル開発の勉強をしていて、テストファーストを実践してみたらとてつもなく開発しやすく、はまってます。PHPではPHPUnitというテスティングフレームワークがあって、定番のようなのでそれを使ってみました。

PHPUnitで全てのテスト終了時に使用メモリ(あんまり当てにならないけど)とミリ秒単位までの実行時間(デフォルトで秒数は出ます)を表示したくて色々いじってみたのですがなかなかうまくいかなかったので書いておきます。

PHPUnitではPHPUnit_Framework_TestSuiteのなかに複数のテストを登録して連続実行できます。これはCompositeパターンになっていて入れ子にできます。一番端の葉の部分がPHPUnit_Framework_TestCaseでそこに実際のテストコードを書きます。

ベンチを取るには一番最初と一番最後に処理を挿入する必要があるのでPHPUnit_Framework_TestSuiteを拡張したいのですが、デフォルトのコマンドラインからの実行


phpunit --colors TestName
ではPHPUnit_Framework_TestSuiteの代替クラスを指定できないようです。

最初に入れるのは簡単ですが、最後に何かを実行するのが困りました。コマンドを実装するのも考えましたが、デフォルトのコマンドラインからのテストでは、テスト終了時はexitで抜けてるのでregister_shutdown_functionを使えば簡単に最後に処理を入れることができました。


class Sdx_Test_Case extends PHPUnit_Framework_TestCase
{
/**
* @var Sd_Util_Bench
*/
protected static $_bench;
protected function setUp()
{
if(empty(self::$_bench))
{
self::$_bench = new Sd_Util_Bench();
register_shutdown_function(array($this, 'echoBench'));
}
}

public function echoBench()
{
echo 'Memory: '.self::$_bench->getMemory().PHP_EOL;
echo 'Time: '.self::$_bench->getTime().PHP_EOL;
}
}
include pathの設定や細かいところは省略してます。最初のテストがnewされる時に秒数のカウントが始まりスクリプト終了時に出力します。Sd_Util_Benchは独自クラスですが詳細は省略します。new時に現在時刻のミリ秒タイムスタンプを記録しておいて、最後にまた引いてるだけです。

テストをnewするたびにifが評価されるので実装としてはスマートではありませんが、この秒数は相対的に見ることが殆どだと思いますので、目を瞑ることにしました。

なんかもっと良い方法があったらコメントお願いします。そもそもPHPUnit_Framework_TestSuiteをさくっと取り替えればもっとスマートにいけそうです。

スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。