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を見ながら起動と解析を行います。

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

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

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

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

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

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

「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」を解析してみました。

Spring Boot Play
Technical Dept 836d 174d 24d
Technical Dept Ratio 2.4% 2.0% 2.5%
Technical Dept Issue 34,083 6,698 1,122
Blocker 558 44 24
Critical 9.1k 3k 155
Major 18k 2.9k 494
Minor 730 730 391
Info 360 55 58
Coverage 69.2% ?? ??
Line Coverrage 71.3% ?? ??
Condition Coverage 64.5% ?? ??
Duplications 8.4% 2.4% 1.7%
Line of Code 553,626 139,060 15,500
Complexity 99,447 20,516 3,615
Complexity /function 1.8 1.6 1.6
Complexity /file 15.7 9.8 14.6
Complexity:0 2,761 1,011 128
Complexity:5 1,096 408 51
Complexity:10 1,075 382 37
Complexity:20 547 132 13
Complexity:30 518 121 18
Complexity:60 166 18 4
Complexity:90 177 14 7
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(品質基準)の値をまとめてみます。