-
Notifications
You must be signed in to change notification settings - Fork 102
Open
Description
작업 배경
현황 분석 결과
프로젝트의 테스트 자동화 현황을 분석한 결과, 다음과 같은 문제점이 발견되었습니다:
📊 테스트 통계
- 전체 Java 파일: 92개
- 메인 소스 파일: 72개
- 테스트 파일: 16개 (22.2%)
- 테스트 케이스: 105개
- 테스트 성공률: 100% (모든 테스트 통과)
✅ 잘된 점
-
테스트 코드 품질
- BDD 스타일 (given-when-then) 일관성 있게 적용
@DisplayName사용으로 테스트 의도 명확화- Mockito를 활용한 효과적인 단위 테스트
@ParameterizedTest활용으로 다양한 엣지 케이스 커버
-
테스트 대상 레이어
- Service 레이어: 5개 클래스 테스트 (ArticleService, UserService, TagService, UserRelationshipService, ArticleCommentService)
- Model 레이어: 4개 클래스 테스트 (User, Tag, UserFollow, ArticleFacets)
- Config 레이어: 일부 테스트 존재
❌ 개선이 필요한 점
-
Controller 레이어 테스트 부재 (Critical)
- 6개 컨트롤러 모두 테스트 없음
- ArticleController
- UserController
- TagController
- UserRelationshipController
- ArticleCommentController
- ArticleFavoriteController
- API 엔드포인트 검증 불가
- HTTP 요청/응답 처리 로직 미검증
- 6개 컨트롤러 모두 테스트 없음
-
Repository 레이어 테스트 부재 (High)
- 데이터베이스 연동 로직 미검증
- 쿼리 정확성 검증 불가
-
테스트 커버리지 측정 도구 부재 (High)
- JaCoCo 등 커버리지 도구 미설정
- 실제 코드 커버리지 수치 불명확 (추정 30-40%)
-
통합 테스트 부재 (Medium)
- Spring Boot 컨텍스트 로드 테스트만 존재
- 실제 API 통합 테스트 없음
- 데이터베이스 통합 테스트 없음
-
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주)
참고 자료
- JaCoCo Documentation
- Spring Boot Testing Best Practices
- TestContainers Documentation
- MockMvc Documentation
증거 자료
테스트 구조 현황
테스트 파일 분포:
├── 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
Labels
No labels