
ソース解析を使って技術的負債を管理するツール「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」を解析してみました。
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(品質基準)の値をまとめてみます。