2
3

More than 1 year has passed since last update.

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

Posted at

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スキャンを実行した結果が以下となった。
1659420460787.png

WebUI上で

  • カバレッジが100%ではないこと
  • カバレッジが効いていない箇所

を確認することが出来た。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3