Test::Requires でモジュールがないときにテストをスキップする
前置き
みなさんこんにちは、tokuhirom です。今年もはじまりました JPerl Advent Calendar 2009。
こちらは hacker track ということで、僕がつくったモジュールの一つを紹介したいとおもいます。今回ご紹介するモジュールは Test::Requires です。
本題
Test::Requires は非常に小粒なツールですが、なかなかいいモジュールなんじゃないかと自分でもおもっています。
モジュールのテストを書くときに、「このモジュールがあったときだけこのテストをはしらせたい」というようなユーズケースはままあります。
「Plack の Server::FCGI のテストは FCGI.pm と FCGI::Client の両方がインストールされていなければスキップしたい」のですが、このような用途にはTest::Requires がぴったんこです(実際に Test::Requires は Plack のテストにつかわれています)。
従来は、毎回このような処理を書くためには以下のようにしていて、めんどくさい上に間違いやすく、バグの元になっていました。
use Test::More; plan skip_all => "FCGI, FCGI::Client are required" unless eval "use FCGI; use FCGI::Client; 1"; # ここにテストを書く done_testing;
しかし、Test::Requires を使えば、以下のように書くだけでいいのです。とても楽ちんですね。
use Test::More; use Test::Requires qw/FCGI FCGI::Client/; # ここにテストを書く done_testing;
Test::Requires は標準添付以外のモジュールはつかっていません。ですから、CPAN にリリースするときには、inc/ 同梱してリリースするのがオススメです。Module::Installをつかっている場合には、Makefile.PL を以下のように書くだけで OK です。
use inc::Module::Install; # snip.. test_requires 'Test::Requires'; auto_include; WriteAll;
まとめ
今回は Test::Requires について、解説しました。
このモジュールは、同様の処理を何度も書いたり見かけたりしているうちに、「もうめんどくさいからモジュールにしちゃおう」とおもって作りました。普段から「定型的なコードがないだろうか」と気をつけていることが重要ですね。
というわけで今回はここまで。明日は id:mikihoshi さんです。