Minilla(Module::Build)でproveオプションを渡したい
最近はやりのモジュールセットアップ&管理ツールのMinillaで使うminil testでprove --jobs 10的な並列処理をかけたいなーと思って、いろいろ調べて教えてもらったのでその話です。
感謝!
この記事書いたらtokuhiromさんがコメントくれて、しかもMinilla v0.8.2をリリースし、tap_harness_argsというModule::Buildのオプションに対応して頂けました!詳細は後述。
ありがとうございます!!!!
proveのオプションって?
proveはPerlの動作確認テストを一括実行するコマンドです。proveのオプションとか知らない方は、こちらのxaicronさんの記事を参照→prove についてのおさらい
テストの並列処理とかカラーリングとか時間出したりできます。モジュールのテストでも並列処理させたいことはしばしばあると思いますので、結構ニーズあるような設定だと思いますね。
Makefile.PLの場合
テストのためにデーモンを自動的に起動するやりかた2011年版にあるように、.provercとかもりもりかいて、以下のようにMakefile.PLに書けばいいのです。
sub MY::test_via_harness { "\tprove --rc=t/proverc t\n" }
ただ、Minillaは最近はやりのBuild.PL形式でModule::Build使っているんですが、ドキュメントがモリモリでよくわからん!という感じなりました。ググってもあまり出てこないし。。。
Build.PLの場合
Module::Buildにもよくみたらかいてあるんですが、全然よくわかりません(苦笑)
Mminilla( v0.8.2)が生成するBuild.PLをみるとよくわかります。生でBuild.PLを書く場合は以下の設定します。
my $builder = Module::Build->new(
tap_harness_args => {"jobs" => 19,"timer" => "true","color" => "true"},
);
[追記]Minillaのproveの並列オプションの渡し方 ~tap_harness_args編~
Minilla v0.8.2では、以下のようにminil.tomlに設定するということです。
[tap_harness_args]
jobs=19
color=true
timer=true
[元記事]Minillaのproveの並列オプションの渡し方 ~オレオレbuild_class編~
builder::MyBuilderでカスタマイズできるという参考程度に。
さてはて、困ったなーと思っていたんですが、こんなときこそはちぴー仲間の集うYanchaだ!!ということで聞いてみたら、gfxさんの記事をさらっとtsuttchiさんにおしえてもらった。マジ感謝です!!!で以下のようにproveのオプションは環境変数で設定できるということです。
HARNESS_OPTIONS=j19 minil test
で、毎回環境変数渡すのだ類のでMinillaにいれたいんですが、Build.PLを自動生成するMinillaなので、どうするかというと、Minillaのminil.tomlの設定のドキュメントとtokuhiromさんのModule::Buildでテストの前とかあとにフックする方法を参考に以下のようになります。
minil.tomlで以下のようにオレオレbuild_classを設定
[build]
build_class = "builder::MyBuilder"
オレオレbuildクラスで以下のようにテストをフック
./buidler/ディレクトリ作って、vi /builder/MyBuilder.pmに書き込みます
package builder::MyBuilder;
use strict;
use warnings;
use parent qw(Module::Build);
sub ACTION_test {
my $self = shift;
local $ENV{HARNESS_OPTIONS} = ($ENV{HARNESS_OPTIONS} ||'') . 'j19';
$self->SUPER::ACTION_test(@_);
}
1;
いろいろ渡す方法
HARNESS_OPTIONSのドキュメントをみると、たくさんオプションを渡すときは、「:」区切りで渡すようです。
HARNESS_OPTIONS=j9:c make test
余談、do_system('prove --jobs 19 -r t')には注意
最初ACTION_testの中で、$self->SUPER::ACTION_test(@_)呼ばないで、$self->do_system('prove --jobs 19 -r t')でやればよくね?って思ってやったんですが、Minillaがいい感じに裏でやっていると思われるxt系のテストがよばれなくなっちゃうので、ちとうれしくないと思いやめました。xt系のテストあまりわかっていないので、とりあえず、tokurhiromオススメを不都合が出るまで使っておきましょうという感じです。