Skip to content

테스트 자동화 개선 - 테스트 커버리지 향상 및 품질 강화 #12

@serithemage

Description

@serithemage

작업 배경

현황 분석 결과

프로젝트의 테스트 자동화 현황을 분석한 결과, 다음과 같은 문제점이 발견되었습니다:

📊 테스트 통계

  • 전체 Java 파일: 92개
  • 메인 소스 파일: 72개
  • 테스트 파일: 16개 (22.2%)
  • 테스트 케이스: 105개
  • 테스트 성공률: 100% (모든 테스트 통과)

✅ 잘된 점

  1. 테스트 코드 품질

    • BDD 스타일 (given-when-then) 일관성 있게 적용
    • @DisplayName 사용으로 테스트 의도 명확화
    • Mockito를 활용한 효과적인 단위 테스트
    • @ParameterizedTest 활용으로 다양한 엣지 케이스 커버
  2. 테스트 대상 레이어

    • Service 레이어: 5개 클래스 테스트 (ArticleService, UserService, TagService, UserRelationshipService, ArticleCommentService)
    • Model 레이어: 4개 클래스 테스트 (User, Tag, UserFollow, ArticleFacets)
    • Config 레이어: 일부 테스트 존재

❌ 개선이 필요한 점

  1. Controller 레이어 테스트 부재 (Critical)

    • 6개 컨트롤러 모두 테스트 없음
      • ArticleController
      • UserController
      • TagController
      • UserRelationshipController
      • ArticleCommentController
      • ArticleFavoriteController
    • API 엔드포인트 검증 불가
    • HTTP 요청/응답 처리 로직 미검증
  2. Repository 레이어 테스트 부재 (High)

    • 데이터베이스 연동 로직 미검증
    • 쿼리 정확성 검증 불가
  3. 테스트 커버리지 측정 도구 부재 (High)

    • JaCoCo 등 커버리지 도구 미설정
    • 실제 코드 커버리지 수치 불명확 (추정 30-40%)
  4. 통합 테스트 부재 (Medium)

    • Spring Boot 컨텍스트 로드 테스트만 존재
    • 실제 API 통합 테스트 없음
    • 데이터베이스 통합 테스트 없음
  5. E2E 테스트 부재 (Medium)

    • 사용자 시나리오 기반 테스트 없음

작업 내용

Phase 1: 테스트 인프라 구축 (우선순위: High)

1.1 테스트 커버리지 측정 도구 설정

  • JaCoCo 플러그인 추가
  • 커버리지 리포트 생성 설정
  • CI/CD 파이프라인에 커버리지 체크 통합
  • 최소 커버리지 기준 설정 (목표: 80%)
// build.gradle.kts 추가 예시
plugins {
    jacoco
}

jacoco {
    toolVersion = "0.8.11"
}

tasks.test {
    finalizedBy(tasks.jacocoTestReport)
}

tasks.jacocoTestReport {
    dependsOn(tasks.test)
    reports {
        xml.required.set(true)
        html.required.set(true)
    }
}

tasks.jacocoTestCoverageVerification {
    violationRules {
        rule {
            limit {
                minimum = "0.80".toBigDecimal()
            }
        }
    }
}

1.2 테스트 환경 개선

  • TestContainers 추가 (데이터베이스 통합 테스트용)
  • MockMvc 설정 (Controller 테스트용)
  • 테스트 픽스처 개선 및 재사용성 향상

Phase 2: Controller 레이어 테스트 작성 (우선순위: Critical)

각 컨트롤러별 테스트 작성:

2.1 UserController 테스트

  • POST /api/users - 회원가입 테스트
  • POST /api/users/login - 로그인 테스트
  • GET /api/user - 현재 사용자 조회 테스트
  • PUT /api/user - 사용자 정보 수정 테스트
  • 인증/인가 실패 케이스 테스트

2.2 ArticleController 테스트

  • GET /api/articles - 아티클 목록 조회 테스트
  • GET /api/articles/feed - 피드 조회 테스트
  • GET /api/articles/:slug - 아티클 상세 조회 테스트
  • POST /api/articles - 아티클 생성 테스트
  • PUT /api/articles/:slug - 아티클 수정 테스트
  • DELETE /api/articles/:slug - 아티클 삭제 테스트
  • 페이지네이션 테스트
  • 필터링 테스트

2.3 기타 컨트롤러 테스트

  • TagController 테스트
  • UserRelationshipController 테스트
  • ArticleCommentController 테스트
  • ArticleFavoriteController 테스트

Phase 3: Repository 레이어 테스트 작성 (우선순위: High)

