tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

Test::Module::Used について

<追記>
2010/10/01: 最近少し反響があったので、このモジュールの近況をまとめてみました。ご参照ください。

Test::Module::Used というモジュールを書いたの続きみたいな話。最近書いた、Test::Module::Usedというモジュールについて。

これはどんなモジュール

多分やってることは Test::Dependencies というモジュールと同じっぽいです。

モジュールのドキュメントを見ても良いし、下記リンクなんかも参考になるのではないか、と思います。
依存モジュールの指定漏れを防ぐ方法 - 名称未設定♥ - subtech

基本的にどちらも、モジュールの META.yml から、requires と build_requires を引っこ抜いて、実際のモジュールファイル(.pm)とテストファイル(.t)で use されているモジュールと過不足ないかをチェックするモジュールです。

Test::Dependencies は便利なのだけど、CPAN のレビューにあるように、ちょっと気難しい振る舞いをする部分があります。まあそれは前回も書いたし、これ以上 dis るのはやめますが。

幾つか分かっているバグに対してレポートを上げても良かったのですが、バグ調査しながらソース読んでたら、自分の欲しいものを一からちゃんと作るか、と思ってしまった次第です。(しかし、よくモジュールの registration 通ったなぁ。。。)

使い方は Synopsys に書いたとおりで、普通なら下記だけでいけるはず。

#!/usr/bin/perl -w
use strict;
use warnings;
use Test::Module::Used;
my $used = Test::Module::Used->new(
   exclude_in_testdir => ['Test::Module::Used', 'My::Module'],
);
$used->ok;

細かい制御がいるなら、new のパラメータを見てね、という感じです。


以下、今後の拡張に向けて迷っている仕様をメモしておきます。何かコメントなどあれば、もしかすると反映されるかもしれません。(基本的に迷っている部分なので、力強い後押しがあれば採用します)。

exclude_in_testdir の自動取得について

exclude_in_testdir に関しては、自動取得があるとうれしいと思う。lib (というか module_dir)を解析して、package 文を取ればよさげ。

まあこれやっちゃうと、モジュールを動的に書き換えるような黒魔術使っている場合がアウトなんだけど、そんなモジュールはコレでテストできないだろうから無視。

version について

現状はソースファイル(*.pm)から use 5.XX みたいなやつを取得している。ソースになくて、コンストラクタで perl_version を指定されればそれを使う。指定されていなければ 5.008 とする。

という定義なんだけど、これでいいのかかなり疑問。なのであえてドキュメント化してない。(でも書いておいたほうがいいことは間違いないので、0.0.3 で書くつもり)

テスト方法について

現状は ok のみ提供しているけど、それでいいかどうか微妙。

ok の実装は下記の 4 つのフェーズに分けている

  • ソースの use -> META.yml の requires
  • META.yml の requires -> ソースの use
  • テストの use -> META.yml の build_requires
  • META.yml の build_requires -> テストの use

今は ソース(or Test) <-> META.yml の両方向で比較しているけど、片側でもいいのではないか、という気がする。(ソースやテストで use されてて META.yml に書いてないのはまずいけど、多分逆はそうでもない。せいぜい warning かな)

あるいは、4つの各フェーズ毎にメソッドがあってもいいのかもしれない。クライアントは呼びたいものを呼ぶような
イメージ。(ok を呼ぶと 4つ全部が実行される)

ただ、そうすると内部的には plan をどう扱うかがかなり微妙。no_plan でもいい??

exclue_in_build_requires/exclude_in_requires について

上記とも関連して、除外する設定が META.yml(build_requires と requires)側にも必要なのではないか、という
気がする。特に動的にモジュールをロードする場合なんかを考えると多分そう。

その他 リポジトリについて

以前も書きましたが、github にソースを置いているので、fork してもらっていいです。(つーか私は git 初心者なので、正しく作業できるかちょっと不安ではありますが。。。)
tsucchi's Test-Module-Used at master - GitHub