테스트 커버리지 가이드

JaCoCo를 사용한 테스트 커버리지 분석

청약플래닛 백엔드 관련 문서입니다.

JaCoCo 설정

프로젝트에 JaCoCo가 이미 설정되어 있으며, 다음과 같은 기능을 제공합니다:

커버리지 리포트 생성

./gradlew test jacocoTestReport

커버리지 검증 (최소 기준 확인)

./gradlew jacocoTestCoverageVerification

전체 검증 (테스트 + 커버리지)

./gradlew check

현재 커버리지 현황

전체 프로젝트 현황 (2025-06-26 기준)

  • 전체 라인 커버리지: 7% (183/2613)
  • 클래스 커버리지: 38.4% (58/151)
  • 메서드 커버리지: 9.4% (105/1121)
  • 브랜치 커버리지: 0% (0/3130)

커버리지 목표 기준

전체 프로젝트

서비스 클래스

제외 대상

다음 클래스/패키지는 커버리지 계산에서 제외됩니다:

설정 클래스

데이터 클래스

예외 처리

상수 및 열거형

생성된 코드

리포트 확인

HTML 리포트

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

브라우저에서 열어 시각적으로 커버리지를 확인할 수 있습니다.

XML 리포트

build/reports/jacoco/test/jacocoTestReport.xml

CI/CD 도구나 SonarQube 등에서 사용할 수 있는 표준 형식입니다.

CSV 리포트

build/reports/jacoco/test/jacocoTestReport.csv

스프레드시트나 데이터 분석에 사용할 수 있는 형식입니다.

Given-When-Then 테스트 패턴

프로젝트의 모든 테스트는 Given-When-Then 패턴을 따릅니다:

@Test
@DisplayName("사용자 생성 성공 테스트")
void givenValidUserData_whenCreateUser_thenReturnCreatedUser() {
    // Given: 테스트 전제조건 설정
    String email = "test@test.com";
    SignupRequestDTO requestDTO = new SignupRequestDTO(email, "password", "username");
    given(userRepository.findByEmail(email)).willReturn(Optional.empty());

    // When: 테스트 대상 메서드 실행
    User result = userService.signup(requestDTO);

    // Then: 결과 검증
    assertThat(result.getEmail()).isEqualTo(email);
    then(userRepository).should().save(any(User.class));
}

커버리지 향상 방법

1. 서비스 레이어 테스트

2. 브랜치 커버리지

3. 경계값 테스트

예시 테스트 구조

UserServiceTest

@ExtendWith(MockitoExtension.class)
class UserServiceTest {

    @Mock private UserRepository userRepository;
    @Mock private PasswordEncoder passwordEncoder;
    @InjectMocks private UserService userService;

    // 성공 시나리오 테스트
    @Test void givenValidData_whenAction_thenSuccess() { }

    // 실패 시나리오 테스트
    @Test void givenInvalidData_whenAction_thenThrowException() { }

    // 경계값 테스트
    @Test void givenEdgeCase_whenAction_thenHandleCorrectly() { }
}

테스트 실행 권장사항

개발 중

# 특정 클래스 테스트
./gradlew test --tests UserServiceTest

# 특정 메서드 테스트
./gradlew test --tests UserServiceTest.givenValidData_whenCreateUser_thenSuccess

커밋 전

# 전체 테스트 + 커버리지 검증
./gradlew check

CI/CD 파이프라인

# 테스트 실행 + 리포트 생성
./gradlew test jacocoTestReport

# 커버리지 기준 검증
./gradlew jacocoTestCoverageVerification

트러블슈팅

커버리지가 기준에 미달하는 경우

  1. `build/reports/jacoco/test/html/index.html`에서 상세 리포트 확인
  2. 커버되지 않은 라인/브랜치 식별
  3. 해당 부분에 대한 테스트 추가

테스트 실행 실패

  1. Java 17이 설치되어 있는지 확인
  2. `JAVA_HOME` 환경변수 설정 확인
  3. 의존성 충돌 여부 확인

성능 이슈

  1. 테스트 데이터 최소화
  2. Mock 객체 적절히 활용
  3. 무거운 통합 테스트는 별도 분리

우선 개선 영역

현재 커버리지 현황에 따른 우선 개선 영역:

높은 우선순위

중간 우선순위

추가 도구 연동

SonarQube

./gradlew sonarqube -Dsonar.host.url=http://localhost:9000

IDE 플러그인

GitHub Actions

- name: Test with Gradle
  run: ./gradlew test jacocoTestReport

- name: Upload coverage to Codecov
  uses: codecov/codecov-action@v3