PlaggerにTest::Perl::Criticのテストが追加されました。が
いつの間にやらTest::Perl::Criticのテストが追加されていますが、コード品質のテストは開発者用テストなのでエンドユーザには必要ないのでは?と思っています。自分の場合以下のようなコードによって、明示的にmake test TEST_CRITIC=1(またはTEST_ALL=1)とした場合のみ実行されるようにしています。
t/01perlcritic.t
#!/usr/bin/env perl # # $Revision$ # $Source$ # $Date$ # use strict; use warnings; use version; our $VERSION = version->new(qw$Revision: 0 $); use English qw(-no_match_vars); use FindBin qw($Bin); use Test::More; if ( $ENV{TEST_CRITIC} || $ENV{TEST_ALL} ) { chdir "$Bin/.."; eval { my $format = "%l: %m (severity %s)\n"; if ( $ENV{TEST_VERBOSE} ) { $format .= "%p\n%d\n"; } require Test::Perl::Critic; Test::Perl::Critic->import( -format => $format, -severity => 1 ); }; if ($EVAL_ERROR) { plan skip_all => 'Test::Perl::Critic required for testing PBP compliance'; } } else { plan skip_all => 'set TEST_CRITIC for testing PBP compliance'; } all_critic_ok();
これで通常のインストール(つまりエンドユーザ)の場合はスキップされるようになります。
また、開発中も普段のテストはmake test(またはprove)で、CVS/SVNにチェックインする前にはmake test TEST_ALL=1で、としています。
ちょっとコードがややこしく見えるのは、テストは頻繁に実行するので実行時間短縮のためにテストを実行しない場合は読み込みすらしないようにしたかったからです。
また、$ perl t/01perlcritic.tのように単体で起動した場合にテストが実行されるようにするには、$ENV{TEST_CRITIC} || $ENV{TEST_ALL}の部分に || ! $ENV{HARNESS_ACTIVE} を追加すると良いと思います。
追記:
こんな風にifでくくるよりはplan skip_all ... unless で飛ばす方が好きですが、
と、はてぶコメントをいただきましたが、これは$ perlcritic -1 t/01perlcritic.tが通るようにするためです。unlessを使うとPerl::Critic::Policy::ControlStructures::ProhibitUnlessBlocks - Write if(! $condition) instead of unless($condition). - metacpan.orgに引っかかってしまいますので。
コーディングスタイルには正解がないので、全員が可能な限りPerl::Criticデフォルトに従うようにしています。(それが多少変なスタイルであっても。)
他のテスト(t/02pod.t,t/03pod-coverage.t,t/04kwalitee.t)もほぼ同様のコードで、Module-Starterのテンプレートとして用意しています。
t/02pod.t
#!/usr/bin/env perl # # $Revision$ # $Source$ # $Date$ # use strict; use warnings; use version; our $VERSION = version->new(qw$Revision: 0 $); use English qw(-no_match_vars); use FindBin qw($Bin); use Test::More; if ( $ENV{TEST_POD} || $ENV{TEST_ALL} ) { chdir "$Bin/.."; eval { require Test::Pod; Test::Pod->import; }; if ($EVAL_ERROR) { plan skip_all => 'Test::Pod required for testing POD'; } } else { plan skip_all => 'set TEST_POD for testing POD'; } all_pod_files_ok();
t/03pod-coverage.t
#!/usr/bin/env perl # # $Revision$ # $Source$ # $Date$ # use strict; use warnings; use version; our $VERSION = version->new(qw$Revision: 0 $); use blib; use English qw(-no_match_vars); use FindBin qw($Bin); use Test::More; if ( $ENV{TEST_POD} || $ENV{TEST_ALL} ) { chdir "$Bin/.."; eval { require Test::Pod::Coverage; Test::Pod::Coverage->import; }; if ($EVAL_ERROR) { plan skip_all => 'Test::Pod::Coverage required for testing POD coverage'; } } else { plan skip_all => 'set TEST_POD for testing POD coverage'; } all_pod_coverage_ok();
t/04kwalitee.t
#!/usr/bin/env perl # # $Revision$ # $Source$ # $Date$ # use strict; use warnings; use version; our $VERSION = version->new(qw$Revision: 0 $); use English qw(-no_match_vars); use FindBin qw($Bin); use Test::More; if ( $ENV{TEST_KWALITEE} || $ENV{TEST_ALL} ) { chdir "$Bin/.."; eval { require Test::Kwalitee; Test::Kwalitee->import; }; if ($EVAL_ERROR) { plan skip_all => 'Test::Kwalitee required for testing Kwalitee'; } } else { plan skip_all => 'set TEST_KWALITEE for testing Kwalitee'; }