2012/12/29

アプリケーションモジュール全部にいくつかのテストをする

アプリケーションに限らずモジュールが多くなると、ひとつひとつ use_ok したりするの大変ですよね。そういう時、自分は Test::LoadAllModules を使っていたのですが、このモジュールは名前の通り、use_ok をやってくれるのみのシンプルインターフェースでした。

ところが、最近、ちょっとした深遠な理由が発生し、use_ok 以外のこともやりたくなりました。

そういうわけで、Test::LoadAllModules に hook をはやして use_ok 以外の処理が出来る pull req してみたのですが、だったら別モジュールでいいんじゃないかってことでほとんど土台を書いてもらってしまいました。dann++

ところがどっこいそこからなにがどう転んだんだかブーメランして Test::AllModules をボクが shipit してしまいました。

Test::AllModules

一番シンプルな形で、以下のように使えます。

use Test::AllModules;

BEGIN {
    all_ok(
        search_path => 'MyApp',
        check => sub {
            my $class = shift;
            eval "use $class;1;";
        },
    );
}

all_ok という関数がエクスポートされるので、search_path にクラスを渡して、check にコードリファレンスを渡します。check のコードにはクラス名が渡ってきます。check の返り値は Test::More::ok() に渡されますので、ok なら 1 を返すようにしておけば ok。

check は複数渡すことも可能で、その場合は、キーにテスト名、バリューにコードというハッシュのリストになります。説明読むと面倒くさそうですが、まあ、もろもろオプションを列挙してみると以下のような感じになります。

use Test::AllModules;

BEGIN {
    all_ok(
        search_path => 'MyApp',
        checks => [
            +{
                'use_ok' => sub {
                    my $class = shift;
                    eval "use $class;1;";
                },
            },
        ],

        # `except` and `lib` are optional.
        except => [
            'MyApp::Role',
            qr/MyApp::Exclude::.*/,
        ],

        lib => [
            'lib',
            't/lib',
        ]
    );
}

では、良いお年を!

サイト内検索