본문 바로가기

Programing/OpenSource

[SonarQube] 메이븐(Maven) 프로젝트에서 커버리지 표시하기

Gradle 방식

내가 개발하던 팀은 주로 그레이들(Gradle)을 사용했다.

그래서 org.sonarqube 라는 이름의 플러그인을 사용해서 SonarQube 리포팅을 했기에 특별한 설정은 프로퍼티 정도만 추가로 해주었다.

그래서 build.gradle 에 아래와 같이 플러그인 DSL 만 명시해주면 ./gradlew sonar 라는 태스크를 이용해서 리포팅이 가능했다.

plugins {
  id "org.sonarqube" version "2.7.1"
}

sonarqube {
	properties {
		property "sonar.projectKey", "${artifactName}"
		property "sonar.projectName", "${artifactName}"
		property "sonar.sources", "src/main/java"
		property "sonar.tests", "src/test/groovy,src/functionaltest/groovy,src/test/java"
		property "sonar.java.binaries", "build/classes/java/main/"
		property "sonar.jacoco.reportPaths", "build/jacoco/test.exec"
	}
}

apply plugin: 'java'	// 소스코드
apply plugin: "jacoco"	// 커버리지 측정
apply plugin: 'groovy'	// spock framework는 그루비 코드라서

Maven 방식

그런데 옆 팀의 민규 님의 프로젝트는 메이븐으로 되어 있었다.

테스트 코드의 카운터는 나오는데 커버리지가 안나온다고 하였다.

리포트를 보았더니 정말 Coverage 항목이 0.0%로 표시되고 있었다.

해결책은

stackoverflow 에서 찾아보니 같은 증상의 문의 글이 있었다.

SonarQube not picking up Unit Test Coverage

16 votes를 받은 답변에는 JaCoCo 생성되는 파일을 Sonar가 읽을 수 있도록 경로를 정확히 설정하라고 되어 있었다.

민규 님의 해결책은?

pom.xml 에 org.jacoco 관련 추가를 했다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  // ...
  <properties>
    // ...
    <jacoco.version>0.8.6</jacoco.version>
  </properties>
  // ...
  <build>
    <plugins>
    // ...
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
        <executions>
          <execution>
            <goals>
              <goal>prepare-agent</goal>
            </goals>
          </execution>
          <execution>
            <id>report</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>report</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

아래 명령으로 로컬에서 돌려보니 이젠 커버리지가 표시된다.

./mvnw clean package sonar:sonar -Dsurefire.useSystemClassLoader=false

커버리지는 49.3%

이후에 커버리지가 표시가 안되는 현상이 있어서 호가인해보니 maven 프로젝트에서는 spock 테스트 코드를 돌려주는 gmavenplus-plugin 라는 플러그인이 있어야 했다.

      <plugin>
        <!-- The gmavenplus plugin is used to compile Groovy code. To learn more about this plugin,
        visit https://github.com/groovy/GMavenPlus/wiki -->
        <groupId>org.codehaus.gmavenplus</groupId>
        <artifactId>gmavenplus-plugin</artifactId>
        <version>1.11.0</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>compileTests</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

자세한 것은 spock-example 프로젝트의 pom.xml 을 참고한다.