Skip to content

Testing Strategy

TAEHEON KIM edited this page Jun 27, 2026 · 2 revisions

Testing Strategy

테스트 구조

단위 테스트 (Unit) — Fake 구현체 | v 컨트롤러 테스트 (Slice) — @WebMvcTest + MockMvc | v 통합 테스트 (Integration) — TestContainers | v 인수 테스트 (Acceptance) — RestAssured + TestContainers E2E | v 스파이크 테스트 (Spike) — k6


단위 테스트

  • JUnit5
  • application 모듈 서비스 레이어: Fake 구현체로 외부 의존성 대체
    • FakeApplyRepository, FakeStudyPostRepository, FakeUserRepository 등 인메모리 구현체
    • FakeKafkaMessagePublisher, FakeRedisMessagePublisher
    • Mock(Mockito)과 달리 실제 동작 로직이 있어 결과 기반으로 검증

컨트롤러 테스트

  • @WebMvcTest + MockMvc
  • presentation 모듈: Controller 슬라이스만 로딩
  • UseCase는 Mockito Mock 처리
  • 인증(SecurityMockMvcRequestPostProcessors.authentication) 포함 요청 검증
  • HTTP 상태 코드, 응답 JSON 구조 검증

통합 테스트

  • TestContainers 기반 실제 인프라 사용
    • MySQL 8.0.36 컨테이너
    • Redis 7.4 컨테이너
  • AbstractIntegrationTest 상속으로 컨테이너 공유 (클래스별 재시작 없음)
  • @SpringBootTest + 실제 Bean 주입
  • infrastructure 모듈 Repository 레이어 쿼리 정확성, 트랜잭션 검증

의존성 처리 원칙

의존성 처리 방식
MySQL TestContainers 실제 컨테이너
Redis TestContainers 실제 컨테이너
Kafka FakeKafkaMessagePublisher
Elasticsearch @MockitoBean

인수 테스트

  • @SpringBootTest(webEnvironment = RANDOM_PORT) + RestAssured
  • AbstractAcceptanceTest에서 TestContainers(MySQL, Redis, Kafka) 공유
  • Elasticsearch는 @MockitoBean 처리
  • Kakao OAuth 우회: UserRepository로 유저 직접 생성, JwtProvider로 토큰 발급

구현된 시나리오

테스트 검증 내용
PostAcceptanceTest 게시글 생성/수정/삭제, 권한 검증
RecruitFlowAcceptanceTest 게시글 → 지원 → 승인 → 팀원 목록 확인 전체 흐름
ChatFlowAcceptanceTest 팀원 채팅 조회, 비팀원 403
ScheduleNotificationAcceptanceTest 일정 생성 시 Outbox 이벤트 팀원 수만큼 저장 확인
IdempotencyAcceptanceTest 동일 Idempotency-Key 재요청 → 1건만 처리
RateLimitAcceptanceTest 제한 초과 → 429, 다른 유저는 독립적으로 제한

스파이크 테스트

  • 도구: k6
  • 목적: 갑작스러운 트래픽 급증 시 방어 장치(Circuit Breaker, Rate Limiter, HikariCP) 동작 검증
  • 패턴: 정상 부하(100 VU) → 10초 만에 급증(1,000 VU) → 피크 유지 → 복구 확인

스크립트 구성

스크립트 검증 항목
spike-db.js 1,000 VU 급증 시 DB 커넥션 풀 및 응답 안정성
spike-search.js ES 검색 Circuit Breaker 동작 및 복구
spike-rate-limit.js Rate Limiter 429 반환 및 500 에러 0건 확인
spike-idempotency.js 동시 중복 요청 처리 안정성

실측 결과

spike-db.js (DB 커넥션 풀)

지표 결과
p(95) 3.01s
에러율 3.69%
발견된 병목 HikariPool 10개 포화, waiting 174개 → 타임아웃 발생

단일 서버 한계. 실무라면 Read Replica 분리 또는 수평 확장으로 해결.

spike-search.js (ES Circuit Breaker)

지표 결과
p(95) 170ms
에러율 0%
checks 100%

1,000 VU 급증에서도 Circuit Breaker가 정상 동작, 500 에러 0건.

spike-rate-limit.js (Rate Limiter)

지표 결과
p(95) 232ms
에러율 0%
checks 99.99%

초당 2,493건 처리, Rate Limit 초과 요청은 429 반환, 500 에러 0건.

spike-idempotency.js (멱등성)

지표 결과
p(95) 147ms
에러율 0%
checks 99.99%

동시 중복 요청에서 201/409/429만 반환, 500 에러 0건.


부하 테스트

  • 도구: k6
  • 테스트 규모: 10,000 VUs, sleep(1s) 기준 실질 동시 요청 약 20건

측정 지표

  • RPS, p(95) 응답시간, 에러율, 커넥션 풀 포화 여부
  • 최적화 전후 수치 비교로 개선 효과 정량 검증

Clone this wiki locally