2011-12-11
■[Perl] Test::Perl::Critic その3
Test::Perl::Criticは、Perlベストプラクティスのポリシーをどのていど厳格に守るのか設定が可能。
設定は、Perl::Criticと同じようにできる。
今回のエントリーは、その設定項目について。
設定方法
useにリストとして指定
use Test::Perl::Critic ( -profile => 't/perlcriticrc' );
または、importの引数として指定
Test::Perl::Critic->import( -profile => 't/perlcriticrc' );
-profile
コンフィグファイルへのパスを指定する。
もし、指定されたファイルがない場合はカレントディレクトリから.perlcriticrcを探す。
-severity
厳格さを数値もしくは、厳格さを反映した名前で設定する。
数値の場合、5が最も緩く、1が最も厳しい。デフォルトでは5が設定される。
gentleを指定した場合は、重大な違反のみを報告する。
brutalを指定した場合は、最も軽微な違反も報告する。
| 数値 | 名前 |
|---|---|
| 5 | gentle *1 |
| 4 | stern *2 |
| 3 | harsh *3 |
| 2 | cruel *4 |
| 1 | brutal *5 |
Test::Perl::Critic->import( -severity => 'gentle' );
-theme
指定したテーマについてポリシーを適用する。
- severityが指定されていない場合、-severityには1が設定される。
&&演算子や、||演算子を使い複雑なテーマの設定が可能。
使える演算子は、&&, ||, !, and, or, not。
演算子の優先順位はPerlのコードと同じ。
なお、テーマは大文字と小文字を区別されない。
また、テーマを指定しない場合はすべてのポリシーが適用される。
以下の例では、'bugs'と'pbp'のテーマを持っているポリシーが適用される。
Test::Perl::Critic->import( -theme => 'bugs && pbp' );
テーマとは
ポリシーには、1つ以上のテーマが設定されている。
これにより、テーマを設定することで好みのポリシーでPerl::Criticを走らせることができる。
| テーマ | 内容 |
|---|---|
| core | Perl::Criticのすべてのポリシー |
| pbp | "Perl Best Practices"由来のポリシー |
| bugs | バグを防止または、明らかにするポリシー |
| maintenance | コードの長期的な健全さに影響するポリシー |
| cosmetic | Policies that only have a superficial effect*6 |
| complexity | コードの複雑さに関するポリシー |
| security | セキュリティ問題に関するポリシー |
| tests | テストプログラムのためのポリシー |
以下のコマンドで使用可能なポリシーとそれに関連付けられているテーマを確認することができる。
$ perlcritic -list
-include
適用させるポリシーを、文字列のリストリファレンスとして指定する。
指定した文字列がixmsオプション付きのパターンマッチにヒットした場合、ポリシーは適用される。
このとき、-severityで設定した厳格さ以上のポリシーも適用される。
Test::Perl::Critic->import(-include => ['layout'] -severity => 4);
-exclude
除外するポリシーを、文字列のリストリファレンスとして指定する。
指定した文字列がixmsオプション付きのパターンマッチにヒットした場合、ポリシーは除外される。
なお、-includeと共に使用した場合、-excludeで設定した項目が優先される。
-single-policy
指定した文字列がimxsオプション付きのパターンマッチに一致する1つのポリシーのみが適用される。
(複数のポリシーに一致しても、適用されるのは1つのみ)
この設定は、-severity, -theme, -include, -exclude, -only よりも優先される。
-top
表示される違反の最大数を設定する。
表示される違反はファイルで発生した順。
severityが指定されない場合は、最も厳格な1が設定される。
-force
コード内の"## no critic"を無視するかどうかの設定値。
真となる値を設定した場合、Perl::Criticはすべてのコードを分析する。
偽となる値を設定した場合は、"## no critic"がつけられたタグを無視する。
-verbose
1から11までの正の整数。もしくは、リテラルで書式を設定できる。
CPAN本によると、8がちょうどいいらしい。
2011-12-05
■[Perl]Test::Perl::Critic その2
今日はサブルーチンについて。
critic_ok( $FILE [, $TEST_NAME ] )
# t/991_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 $@; critic_ok( 'bin/get_tweet.pl' ); done_testing;
$ perl t/991_perlcritic.t ok 1 - Test::Perl::Critic for "bin/get_tweet.pl" 1..1
ファイルを指定してテストする場合に使う。
複数のファイルを指定することはできない模様。
最も気をつけるべき点は、テスト数を明示して上げる必要がある。もしくはdone_testing;を記述する。
なお、第二引数にテスト名を指定することが可能。
デフォルトでは、"Perl::Critic test for $FILE"。
テスト名を'MyTest'とした場合は、以下のようになる。
perl t/991_perlcritic.t ok 1 - MyTest 1..1
all_critic_ok( [ @DIRECTORIES ] )
# t/992_perlcriti_all_critic_ok.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();
指定したディレクトリ内のPerlファイルに対してテストを実行する。
ディレクトリが指定されなかった場合はblib以下ののPerlファイルを、
blibが存在しない場合は、lib以下のPerlファイルに対してテストを行う。
その1で書いたとおり、このサブルーチンを使用する場合はテスト数を明示する必要がない。
all_code_files ( [@DIRECTORIES] )
非推奨!
[12/7追記]
そもそもimportされないのでパッケージ名から指定しないと使えません。
Perlファイルのリストを返す。
ディレクトリを指定しない場合、blib以下から、
blibが存在しない場合は、lib以下から。
CVSやSubversionディレクトリ内のファイルはスキップされる。
ソースコードを見てみると、all_critic_okから呼び出されている。
また、このサブルーチン自体はディレクトリの設定をしてPerl::Critic::Utils::all_perl_filesを呼び出しているだけ。
したがって、このサブルーチンを使いたい場合は、ドキュメントに書いてあるとおりPerl::Critic::Utils::all_perl_filesを使うべき。
なお、Perlファイルの判断条件は以下の2つ
- 拡張子が .PL .pl .pm .t
- シバンに'perl'を含む
2011-12-04
■[Perl]Test::Perl::Critic その1
社内勉強会で発表するためのメモその1
概要
Test::Perl::Critic wraps the Perl::Critic engine in a convenient subroutine suitable for test programs written using the Test::More framework.
no title
(超意訳)Test::Perl::CriticはTest::More向けの、Perl::Criticのラッパーだよ!
このモジュールはテスト対象のコードがPBPに準拠しているかどうかをテストしてくれるモジュールです。 PBPとはDamian Conway氏の提唱するPerl Best PracticesというPerlのコードを書く際のスタイルです。
第4回 Test::Perl::Critic, Test::Pod, Test::Pod::Coverage, Test::Exception, Test::Warn, Devel::Coverの紹介:Happy Testing Perl|gihyo.jp … 技術評論社
使ってみる
# 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( qw/ bin lib /);
はじめ、done_testingをつけて実行したところ、テスト数が合わないと言われパスしなかった。
ドキュメントを見てみると、Test::Moreのテスト数はTest::Perl::Criticが設定してくれる云々と書いてある。
また、t/perlcriticrcを作ってない場合は、空ファイルでいいので作らないとパスしない。
もしくは、以下のようにコードを変更するか。
#eval { require Test::Perl::Critic; Test::Perl::Critic->import(-profile => "t/perlcriticrc") }; eval { require Test::Perl::Critic; Test::Perl::Critic->import };
とりあえず、自分が書いたコードでテストしてみたが、なんとパスした。
ちょっと驚いた。それほど難しいことしてないためだろうが。
