SonarQubeからJUnitの結果とカバレッジテストの結果を確認した時のメモ。
ユニットテスト確認
JUnit5のサンプルをベースに動作確認する。
サンプルをcloneしてMavenのディレクトリに移動する。
git clone https://github.com/junit-team/junit5-samples.git
cd junit5-samples/junit5-jupiter-starter-maven
テスト実行前のディレクトリ構成はこのようになっている。
$ ls
README.md mvnw* mvnw.cmd pom-SNAPSHOT.xml pom.xml src/
サンプルのテストコードは/src/test/java/com/example/project/CalculatorTests.java
に置かれており、以下のようなシンプルなテストが5件格納されている。
class CalculatorTests {
@Test
@DisplayName("1 + 1 = 2")
void addsTwoNumbers() {
Calculator calculator = new Calculator();
assertEquals(2, calculator.add(1, 1), "1 + 1 should equal 2");
}
@ParameterizedTest(name = "{0} + {1} = {2}")
@CsvSource({
"0, 1, 1",
"1, 2, 3",
"49, 51, 100",
"1, 100, 101"
})
void add(int first, int second, int expectedResult) {
Calculator calculator = new Calculator();
assertEquals(expectedResult, calculator.add(first, second),
() -> first + " + " + second + " should equal " + expectedResult);
}
}
テストを実行する。
$ mvn clean test
:(省略)
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.project.CalculatorTests
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.122 s - in com.example.project.CalculatorTests
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
:(省略)
5件実施し全件成功していることが分かる。
実行後はtargetというディレクトリが作成され、テスト結果が保存される。
$ ls
README.md mvnw* mvnw.cmd pom-SNAPSHOT.xml pom.xml src/ target/
この状態でSonarQubeのスキャンを実行する。※この時に一緒にテストを実行するのでもOK。
mvn sonar:sonar \
-Dsonar.projectKey=maven-sample \
-Dsonar.host.url=https://mysonarqube.info \
-Dsonar.login=2577f240df389a5e4fbfaf6ff2fc5c52626aafc7
スキャン後、SonarQubeのProject -> Measures -> CoverageからUnitテストの結果が見れるようになる。
ただし、結果を見ると分かるが、カバレッジに関しては表示がない。SonarQube自体はカバレッジ測定機能を持っていないので、JUnitと同じように外部ツールでの実行結果を取り込む形で値を反映させる。
オフィシャルドキュメントの記載によると以下の言語に対応している模様。
- Java
- JavaScript/TypeScript
- .NET
- Python
- PHP
- C/C++/Objective-C
カバレッジテスト
オフィシャルドキュメントによるとJaCoCoをサポートしているようなので、JaCoCoでカバレッジテストを実行する。
JaCoCoは通常手順で利用すればよく、SonarQube向けに特殊なことをする必要はない。
JaCoCoを利用するために、サンプルのpom.xmlに以下の修正を入れる。
@@ -16,6 +16,11 @@
<dependencyManagement>
<dependencies>
+ <dependency>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.8.8</version>
+ </dependency>
<dependency>
<groupId>org.junit</groupId>
@@ -36,6 +41,11 @@
<build>
<plugins>
+ <plugin>
+ <groupId>org.jacoco</groupId>
+ <artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.8.8</version>
+ </plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
dependencyとpluginを設定したら、JaCoCoをsonar:sonar付きで実行する。
mvn jacoco:prepare-agent test jacoco:report sonar:sonar \
-Dsonar.projectKey=maven-sample \
-Dsonar.host.url=https://mysonarqube.info \
-Dsonar.login=2577f240df389a5e4fbfaf6ff2fc5c52626aafc7
実行後、SonarQube側でカバレッジテストの結果が確認できる。
コードのサマリ的な画面からもカバレッジ100%、JUnitのテスト件数5件も確認できた。
なお、カバレッジが100%を満たさないように、src/main/java/com/example/project/Calculator.java
に以下のコードを足してみる。
@@ -15,5 +15,7 @@
public int add(int a, int b) {
return a + b;
}
-
+ public int sub(int a, int b) {
+ return a - b;
+ }
}
JUnitではadd
に対するテストしか書いていないため、sub
がカバーできずにカバレッジ率は100%を切るはずだ。
これを先ほどと同じコマンドでJaCoCo&SonarQubeスキャンを実行した結果が以下となった。
WebUI上で
- カバレッジが100%ではないこと
- カバレッジが効いていない箇所
を確認することが出来た。