-
Notifications
You must be signed in to change notification settings - Fork 0
Testing Strategy
TAEHEON KIM edited this page Jun 27, 2026
·
2 revisions
단위 테스트 (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) 응답시간, 에러율, 커넥션 풀 포화 여부
- 최적화 전후 수치 비교로 개선 효과 정량 검증