본문 바로가기
Spring

[Jacoco] Jacoco 사용법 및 예제(maven)

by devjh 2021. 1. 20.
반응형

이번 게시글에서는 jacoco 사용법에 대해서 알아보겠습니다.

 

1. Jacoco란?

Java code coverage의 약자로 

junit 테스트의 결과를 바탕으로 커버리지를 결과를 리포트 해주는 툴 입니다.

특히 코드정적분석도구인 sonarqube와 연계하여 사용하는 경우가 많습니다.

 

2. Pom.xml

<plugin>
	<groupId>org.jacoco</groupId>
	<artifactId>jacoco-maven-plugin</artifactId>
	<version>0.8.2</version>
	<executions>
		<execution>
			<goals>
				<goal>prepare-agent</goal>
			</goals>
		</execution>
		<execution>
			<id>report</id>
			<phase>test</phase>
			<goals>
				<goal>report</goal>
			</goals>
		</execution>
	</executions>
</plugin>

 

jacoco 플러그인을 추가해 줍니다.

 

 

2. JacocoController.java 작성

package com.example.jacocotest;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JacocoController {
    
    @GetMapping("/test")
    public String test(@RequestParam int n) {

        if (n >= 0) {
            return "hello";
        } else {
            return "world";
        }
    }
}

 

param으로 0이상의 값이 오면 hello를

아니라면 world를 리턴해주는 컨트롤러를 작성합니다.

 

 

3. JacocoControllerTest.java 작성

package com.example.jacocotest;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

@SpringBootTest
@AutoConfigureMockMvc
public class JacocoControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void test() throws Exception {
        mvc.perform(get("/test")
                .param("n", "3"))
                .andExpect(content().string("hello"))
                .andExpect(status().isOk());
    }
}

 

0 보다 큰 값인 3을 넣어서 controller를 테스트하는 테스트코드를 작성합니다.

 

 

4. mvn package

mvn package 명령어를 입력합니다.

maven의 라이프사이클의 phase는 

validate → compile →test → package → install → deploy

test이후 package를 할때 Jacoco가 활약하므로 package까지만 입력해줘도 Jacoco를 사용 할 수 있습니다.

 

 

5. 결과확인방법

 

target/site/jacoco/index.html

해당 html파일을 열어봅니다.

 

6. 결과화면

 

html파일을 실행하면 해당 화면이 나옵니다.

JacocoApllication.java 와 JacocoController.java의 커버리지가 측정 된 것을 확인 할 수 있습니다.

 

컨트롤러를 들어가서 확인해 보겠습니다.

 

 

각 색상은 다음을 의미합니다.

  • 초록색 : 테스트가 진행 된 부분
  • 노란색 : 조건, 결정 커버리지가 모두 충족되지 않은 부분
  • 빨간색 : 커버리지가 진행되지 않은 부분

 

7. 커버리지 모두 채우기(main문 날려버리기)

 

JacocoController의 커버리지는 테스트케이스를 추가하면 모두 날려버릴 수 있을것 같은데

메인문이 문제입니다.

 

테스트하기도 까다롭다는 static메서드에 이 클래스를 꼭 테스트해야하나 라는 생각이 듭니다...

 

제거해줍니다.

Pom.xml

<plugin>
  <groupId>org.jacoco</groupId>
  <artifactId>jacoco-maven-plugin</artifactId>
  <version>0.8.2</version>

  <configuration>
    <excludes>
    	<exclude>**/*Application.class</exclude>
    </excludes>
  </configuration>

  <executions>
  
  	....
  
  </executions>
</plugin>

 

plugin쪽에 configuration으로 Application.class로 끝나는애들을 exclude 시켜줍니다.

 

8. 결과화면

 

JacocoApllication.java가 사라지고 커버리지 100%를 달성했습니다.(테스트 케이스 추가한건 스킵했습니다.)

반응형

댓글