Parallel module testing in Perl

Twitterにて:

たしかあったはず*1と思って探してみると*2Test::Harness にHARNESS_OPTIONSというオプションがありました。以下のようにすると並列でテストで時間を大幅に短縮できます。

$ HARNESS_OPTIONS=j2 make test

実際、Xslateでこれを試してみるとテストの時間が2/3程度になりました*3。これはかなり効果があると考えていいでしょう。
ただし、モジュールが並列実行に対応してないケースがありえるので、すべてのケースで利用出来るわけではありません。すなわち、これはモジュールの作者が指定するのが望ましいオプションだと言えます。そして、Module::Install::TestTarget があればそれが簡単にできるのです。

# Makefile.PL
# ...

default_test_target
    env => { HARNESS_OPTIONS => 'j2' };
# module authorでのみ並列実行したい場合は
# if $Module::Install::AUTHOR などとする

# ...

これで余計なことを考えずにテスト時間が短縮されます。

*1:proveは-jオプションをサポートしていますが、今回のケースはそうではなくて、cpanmで入れるときに有効にしたいということでした。

*2:この種のコマンドラインアプリケーションはだいたい環境変数でオプションを渡せるようになっているため、かならずあるはずと思って探すと比較的簡単に見つけられます。

*3:Ubuntsu on VMWare Player の場合