SonarQubeを純粋なJavaプロジェクトで利用した際のメモ
SonarQubeを使おうとした際にMavenやGradleから利用する記事はたくさん見つかりましたが、純粋なJavaのプログラムで使うにはどうすればいいか、意外と中々見つからなかったので、メモを残しておきます。
利用したソフトウェア
- JDK17
- SonarQube 10.5.1
- sonar-scanner-5.0.1
- Eclipse IDE 2024-03
処理のポイント
- 手動でJacocoレポートを作成して、それをsonar-scanner.batを走らせてSonarQubeに渡す
Javaプログラムソースで単体テストとカバレッジを確認
純粋なJavaのプロジェクトをEclipseで作成して、単体テストとカバレッジを実行する。
以下がアプリケーションのソース側のAppクラス。
package com.aksys;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test
void testHelloWorld() {
App app = new App();
assertEquals("Hello world!!", app.helloWorld());
}
@Test
void testMain() {
App.main(new String[]{});
assertTrue(true);
}
}
これをJUnitで単体テストするAppTestクラス。
package com.aksys;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class AppTest {
@Test
void testHelloWorld() {
App app = new App();
assertEquals("Hello world!!", app.helloWorld());
}
@Test
void testMain() {
App.main(new String[]{});
assertTrue(true);
}
}
Coverageレポートを作成してSonarQubeにレポートを渡す準備をする
EclipseのメニューからCoverageレポートを作成する。
カバレッジの結果が出力されるので、
カバレッジの結果をレポートにしてSonarQubeが読み取れる形式と場所にエクスポートする。
実施済みのカバレッジを右クリック、Export Sessionを選択する。
Export画面でFormatにXML fileを選択して、Destinationに出力先を記入する。
この出力先をsonar-project.properties(後述)のsonar.coverage.jacoco.xmlReportPathsと一致させる必要がある。
SonarCubeでローカルプロジェクトを作成する
Project keyはsonar-project.properties(後述)sonar.projectKeyと一致させる。
SonarCubeでトークンを作成 -> Locallyを選択
トークン(sqp_xxxx)が生成されるので手元にコピーしておく
Sonar Scannerを使う場合の設定ファイルsonar-project.propertiesを準備する
# SonarQubeサーバー
sonar.host.url=http://localhost:9000
sonar.token=sqp_... <注)SonarQubeで生成したトークンを入力>
# SonarQubeのプロジェクト情報
sonar.projectKey=HelloJavaSonar
# Javaのソースコードの場所
sonar.sources=C:/Git/GitHub/HelloJavaSonar/src
# Javaのテストコードの場所
sonar.tests=C:/Git/GitHub/HelloJavaSonar/test
# Javaのコンパイル結果の場所
sonar.java.binaries=C:/Git/GitHub/HelloJavaSonar/bin
# Junit結果
sonar.junit.reportPaths=bin/test-results/test/*
# Jacoco結果
sonar.coverage.jacoco.xmlReportPaths=C:/Git/GitHub/HelloJavaSonar/report/report.xml
# 各種ライブラリの場所 Eclipseが参照するライブラリ群でOK
sonar.java.libraries=C:/Users/xxxxx/.p2/pool/plugins/**/*.jar
sonar.java.test.libraries=C:/Users/xxxxx/.p2/pool/plugins/**/*.jar
sonar-scanner.batを実行
> sonar-scanner.bat
INFO: Scanner configuration file: C:\Program Files\SonarQube\sonar-scanner-5.0.1.3006-windows\bin\..\conf\sonar-scanner.properties
INFO: Project root configuration file: C:\Git\GitHub\HelloJavaSonar\sonar-project.properties
INFO: SonarScanner 5.0.1.3006
…
INFO: ANALYSIS SUCCESSFUL, you can find the results at: http://localhost:9000/dashboard?id=HelloJavaSonar
INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis report
INFO: More about the report processing at http://localhost:9000/api/ce/task?id=37ea3ed0-b627-4623-906f-7220d0a21f30
INFO: Analysis total time: 7.368 s
INFO: ------------------------------------------------------------------------
INFO: EXECUTION SUCCESS
INFO: ------------------------------------------------------------------------
INFO: Total time: 8.157s
INFO: Final Memory: 18M/74M
INFO: ------------------------------------------------------------------------
Exception in thread "Thread-0" java.lang.NoClassDefFoundError: ch/qos/logback/classic/spi/ThrowableProxy
EXECUTION SUCCESSが出ていれば、分析終了!
※なぜか最後に出るExceptionはここでは無視します。。
SonarQubeを確認
http://localhost:9000/dashboard?id=HelloJavaSonar
カバレッジの結果も確認できることが分かります。