EclipseでSpotBugs(FindBugs)を使ってみる、その1
SpotBugsについての投稿は/tag/SpotBugsにあるので参照されたい
恥ずかしながら、これまでFindBugsというものを使ったことが無かった。使い方は非常に簡単だし、使ってみると「これは行ける」という感触がすぐに得られる。是非使ってみていただきたい。
なお、現在はSpotBugsという名称になっている。MarketplaceでFindBugsを探しても次のようにSpotBugsが出てくる。
マニュアルはここにある。http://spotbugs.readthedocs.io/ja/latest/index.html。
インストール
そのままインストールすればよい。難しいことは何も無い。Eclipseをリスタートする。
SpotBugsの実行
プロジェクトを右クリックして、SpotBugs>FindBugsを実行する。
実行が終了すると、以下のようにバグの数が表示される。
ソースコードを開き、「虫」をクリックすると、バグの内容が表示される。これはユニットテストなので、例外無視でも構わないんですが。。。
Javaパースペクティブでも十分使えるのだが、SpotBugsパースペクティブに変更すれば、左側にバグ一覧が表示されて便利。しかも、より悪いバグから優先して表示してくれる。
- Scariest:めちゃ怖いよ。
- Scary:怖い
- Troubling:問題起こしそう
- Of Concern:心配だ
このEclipseは別に日本語化されておらず、英語版のままなのだが、バグ内容は日本語で表示してくれる点も非常にありがたい。
循環依存の検出は?
さて、そもそもはJavaパッケージ間の循環依存を検出するで書いたように循環依存を検出したいがために、SpotBugsをインストールしたのだが、これはどうやれば良いのだろうか?
対象のプロジェクトには多数の循環依存があるはずなのだが、何も検出されていないようだ。
使えません、というか設定方法がわかりません
デフォルトで検出されるバグについては非常に便利で問題無いのだが、循環依存の検出については使えない。というよりも、何らかの設定をしないと検出くれないようなのだが、設定方法が全くわからない。
検出するバグの説明
まずマニュアルの検知可能なバグの詳細の中に、「CD: クラス間の循環依存関係のテスト (CD_CIRCULAR_DEPENDENCY)」というのがある。そこで、以下のような極端なコードを書いてみる。
public class Sample1 {
static Sample2 a = new Sample2();
}
....
public class Sample2 {
static Sample1 a = new Sample1();
}
しかし、検出してくれない。
検出するバグの設定
デフォルトでは検出されないようなので、設定を行ってみるが、それでも検出されない。設定する方法は一応以下の通り。プロジェクトプロパティのSpotBugsを表示し、Enable project specific settingsをチェックし、ディテクター構成をクリックする。パターン列をクリックし、ABC順にしたら、先の「CD: クラス間の循環依存関係のテスト (CD_CIRCULAR_DEPENDENCY)」の「CD」を探す。
すると、たしかにFindCurcularDependenciesというのがあり、チェックがはずれている。これをチェックする。さらに「カテゴリー」が「Dodgy code」というものになっていることに注意。
報告構成に戻り、Dodgy codeが報告バグカテゴリーに含まれることを確認。さらに、他の設定もいじってみる。
。。。が、全く報告されない。完全に無視される。一体どうしたら報告してくれるのだろうか?
総評
所望の動作をさせるやり方がさっぱりわからず、そもそも本当にやってくれるのかもわからないのだが、しかし、デフォルトでも十分使えるものであることはわかった。なぜ今まで使わなかったのか不思議な位だ。今後使い続けることになると思う。
ディスカッション
コメント一覧
試してみたときの結果をコメントしておきます。
同じサンプルコードで
Rank: Of Concern(17), confidence: Normal, Pattern: IC_INIT_CIRCULARITY は検出されました。
手元の Java Project に適用したところ
Rank: Of Concern(17), confidence: Normal, Pattern: CD_CIRCULAR_DEPENDENCY で検出されるようです。
ご報告ありがとうございます。
後で再度試してみます。