前振り
こんにちは。昨年は初めての Perl Advent Calendar 参加で舞い上がってしまい場違いな投稿をしてしまったと反省していた @yak_ex です。
というわけで、今年はちゃんと TIps の紹介をしたいと思います。ぶっちゃけタイトルだけ見て「あぁそういうモジュールがあるんだ」(もしくは「知ってる」)でほぼ終わってもらっていい気もしますが、Test::Without::Module というモジュールの紹介です。
Test::Without::Module
モジュールを書いている場合、広い環境をサポートするためだとか、必須ではなくあくまでも追加機能としてだとかで、たまにオプショナルな依存を持つモジュールを書くことがあります。あるいは Hoge::Any 系を使っている場合なんかも(どのモジュールに依存するかが確定しないという意味で)間接的にオプショナルな依存を持っているとも言えますね。
さて、こうした場合、開発している側の環境は大抵オプショナルな依存モジュールも既にインストールされてしまっています。で、 オプショナルな依存モジュールが利用できない場合のコード/テストも書いたけどどうやってテストしようか、ということになるわけです。local::lib、perlbrew、別ユーザー、別ホストとかで環境作るのもありですが、ちょっと面倒ですよね。そこで Test::Without::Module です。例えば YAML::Any のバックエンドが全てインストールされているとして、
> perl -ML -E 'say YAML::Any->implementation'
YAML::XS
となるわけですが(ワンライナーだしってことで横着して use を省略できるモジュール L を使っちゃってます)、以下のようにすると…
> perl -ML -E 'use Test::Without::Module qw(YAML::XS); say YAML::Any->implementation'
YAML::Syck
> perl -ML -E 'use Test::Without::Module qw(YAML::XS YAML::Syck); say YAML::Any->implementation'
YAML::Old
…となります。use のリストのところに無効化したいモジュール名を並べればよいわけです。*.t に入れてしまえばオプショナルな依存モジュールが利用できない場合のテストを書けますが、さらに便利だと思っているのは以下のようにワンライナーで使う形式です。
> perl -MTest::Without::Module=YAML::XS,YAML::Syck -I lib t/hoge.t
その場で一時的にモジュールを無効化することができ、開発中のテスト等で大変便利です。
まとめ
本稿では、一時的にモジュールを無効化できる Test::Without::Module を紹介しました。ニッチなニーズではありますが、そのニーズに対しては大変便利なモジュールだと思います。
明日は @myfinder さんです。お楽しみに。