simpletestの導入
今更ながらに、プロジェクトにsimpletestを導入してみました。使い出してみると非常に便利、というより今まで使っていなかったことがあり得ないぐらいの印象です。手作業のテストではもう無理。
まずは、SorceForgeのsimpletestから1.0のアーカイブを落としてきてインストールです。標準のHtmlReporterでも必要なテスト結果は表示されますが、今ひとつ情報が少ない感があります。そこで、こちらのページを参考にして各テストの実行結果を表示するように変更。reporter.phpに以下の内容を追加しました。
class ShowPasses extends HtmlReporter { function ShowPasses() { $this->HtmlReporter(); } function paintPass($message) { parent::paintPass($message); print "<span class=\"pass\">Pass</span>: "; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); print implode("->",$breadcrumb); print htmlspecialchars("->$message", ENT_QUOTES)."<br />\n"; } function _getCss() { return parent::_getCss() . ' .pass { color: green; }'; } }
参照先のページの内容に加えて、htmlspecialcharsでメッセージをエスケープしています。
この状態でユニットテストを書いていきますが、simpletest自身がNoticeを発生している部分があり、Noticeを表示している環境では美しくありません。そこで、simple_test.phpを修正します。修正箇所は以下の2点です。
62| return new SimpleErrorTrappingInvoker(new SimpleInvoker($this)); ↓ 62| $obj = @new SimpleErrorTrappingInvoker(new SimpleInvoker($this)); 63| return $obj;
74| return new SimpleRunner($this, $reporter); ↓ 75| $obj = @new SimpleRunner($this, $reporter); 76| return $obj;
最初の修正で行数が増えているので、2つ目の行数表示がズレていますが、そこはよしなに。
これで快適にユニットテストが回せるようになりました。simpletestには、ブラウザでの挙動をテストするWebTestCaseクラスも用意されていますが、これもまたNoticeをポコポコ吐き出してくれます。ちょっと分量が多いので、ブラウザ挙動のテストはSeleniumでやってみようかな…
#以下、追記
simpletestが吐くNoticeですが、php4.4.0で仕様変更があり、
function &getHoge() { return new Hoge(); }
のように、参照返しの関数で直接return new 〜するとNoticeが発生するようになったみたいです。MojaviやPukiWikiでも同様の症状が出ていたようです。php5での対応状況は把握していません(最初からNoticeが発生する仕様かも)。
なので、直接return new 〜している部分を一度、インスタンスを変数として実体化した上でreturnするように変更する必要がありそうです。試しにgrepをかけてみたところ、36カ所ほど修正しないとダメみたいです。ちょっと面倒かな。
■07/01/31追記
reporter.phpのpaintPass()で$messageが長すぎた時に適当に丸める設定を追加。
if (strlen($message) > 200) $message = mb_substr($message, 0, 200).'...';
paintFail()も同様の処理をするようにオーバーロード。
function paintFail($message) { if (strlen($message) > 200) $message = mb_substr($message, 0, 200).'...'; parent::paintFail($message); }