3.1 데이터베이스 통합 테스트

  • UserRepository 테스트 (@DataJpaTest)
  • ArticleRepository 테스트 (@DataJpaTest)
  • TagRepository 테스트 (@DataJpaTest)
  • 복잡한 쿼리 정확성 검증
  • 트랜잭션 롤백 검증

Phase 4: 통합 테스트 작성 (우선순위: Medium)

4.1 API 통합 테스트

  • 회원가입 → 로그인 → 아티클 작성 플로우
  • 팔로우 → 피드 조회 플로우
  • 아티클 좋아요 → 조회 플로우
  • 댓글 작성 → 조회 플로우

4.2 데이터베이스 통합 테스트

  • 실제 데이터베이스 연동 테스트 (TestContainers 활용)
  • 캐시 동작 검증 테스트

Phase 5: 테스트 품질 개선 (우선순위: Low)

5.1 테스트 커버리지 향상

  • 엣지 케이스 추가
  • 예외 처리 케이스 강화
  • 동시성 테스트 추가

5.2 E2E 테스트 추가 (선택적)

  • Selenium/Playwright 기반 E2E 테스트
  • 주요 사용자 시나리오 테스트

인수 조건

1. 테스트 커버리지 기준

  • Line Coverage: 최소 80% 이상
  • Branch Coverage: 최소 70% 이상
  • Class Coverage: 최소 85% 이상

2. Controller 레이어 테스트

  • 모든 컨트롤러(6개)에 대한 테스트 작성 완료
  • 각 엔드포인트별 정상/예외 케이스 최소 2개 이상
  • HTTP 상태 코드 검증
  • 응답 본문 검증
  • 인증/인가 검증

3. Repository 레이어 테스트

  • 주요 Repository 클래스(최소 5개) 테스트 작성
  • 복잡한 쿼리에 대한 정확성 검증
  • TestContainers를 활용한 실제 DB 연동 테스트

4. 테스트 인프라

  • JaCoCo 설정 완료 및 리포트 생성 가능
  • CI/CD 파이프라인에 커버리지 체크 통합
  • 커버리지 미달 시 빌드 실패 설정

5. 테스트 품질

  • 모든 테스트 성공률 100% 유지
  • 테스트 실행 시간 5분 이내 (단위/통합 테스트 합산)
  • 플레이키 테스트 0개
  • 테스트 코드 리뷰 및 승인 완료

6. 문서화

  • 테스트 작성 가이드 문서화
  • README에 테스트 실행 방법 추가
  • 커버리지 배지 추가

예상 일정

  • Phase 1 (테스트 인프라 구축): 2일
  • Phase 2 (Controller 테스트): 5일
  • Phase 3 (Repository 테스트): 3일
  • Phase 4 (통합 테스트): 3일
  • Phase 5 (품질 개선): 2일

총 예상 기간: 약 15일 (3주)


참고 자료


증거 자료

테스트 구조 현황

테스트 파일 분포:
├── module/core/src/test/java
│   ├── model (4개)
│   │   ├── ArticleFacetsTest.java ✓
│   │   ├── TagTest.java ✓
│   │   ├── UserFollowTest.java ✓
│   │   └── UserTest.java ✓
│   └── service (5개)
│       ├── ArticleCommentServiceTest.java ✓
│       ├── ArticleServiceTest.java ✓
│       ├── TagServiceTest.java ✓
│       ├── UserRelationshipServiceTest.java ✓
│       └── UserServiceTest.java ✓
├── module/persistence/src/test/java
│   └── config (1개)
│       └── CacheNameTest.java ✓
└── server/api/src/test/java
    ├── RealWorldApplicationTest.java ✓
    ├── api/response (1개)
    │   └── ProfileResponseTest.java ✓
    └── config (4개)
        ├── ApplicationExceptionHandlerTest.java ✓
        ├── AuthTokenResolverTest.java ✓
        ├── ObjectMapperConfigurationTest.java ✓
        └── SecurityPasswordEncoderAdapterTest.java ✓

미테스트 영역:
├── Controller 레이어 (0/6) ❌
│   ├── ArticleController.java
│   ├── ArticleCommentController.java
│   ├── ArticleFavoriteController.java
│   ├── TagController.java
│   ├── UserController.java
│   └── UserRelationshipController.java
└── Repository 레이어 (0/7) ❌
    ├── ArticleRepository.java
    ├── ArticleCommentRepository.java
    ├── ArticleFavoriteRepository.java
    ├── TagRepository.java
    ├── UserRepository.java
    └── UserRelationshipRepository.java

테스트 실행 결과

  • 총 테스트 케이스: 105개
  • 성공: 105개 (100%)
  • 실패: 0개
  • 건너뜀: 0개

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions