SonarQubeでユニットテストとカバレッジテストの結果を確認する

SonarQubeからJUnitの結果とカバレッジテストの結果を確認した時のメモ。

## ユニットテスト確認

[JUnit5のサンプル](https://github.com/junit-team/junit5-samples)をベースに動作確認する。\
サンプルをcloneしてMavenのディレクトリに移動する。
```
git clone https://github.com/junit-team/junit5-samples.git
cd junit5-samples/junit5-jupiter-starter-maven
```
テスト実行前のディレクトリ構成はこのようになっている。
```shell
$ ls
README.md         mvnw*             mvnw.cmd          pom-SNAPSHOT.xml  pom.xml           src/
```
サンプルのテストコードは`/src/test/java/com/example/project/CalculatorTests.java`に置かれており、以下のようなシンプルなテストが5件格納されている。
```java
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);
	}
}
```


テストを実行する。
```shell
$ 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というディレクトリが作成され、テスト結果が保存される。

```shell
$ ls
README.md         mvnw*             mvnw.cmd          pom-SNAPSHOT.xml  pom.xml           src/              target/
```
この状態でSonarQubeのスキャンを実行する。※この時に一緒にテストを実行するのでもOK。
```shell
mvn sonar:sonar \
  -Dsonar.projectKey=maven-sample \
  -Dsonar.host.url=https://mysonarqube.info \
  -Dsonar.login=2577f240df389a5e4fbfaf6ff2fc5c52626aafc7
```


スキャン後、SonarQubeのProject -> Measures -> CoverageからUnitテストの結果が見れるようになる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/d4a3e5e8-d151-fe96-ca29-e42fc4ca561b.png" width="300">

ただし、結果を見ると分かるが、カバレッジに関しては表示がない。SonarQube自体はカバレッジ測定機能を持っていないので、JUnitと同じように外部ツールでの実行結果を取り込む形で値を反映させる。
[オフィシャルドキュメント](https://docs.sonarqube.org/latest/analysis/coverage/)の記載によると以下の言語に対応している模様。
- Java
- JavaScript/TypeScript
- .NET
- Python
- PHP
- C/C++/Objective-C
  
## カバレッジテスト
[オフィシャルドキュメント](https://docs.sonarqube.org/latest/analysis/test-coverage/java-test-coverage/)によるとJaCoCoをサポートしているようなので、JaCoCoでカバレッジテストを実行する。\
JaCoCoは通常手順で利用すればよく、SonarQube向けに特殊なことをする必要はない。\
JaCoCoを利用するために、サンプルのpom.xmlに以下の修正を入れる。
```diff
@@ -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付きで実行する。
```shell
mvn jacoco:prepare-agent test jacoco:report sonar:sonar \
  -Dsonar.projectKey=maven-sample \
  -Dsonar.host.url=https://mysonarqube.info \
  -Dsonar.login=2577f240df389a5e4fbfaf6ff2fc5c52626aafc7
```
実行後、SonarQube側でカバレッジテストの結果が確認できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/0f7686b9-2b5d-2c64-62cb-dab26c33c353.png" width="300">

コードのサマリ的な画面からもカバレッジ100%、JUnitのテスト件数5件も確認できた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/061dedb9-24e4-44ce-cab5-f1d17d010bba.png" width="600">


なお、カバレッジが100%を満たさないように、`src/main/java/com/example/project/Calculator.java`に以下のコードを足してみる。
```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スキャンを実行した結果が以下となった。
![1659420460787.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/779a5883-617f-e687-e763-02449acdf910.png)

WebUI上で
- カバレッジが100%ではないこと
- カバレッジが効いていない箇所
  
を確認することが出来た。