Test::Requires でモジュールがないときにテストをスキップするB!

前置き

みなさんこんにちは、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 さんです。