CheckStyleでテストクラスだけ日本語メソッド名OKにする方法

CheckStyle の設定で苦労したので、作業メモを残しておきます。

やりたいこと

テストクラスはメソッドを日本語で宣言したいので、
テストクラスのメソッドだけを CheckStyle のチェックから外したい。

MethodName モジュールの仕様

メソッドの命名チェックを行っているのは “MethodName" というモジュールです。

<module name="MethodName"/>

CheckStyle の設定ファイルではこんな感じで設定されています。
デフォルト値は省略されていますので、明示的に属性値を書いてみると以下のような感じに。

<module name="MethodName"
               format=“^[a-z][a-zA-Z0-9]*$"
               allowClassName=“false"/>

format 属性で「小文字英字で始まって」「英数字のみ」という命名ルールが規定されています。
記号も日本語もダメ。
allowClassName 属性はクラス名と同じ名前のメソッドを宣言してもよいかどうか(当然 false)。

excludesClassName みたいな属性があれば、「ファイル名が “Test.java” で終わるもの」と
指定できたりしますが、このモジュールは残念ながらそういう属性はありません。

なんとかがんばるしかありません。

SuppressionFilter を使う

SuppressionFilter を使うことで、各モジュールが行うチェックの対象外を指定することができます。
http://checkstyle.sourceforge.net/config_filters.html#SuppressionFilter

便利そうです。

だけれど、ちょっとやっかいです。
いつもの CheckStyle 設定ファイルとは別で、ファイルを作らないといけないです。

いつもの CheckStyle 設定ファイルには
以下のように「SuppressionFilter の設定は別ファイルを見てね」と設定追加します。

<module name="SuppressionFilter">
  <property name="file" value="docs/suppressions.xml"/>
</module>

その参照先となる、別ファイル suppressions.xml を作ります。

<?xml version="1.0"?>

<!DOCTYPE suppressions PUBLIC
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
"http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">

<suppressions>
  <suppress checks=MethodNamefiles=“.*Test.java$” />
</suppressions>

<suppress> の checks 属性に対象のモジュール名を指定します。
files 属性に正規表現で対象外としたいファイルを指定します。ここではテストクラスの想定。

通常の CheckStyle でファイル指定する感じで “*Test.java” とか指定すると
実行エラーになるので注意です。

suppressions.xml のパス指定がやっかい

いつもの CheckStyle 設定ファイルに suppressions.xml(ファイル名は任意です)のパスを
指定するのですがこれが厄介者です。
いつもの CheckStyle 設定ファイルかの相対パスで見てくれたらいいものの…

CheckStyle を実行する際の作業ディレクトリかどこかからの相対パスっぽいです。
(きちんと調べてませんが、システムプロパティの ”user.dir” とかだと思います)

なので、ひと工夫が必要です。

<ケース1> Eclipse Check Style Plugin の場合

<property name="file" value=“${config_loc}/suppressions.xml"/>

もしくは

<property name="file" value=“${samedir}/suppressions.xml"/>

という感じで変数を使うことで、いつもの設定ファイルがあるディレクトリパスを指定できます*1
Eclipse Check Style Plugin が ${config_loc}, ${samedir} といった組み込み変数を
用意しているみたいです。

${samedir} よりも ${config_loc} を使っている人が多そうなので、
以降は ${config_loc} を使っていきます。

<ケース2> Maven の場合

Eclipse でチェックできるようになったから、次は Maven でチェックだ*2
という流れで、「mvn checkstyle:checkstyle」するとエラーになります。

${config_loc} は Eclipse Plugin の組み込み変数なので、Maven が知らない変数になります。
Maven として config_loc の変数をセットしてあげる必要があります。

pom.xmlCheckStyle plugin がこんな感じで設定されているとして…

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-checkstyle-plugin</artifactId>
   <version>2.8</version>
   <configuration>
     <configLocation>${basedir}/config/checkstyle.xml</configLocation>
   </configuration>
   <executions>
     <execution>
       <phase>verify</phase>
       <goals>
         <goal>check</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

タグにひと工夫を加えます。
タグを追加して config_loc という変数をセットします。

   <configuration>
     <propertyExpansion>config_loc=${basedir}/config</propertyExpansion>
     <configLocation>${config_loc}/checkstyle.xml</configLocation>
   </configuration>

これで Eclipse でも Maven でも、
いつもの設定ファイルからの相対パスで suppressions.xml を指定することできます。

「mvn checkstyle:checkstyle」も動くはずです。

参考にしたサイトなど

色々なサイトの情報をつぎはぎしながら解決しました。

補足

・JavadocMethod(メソッドJavadoc 必須チェック)についても同じような感じで
 対象外指定できます。
Eclipse Plugin で提供される GUI で設定ファイルを編集ようとすると、
 一部の設定情報が欠損したりします。直接ファイル編集したほうが早いです。

        • -

私の Eclipse 環境だと、${config_loc} や ${samedir} で置換されるパスが末尾”/"付きになっていたので、実際は
<property name="file" value=“${config_loc}suppressions.xml”/> という設定です。

いつもは Gradle 使いですが、今はお仕事の都合上 Maven 使ってます。

*1:私の Eclipse 環境だと、${config_loc} や ${samedir} で置換されるパスが末尾”/"付きになっていたので、 実際は <property name="file" value=“${config_loc}suppressions.xml”/> という設定です。

*2:いつもは Gradle 使いですが、今はお仕事の都合上 Maven 使ってます。