$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Test::Perl::Criticでコーディング規約をテストする

 コーディング規約はあるけれど、レビューの時にチェックするのは大変ということで、とりあえずTest::Perl::Criticを使って軽くテストを書いてみました。

 僕はある程度のコーディングのブレは許容して、チーム全員で合意がとれるものだけを自動でチェックするようにしたほうが良いと思っているので、rcファイルを使って、必要な物だけ追加していく形式を試してみました。

テストの追加

 まずテストは以下のようにt/perlcriticrcを読み込むという設定をしてあげた上で、libとt全部をテストするように書きます。

require Test::Perl::Critic;
my $rcfile = File::Spec->catfile( 't', 'perlcriticrc' );
Test::Perl::Critic->import( -profile => $rcfile );
all_critic_ok('lib', 't');

perlcriticrcを作成

 あとはコーディング規約に従ってperlcriticrcを書いてあげます。

only = 1
include = CodeLayout::ProhibitHardTabs RequireUseStrict RequireUseWarnings

[CodeLayout::ProhibitHardTabs]
# インデントにハードタブ使わない
allow_leading_tabs = 0

 このようにすることで今回は以下の様なコーディング規約をテスト出来るようになりました。

  • use strictを書かないといけない
  • use warningsを書かないといけない
  • ハードタブは使わない

 ここでのポイントは

  • onlyというのを使ってあげると、perlcriticrcに書かれているモジュールだけを使うようになる
  • includeに空白区切りで指定されたものがテストされる
  • [CodeLayout::ProhibitHardTabs]のようにすればそれぞれのモジュールごとの設定を書ける

問題点

 この方法では、ファイルがかなり多いプロジェクトの場合、テストに時間がかかってしまうという問題点があります。手元のPCで1000ファイルくらいに対して動かしてみると、大体5分前後かかってしまうことがわかりました。
 テストが遅いということはそれだけで悪なので、何とかして別の方法を試してみたいところです。代替案としては、例えばgitのcommit時に変更されたファイルに対してスクリプトが走り、エラーだったらコミットできないようにする、とかが思いつきます。

まとめ

 今回はコーディング規約に従っているかをテストするのをやってみました。レビューもコストがかかるので、機械でチェックできることはそちらに任せていきたいですね。