SonnarQubeを使って有名どころJavaフレームワークの品質を解析してみた

inspected-with-SQ-256

ソース解析を使って技術的負債を管理するツール「SonarQube」を使って、有名所のJavaフレームワーク(Spring、Spring Boot、Play Framework)を解析してみました。それぞれの解析結果の平均値を調べて、「Quality Gates」の値を調整できないかなと考えたからです。

SonnarQubeのインストールと解析まで

Requirementsにあるように、「Oracle JRE 7 onwards or OpenJDK 7 onwards」がインストールされていれば簡単に動かせます。今回はWindows環境で試しています。

Get Started in Two Minutesを見ながら起動と解析を行います。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile1.txt

これで「http://localhost:9000」にアクセスすればSonarQubeが起動しているはずです。では、次にソースの解析へと進みます。ここからSonarQube Scannerをダウンロードして以下のディレクトリに置いておきます。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile2.txt

さらに、解析するソースコードも置いておきます。ここではSpring Bootのソースを使っています。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile3.txt

解析するソースディレクトリに移動してsonar-scanner.batを叩きます。sonar-runner.batを使おうとすると、「* WARN: sonar-runner.bat script is deprecated. Please use sonar-scanner.bat instead.」と「廃止するよん」というメッセージが出るので、scannerを使います。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile4.txt

怒られました。どうもプロパティの設定が必要みたいです。プロパティファイルは以下にあるので、パラメタを確認しながら設定します。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile5.txt

設定した値はこんな感じです。基本的にMavenの値をそのままつっこんでいます。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile6.txt

sonar.sourcesにはソースファイルの場所を指定しますが、ここでは全srcフォルダーではなく一部に絞っています。設定後、もう一回Scannerコマンドを叩きます。

https://gist.github.com/daipresents/75060fcc156eeb80d424167ce77809d5.js?file=gistfile7.txt

「http://localhost:9000」を開くと、PROJECTSに解析したプロジェクトが表示されるはずです。大きいプロジェクトは解析に時間がかかるので、表示されない場合はコンソールに表示されたURL「http://localhost:9000/dashboard/index/org.springframework.boot:spring-boot-build」にアクセスします。右上にぐるぐるマークが表示されていればまだ解析中ってことです。

この方法で「Spring Framework 4.3.0.BUILD-SNAPSHOT」、「Spring Boot 1.4.0.BUILD-SNAPSHOT」、「Pkay Framework 2.5.2」を解析してみました。

 SpringBootPlay
Technical Dept836d174d24d
Technical Dept Ratio2.4%2.0%2.5%
Technical Dept Issue34,0836,6981,122
Blocker5584424
Critical9.1k3k155
Major18k2.9k494
Minor730730391
Info3605558
Coverage69.2%????
Line Coverrage71.3%????
Condition Coverage64.5%????
Duplications8.4%2.4%1.7%
Line of Code553,626139,06015,500
Complexity99,44720,5163,615
Complexity /function1.81.61.6
Complexity /file15.79.814.6
Complexity:02,7611,011128
Complexity:51,09640851
Complexity:101,07538237
Complexity:2054713213
Complexity:3051812118
Complexity:60166184
Complexity:90177147
Comments (%)21.1%10.1%24.6%

解析だけではカバレッジは出なかったので、Springだけここからとってきました。歴史あるプロジェクトは、負債がたまってる感じがしますね。ポイントとしては

  • Technical Dept Ratio(技術的負債率)は、どれも2.5%以下
  • Dublications(重複するコード)は、どれも10%以下
  • Complexity /function(ファンクションごとの複雑度)は、どれも2以下
  • Complexity /file(ファイルごとの複雑度)は、どれも16以下

あたりの数値レベルですね。Complexity は平均値なのでしょうか? 平均だと数値が均されてしまうのが怖い気がします。

複雑度90が気になったので、一番複雑と思われるファイルMethodWriter.javaを見てみましたが、重複があったり、ケース分けが読みにくかったりしますね。ただ、一概にこれが悪いって感じもしないので、曇りなき眼での判定は必要そうです。

今度、有名どころを参考に、Quality Gate(品質基準)の値をまとめてみます。

広告