테스트는 자신을 위한 것이 아니다

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

개발 툴

대상자

  • 소프트웨어 개발자, 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 등 테스트 프레임워크 활용으로 실무 적용 가능