August 24, 2006

Test::Perl::Critic で PBP 準拠なコードを自動テスト

Perl Best Practices 日本語版発売記念ということで、Plagger のユニットテストに Test::Perl::Critic を組み込んでみました。

Perlベストプラクティス
Damian Conway クイープ
オライリー・ジャパン (2006/08/24)


組み込むといっても実装は簡単で、t/99-perlcritic.t なファイルをつくって、以下のように書き込むだけ。

use strict;
use Test::More;

eval { require Test::Perl::Critic; Test::Perl::Critic->import(-profile => "t/perlcriticrc") };
plan skip_all => "Test::Perl::Critic is not installed." if $@;

all_critic_ok("lib");

lib ディレクトリ以下の .pm ファイルに対して、 Perl::Critic で PBP で推奨されたスタイルかどうかをチェックして、なければエラー (test failure) になる、というシンプルなコードです。Perl::Critic のデフォルト (PBP のデフォルト)だと厳しいルールがいくつかあるので、t/perlcriticrc なファイルをつくって、以下のようにしました。

# for mkdir $dir, 0777
[-ValuesAndExpressions::ProhibitLeadingZeros]

# we do eval $asset_pl a lot
[-BuiltinFunctions::ProhibitStringyEval]

# no strict 'refs'
[TestingAndDebugging::ProhibitNoStrict]
allow = refs

コメントにある通りですが、filemask に使う leading zero, eval $string, no strict 'refs' を許容しています。

実際にこれでチェックしたところ、use strict してないファイルや 2引数の open を使っているコードがいくつかあったので、まとめて 修正。ポリシーでは許可しないけど、このコードだけでは使いたい、というようなときは、

my $value = $res->header($header) or return undef; ## no critic

のように no critic と ## を利用したスマートコメントに書けば Perl::Critic が無視してくれます。

これで、Plagger コードに perlcritic 非互換なコードをコミットすると Chimps Server で見つかって #plagger(-ja) に IRC でアナウンスされてしまうというわけ。これはベンリですね。

Posted by miyagawa at August 24, 2006 07:42 PM | Permalink | Comments (0) | TrackBack(0)
Comments
Trackbacks
TrackBack URL for this entry: http://blog.bulknews.net/mt3/mt-tb.cgi/2010
Post a comment