To repeat testing with different configuration
構成条件を変えてテストを繰り返したいことがある。
たとえば,XSとPurePerlの両方の実装を持つモジュールなどはそうだし,Any::Mooseを使ったモジュールであれば $ENV{ANY_MOOSE} を変えてテストを繰り返したいと考えるのは当然だ。
この問題は,postamble()*1でMakefileにターゲットを追加することで解決できる。
さて,ここでは,開発者モードのときに $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を直接使う場合では若干方法が異なるが,基本的には同じである。