Skip to content

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

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개

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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