이번 게시글에서는 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%를 달성했습니다.(테스트 케이스 추가한건 스킵했습니다.)
'Spring' 카테고리의 다른 글
[java] Jsonparser, Gson 사용법 및 예제 (0) | 2021.03.05 |
---|---|
[spring] spring과 객체지향의 원리 (0) | 2021.02.28 |
[spring] 객체지향 설계의 5가지 원칙 with spring (SOLID) (0) | 2021.02.22 |
[Spring] 스프링 빈(Bean)이란? (0) | 2021.01.14 |
[Spring] 스프링 IOC(Inversion of Control)와 DI(Dependency Injection) (0) | 2021.01.14 |
댓글