skill/Java.Kotlin

jacoco 개념 + 외부 연동 MockkBean 처리

have a nice day :D 2025. 9. 15. 22:15
반응형


---

1. Jacoco란?

Java Code Coverage의 줄임말 (JaCoCo)

Java, Kotlin 애플리케이션에서 테스트 코드가 실제로 소스 코드를 얼마나 실행했는지 측정하는 라이브러리

테스트를 돌렸을 때 → 어떤 클래스, 메서드, 라인, 분기가 실행되었는지 기록하고 → 보고서(HTML, XML, CSV)로 보여줍니다.



---

2. 왜 필요할까?

단위테스트가 충분히 작성되었는지 객관적으로 수치화

단순히 “테스트 통과”만으로는 부족 → 실제로 코드 커버리지를 봐야 테스트 범위 알 수 있음

QA, 감리, 팀 내 품질 지표로 활용 가능

Jenkins, SonarQube 같은 CI/CD 품질 게이트와 연동해 커버리지가 일정 % 미만이면 빌드 실패로 막을 수 있음



---

3. 커버리지 종류

JaCoCo는 여러 수준의 커버리지를 제공합니다:

1. Line Coverage (라인 커버리지)

실행된 소스 코드 줄 수 / 전체 코드 줄 수

가장 기본적인 지표



2. Branch Coverage (분기 커버리지)

if, switch, for, while 같은 분기문이 참/거짓 모두 실행됐는지 측정

예: if (x > 0) 코드가 있으면, x>0 과 x<=0 둘 다 테스트해야 100%



3. Method Coverage

정의된 메서드 중 몇 개가 호출되었는지



4. Class Coverage

전체 클래스 중 몇 개가 실행됐는지





---

4. 동작 방식

테스트 실행 시 JVM에 에이전트(Agent) 를 붙여서, 바이트코드 레벨에서 어떤 라인이 실행되는지 기록

테스트가 끝나면 .exec 파일에 기록 → jacocoTestReport 태스크로 HTML/XML 리포트 생성



---

5. Gradle 기본 설정 (build.gradle.kts)

plugins {
    jacoco
}

tasks.test {
    useJUnitPlatform()
}

jacoco {
    toolVersion = "0.8.11" // 최신 안정 버전
}

tasks.jacocoTestReport {
    dependsOn(tasks.test)
    reports {
        xml.required.set(true)   // Jenkins 연동
        html.required.set(true)  // 로컬 확인용
    }
}

실행:

./gradlew test jacocoTestReport

리포트 위치:

HTML: build/reports/jacoco/test/html/index.html

XML:  build/reports/jacoco/test/jacocoTestReport.xml



---

6. 결과 해석

리포트에는 클래스별로 라인 커버리지/분기 커버리지/메서드 커버리지가 색깔로 표시

녹색: 테스트로 실행된 부분

빨강: 실행되지 않은 부분


예: UserService 클래스의 if문 한쪽만 테스트 → 라인 커버리지는 올라가도 분기 커버리지는 낮게 나옴



---

7. 보통 쓰는 방식

개발자: 로컬에서 확인하며 테스트 보강

CI: Jenkins/GitLab CI에서 자동 실행 → JaCoCo 리포트 생성 → SonarQube 같은 품질 도구가 “커버리지 <70% → 빌드 실패” 처리

QA/감리: 리포트를 근거 자료로 활용



---

✅ 정리

JaCoCo = 코드 커버리지 측정 도구

JUnit/Kotest 같은 테스트 프레임워크와 함께 사용

커버리지 지표(라인, 분기 등)를 리포트로 생성

CI 품질 관리/QA 증적에 많이 활용



---

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerSmokeIT(
    @Autowired val mockMvc: MockMvc
) {
    @MockkBean
    lateinit var dataConnector: DataConnector   // 운영 Bean 대신 Mock으로 대체

    @Test
    fun `GET 사용자 조회 API가 200을 리턴한다`() {
        // 외부 호출을 막고, 응답만 대충 리턴
        every { dataConnector.fetchUser(any()) } returns User(1L, "Kim")

        mockMvc.perform(get("/api/users/1"))
            .andExpect(status().isOk)
            .andExpect(content().contentType("application/json"))
    }
}

반응형

'skill > Java.Kotlin' 카테고리의 다른 글

Jacoco url 기준 테스트  (0) 2025.09.16
Jacoco 리포트 화면  (0) 2025.09.16
where in 조건 갯수 제한  (2) 2025.07.30
MinIO 403 오류 확인:access/secret key 정상 확인  (3) 2025.07.28
Kotlin UTC  (3) 2025.06.12