limeでなるべく気軽にユニットテストを書く

limeというのはSymfonyフレームワークで使われてるユニットテストライブラリで、このライブラリはインストールも簡単で、実際にテストを書くのも楽なのでよく使う。
この記事ではlimeというライブラリを簡単に説明しつつ、クラスファイルにテストを埋め込むことで、より気軽にテストを書く方法を紹介する。

limeのインストール

http://svn.symfony-project.com/tools/lime/tags/RELEASE_1_0_6/lib/lime.phpからファイルを適当な場所に保存する。limeは一つのファイルで完結しているのでインストールはこれで終わり。

実際にテスト書いてみる

通常の書き方が以下。

<?php
include_once 'lime.php';

$t = new lime_test;
$t->is('hoge', 'hoge', '比較のテスト');
$t->ok(false, '真偽値でのテスト');

ごくごく簡単。
これを実行すると以下のように結果が表示される。

$ php hoge.php
ok 1 - 比較のテスト
not ok 2 - 真偽値でのテスト
#     Failed test (.\hoge.php at line 6)
1..2
 Looks like you failed 1 tests of 2.

これを見ると分かるとおり、lime_testクラスのisメソッドは二つの値の比較が成功するかどうか、okメソッドは真偽値をテストする。

クラスファイルなどにテストを埋め込む

前述したようにlimeでは簡単にテストが書けるが、さらにクラスファイルなどの中にテストも埋め込んでみたのが以下。

<?php

class Hoge
{
    function doSomething()
    {
        return 'hoge';
    }
}

if (debug_backtrace()) return;
include_once 'lime.php';

$t = new lime_test;
$hoge = new Hoge;

$t->is($hoge->doSomething(), 'hoge');

実行すると以下のようにテストの結果が表示される。

ok 1
1..1
 Looks like everything went fine.

このファイルは外部からincludeされた時はテストは実行されないようになっている。
"if (debug_backtrace()) return;"という一行が味噌で、ファイルが直接実行された場合はそのままコードが読み込まれ、外部からファイルが読み込まれた場合はコードがこれ以降実行されない。
通常の書き方だとクラスファイルとテストファイルを別々にしなければならないので一手間がかかるが、この書き方なら一つのファイルに通常のコードとテストのためのコードを一緒に書けるのでより手軽だと思う。

limeに関する日本語のリンク

lime自体に関する詳しい説明は以下のリンクが充実している。