読者です 読者をやめる 読者になる 読者になる

GradleとPMDで循環的複雑度(サイクロマティック数)を手っ取り早く測定するスクリプトを書いてみた

gradle pmd

ソースコードの品質向上のための効果的で効率的なコードレビューを読んで、循環的複雑度(サイクロマティック数)を手っ取り早く測定してみたくなったので、GradleとPMDで試してみました。

この辺を読めば割と簡単にできます。プロジェクトとしてきちんと測定していくなら、現在お使いのGradleの設定ファイル*1にpmdタスクを追加してあげればいいんですけど、手元のプロジェクトでちょっと測定してみたい、というときに仕込みがだるいのでやっつけですが*2シェルスクリプトを用意してみました。

スクリプト

もう読んだそのままな感じで、pmd.gradleファイルとpmd-rules.xmlをカレントディレクトリに作って、gradleでPMDを実行して、その後一時ファイルを削除する、というだけのスクリプトです。

複雑度の測定結果はコンソールに出ます。
Mavenライクなsrc/main/java, src/main/testディレクトリありきで書いてるので、構成が違う人は適当にカスタマイズしてください。

あ、そうそう。gradleコマンドがパスに入ってることを前提にしてます。まだインストールしてない場合は先にGradleをインストールしましょう。Mac+Homebrewなら"brew install gradle"でOk.

実行結果例

Jenkinsのcore配下でやるとこんな感じ。なお、公開しても問題なくて、かつ、このスクリプトがうまく動くプロダクトを探してたらたまたまJenkinsがあっただけなので、このチョイスには他意は全くありません。あしからず。

[jenkins-git/core]$ pmd-adhoc
:pmd
Running PMD static code analysis

hudson/AbstractMarkupText.java:42       The class 'AbstractMarkupText' has a Cyclomatic Complexity of 2 (Highest = 8).
hudson/AbstractMarkupText.java:141      The method 'findTokens' has a Cyclomatic Complexity of 8.
hudson/ClassicPluginStrategy.java:58    The class 'ClassicPluginStrategy' has a Cyclomatic Complexity of 4 (Highest = 14).
hudson/ClassicPluginStrategy.java:77    The method 'createPluginWrapper' has a Cyclomatic Complexity of 14.
hudson/ClassicPluginStrategy.java:184   The method 'createClassLoader' has a Cyclomatic Complexity of 5.
hudson/ClassicPluginStrategy.java:213   The class 'DetachedPlugin' has a Cyclomatic Complexity of 4 (Highest = 5).
hudson/ClassicPluginStrategy.java:224   The method 'fix' has a Cyclomatic Complexity of 5.
hudson/ClassicPluginStrategy.java:259   The method 'load' has a Cyclomatic Complexity of 8.
hudson/ClassicPluginStrategy.java:314   The method 'parseClassPath' has a Cyclomatic Complexity of 6.
〜(省略)〜

なお、このスクリプトの実行または改造過程において何らかの被害が発生しても当方で責任は負いかねますので、自己責任でお願いします。

*1:もちろん使ってますよね?

*2:Gradleのマルチプロジェクト構成中のサブプロジェクトなんかにはそのまま実行できないのでご注意