xaicronさんのModule::Install::ExtendsMakeTestがなかなかいい感じです。以前書いたTest::mysqldのブログ記事を実現するのにもそうですが、任意の環境変数を設定できたり、スクリプトを実行できたりするのがとてもいい感じ。なので、以前の記事に書いていた内容は今は以下のように実装しています
replace_default_make_test
includes => [ "modules/common/lib" ],
env => { MYAPP_CONFIG => 't/config.pl' },
before_run_scripts => [ 't/start_daemons.pl', 't/load_fixtures.pl' ],
;
自分は今プロジェクトの共通モジュールをgit submoduleとしてmodules/ 以下に入れているのでそこまでのパスを通すのと、Webアプリのコンフィグファイルの指定を環境変数に入れる事、そしてmysqld等を開始し、DBフィクスチャを入れるところまでをスクリプトに書いて行っている感じ。自分の書いた記事の黒魔法がなくて非常に良い。
で、みんなにも勧めたくてこの記事を書いたんだけど、一個だけ本質的には重要じゃないんだけどとても気になる点が・・・ぶっちゃけモジュールおよび関数、引数のネーミングがクールでないと思う・・・。
自分がちょこちょこ使ってみた感想では、これはmake test_hoge の部分を変更するものなので、Test Targetを追加・変更する物だという認識に到達しました。デフォルトのmake testも変えられるしね(ちなみにこの事実はPODからは分かりづらいのですが、上記例でも書いたとおり便利に使ってる)
Module::Installが提供するのはDSL言語なわけで、なるたけ簡潔に、なおかつ文章を書いているように書けるのが理想だと個人的には思っています。なので、あくまで個人的な意見としては、こうなると英語的に嬉しい気がします:
use inc::Module::Install; use Module::Install::TestTarget; # モジュール名からTest Targetを扱う事がわかる .... # 主な改善点としては、オプションが「動作」を示す場合は動詞を # オプション名に入れている事(例:includesとmodulesだったのを # includesとload_modulesに変えている # あとターゲット名は明示的な最初の引数としている test_target test_foo => ( # test_fooがターゲット includes => [ $path1, $path2 .... ], load_modules => [ $module1, $module2 ... ], run_on_prepare => [ $script1, $script2 ... ], run_on_finalize => [ $script1, $script2 ...], insert_on_prepare => [ $snippet1, $snippet2 ... ], insert_on_finalize => [ $snippet1, $snippet2 ... ], # あとは一緒 ); # デフォルトのmake testを変える場合はこちらで、ターゲット名を指定しない default_test_target includes ... .... その他 ;
run_on_prepareとかinsert_on_prepareは正直苦肉の策なんだけど、とりあえずextends_make_testよりかはtest_targetのほうが外人にわかりやすくていいと思うので、もし可能だったらいじってくれないかなぁ、というお願いでした。まぁ変わらなくても使うけどね!