테스트는 자신을 위한 것이 아니다
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
- 소프트웨어 개발자, QA 엔지니어
- 초급에서 고급까지의 개발자 (테스트 작성 패턴 및 실무 문제점에 초점)
핵심 요약
- 의미 없는 테스트는 100% 커버리지보다 실제 비즈니스 로직을 검증하는 것이 중요
- 부실한 테스트의 대표 문제점:
- 비결정적 의존성 (예: random number generator
)로 인한 불안정한 테스트
- Getter/Setter와 같은 단순 로직의 테스트 (실제 오류 검증 불가)
- 중복된 if-else
로직의 반복 테스트 (불필요한 리드러블리티 저하)
- 고품질 테스트를 위한 핵심 원칙:
- AAA 패턴 (Arrange, Act, Assert) 적용
- 단일 책임 원칙(SRP): 1 테스트 = 1 시나리오
- 단위 테스트와 통합 테스트의 구분 (예: PHPUnit
활용)
섹션별 세부 요약
1. 테스트 작성 시 흔한 실수
- 불필요한 커버리지 추구: 100% 커버리지만 비즈니스 로직 검증 실패
- 비결정성 테스트: 외부 의존성(예:
non-deterministic dependency
) 사용으로 인한 결과 불일치 - 불필요한 중복 테스트: 동일
if-else
조건을 반복 검증 - 테스트 코드의 낮은 가독성: 단순
getter/setter
검증으로 인한 유지보수성 저하
2. 커버리지 지표의 한계
- 고 커버리지 ≠ 고 품질: 비즈니스 로직을 누락한 테스트가 존재할 수 있음
- CRAP 지표 활용: 코드 복잡도를 낮추기 위한 리팩토링 유도
- 유산 코드 문제: 비가독성 테스트로 인한 리팩토링 회피
3. 테스트 개선 팁
- AAA 패턴 적용:
- Arrange: 테스트 조건 설정
- Act: 테스트 대상 실행
- Assert: 결과 검증
- 단일 책임 원칙 준수:
- 1 테스트 = 1 시나리오 (예: assertEqual()
한 번만 사용)
- 비결정성 요소 제거:
- 랜덤 시드 고정 (random_seed = 42
)
- 외부 의존성 분리 (모킹 사용)
결론
- 테스트는 커버리지 지표보다 실제 비즈니스 로직을 검증하는 데 초점을 맞출 것
- AAA 패턴과 SRP 원칙을 적용해 테스트의 가독성과 유지보수성을 높임
- 비결정성 요소 제거 및 단위/통합 테스트 구분을 통해 테스트 신뢰도 향상
- PHPUnit 등 테스트 프레임워크 활용으로 실무 적용 가능