To repeat testing with different configuration

構成条件を変えてテストを繰り返したいことがある。
たとえば,XSとPurePerlの両方の実装を持つモジュールなどはそうだし,Any::Mooseを使ったモジュールであれば $ENV{ANY_MOOSE} を変えてテストを繰り返したいと考えるのは当然だ。

この問題は,postamble()*1Makefileにターゲットを追加することで解決できる。

さて,ここでは,開発者モードのときに $ENV{FOO_PUREPERL}=1 でテストをもう一度繰り返したいものとする。これには,Makefile.PLに以下のように記述すればよい。

# Makefile.PL
use inc::Module::Install;
# ...
if(author_context){
    # repeat testing
    # see also ExtUtils::MM_Any::test_via_harness()
    my $test_pp =  q{$(FULLPERLRUN) -MExtUtils::Command::MM -e}
                  .q{ "do 'author/force-pp.pl'; }
                  .q{test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')"}
                  .q{ $(TEST_FILES)} . "\n";

    postamble qq{test_dynamic :: test_pp\n\n}
            . qq{test_pp :: pure_all\n}
            . qq{\t} . $test_pp;}
# ...

そして,以下のような内容のauthor/force-pp.plを作成する。

# author/force-pp.pl
$ENV{FOO_PUREPERL} = 1;

これで,Makefileにtest_ppというターゲットができるため, "make test_pp" でPurePerlモードのテストを実行できる。また,test_ppは通常のテスト(test_dynamic)でも実行されるので,単に "make test" とすると,環境変数に手を加えない状態でテストを行った後にさらにtest_ppも繰り返すようになっている。

なお,テストコマンドを "FOO_PUREPERL=1 $(FULLPERLRUN) ..." としても特に問題はないが,ここでは移植性のためにforce-pp.plを用意してそこで環境変数をセットするようにしている。

(追記)
id:typesterいわく,常にフルテストする必要がないときは,prove経由でテストを行うのがいいそうです。

*1:Module::Installを使う場合とExtUtils::MakeMakerを直接使う場合では若干方法が異なるが,基本的には同じである。