시간이 지날 수록 테스트를 해야하는 기능들이 많아진다.
- 서비스가 발전함에 따라 추가/변경되는 기능들이 너무 많아 사람이 테스트하기에는 중요도에 비해
시간을 할애하기 어려워진다.
- 테스트 코드가 충분히 있다면 새로운 기능을 개발하거나 수정할때 기존에 있던 기능들은 테스트코드에 의해서 동작이 확인이 되지만 테스트 코드가 없다면 어느 범위까지 사이드이펙트가 발생할지 찾고 테스트를 다시 수행해야하는 불편함이 존재한다.
- 충분한 테스트 코드로 기존 코드가 잘 동작하고 있다는 것을 확인해야한다. → 회귀 테스트

지속 가능한 소프트웨어를 만들기 위해 테스트 코드는 필수이다.
테스트 코드 작성의 원칙?
FIRST 원칙
- F (Fast)
- I (Isolated)
- 테스트는 독립적 이어야한다.
- 다른 테스트나 외부 시스템을 의존해서는 안된다.
- 테스트 코드를 통해 검증하고 싶은건 외부 시스템이 정상적으로 동작하는지가 아니라 내 소프트웨어가 정확하게 동작하는지다.
- Isolation 원칙이 깨졌을 때 다음에 소개할 Repeatable 원칙도 함께 위배될 확률이 매우높다.
- R (Repeatable)
- 테스트 코드는 반복실행해도 항상 동일한 결과여야한다.
- 변경한것도 없는데 갑자기 테스트 코드가 실패한다면 Repeatable 원칙이 위배된 것이다.
- S (Self-validating)
- 테스트 코드는 그 자체로 스스로 검증되어야한다.
- 콘솔 출력문(
print()
) 혹은 로그 등을 통해 개발자가 직접 검증해야하는 부분이 있으면 안된다.
- 테스트 코드를 CI/CD 배포 파이프라인의 구성요소로 추가하기도 하는데, 이런 상황에서 Self-validating 원칙이 깨진다면 충분히 검증이 안되는 상황이 생길 수 있다.
- T (Timely)
테스팅 7원칙
-
테스트는 결함의 존재를 찾는 행위이다.
- 테스트의 목적은 코드가 완벽함을 증명하는 것이 아니라 다양한 케이스를 통해 버그를 찾기 위함이다.
-
완벽한 테스트는 불가능하다.
- 테스트를 수십만, 수백만 번을 진행하고 확인해도 모든 부분을 전부 확인할 수 없다.
안정적인 소프트웨어를 만들기 위해 검증하는 방법중 한 개일 뿐이다.
그렇기 때문에 가장 중요한 부분 먼저 진행함으로써 효과를 극대화 해야한다.
-
테스트 구성은 가능한 빠르게 시작한다.
- 개발 초기에 환경을 구축하고 테스트를 진행하여 차후 개발 과정에서의 노력을 최소화한다.
-
결함은 집중된다.
- 파레토 법칙: 제품의 결점 중 80%는 20%의 요인으로부터 발생한다는 개념
- 즉, 적은 비율의 원인이 아주 큰 영향을 가져온다는 말!

- 대부분의 결함은 특정 모듈에 의해 발생되는 경우가 많다.
- 복잡한 구조를 가지고 있는 모듈
- 기존것이 아닌 새롭게 개발한 모듈
- 다른 모듈들과 복잡한 상호작용을 하고 있는 모듈
-
살충제 역설.
- 동일한 테스트가 반복되면 새로운 결함을 발견할 수 없다.
코드가 테스트코드에 면역이 되는 것을 의미한다.
- 기능은 계속 수정되고 발전하고 있는데 테스트 코드가 변함없이 유지된다면 기존에 있던 문제는 계속 확인이 가능하겠지만 새롭게 생긴 문제에 대해서는 확인이 불가능하기 때문에 지속적으로 테스트 코드 리뷰 및 업데이트로 새로 생긴 결함을 검출 해야한다.
-
테스트는 정황에 의존적이다.
- 서비스의 특성을 파악하고 그에 맞는 테스트를 진행해야한다.
쇼핑몰을 만든다고 하면 가장 중요한것은 상품을 보여주고 선택하는 것이 아닌 결제이기 때문에 결제 모듈을 먼저 꼼꼼히 테스트 해야한다. 이처럼 각 서비스에서의 중요한 정황이 무엇인지 파악하고 그에 맞는 테스트 코드를 작성해야한다.
-
오류가 부재함은 궤변이다.
- 테스트 케이스를 꼼꼼히 세우지 않아 발견하지 못한 버그가 발생할 수 있기 때문에
테스트가 모두 통과했다고 서비스에는 문제가 없다고 생각하는 것을 주의하여야 한다.
테스트의 목적은 많은 문제(결함)를 찾는 것에 있다.
reference
공식문서
https://docs.spring.io/spring-boot/reference/testing/index.html#testing
(스프링 부트 1.5.7.RELEASE 버전의 테스트 관련 문서)
https://docs.spring.io/spring-boot/docs/1.5.7.RELEASE/reference/html/boot-features-testing.html
영상
1, 2, 3
기술로그
1, 2, 3, 4, 5, 6,
7, 8
테스트 코드 작성 학습 순서
1) Spring Boot에서의 테스트
@SpringBootTest 사용법과 기본적인 테스트 환경 설정 방법 학습
2) 다양한 테스트 전략 학습
3) Mocking과 테스트 도구 활용
- @MockBean으로 의존성 주입하여 테스트하기
- Mockito와 MockMvc를 활용한 단위 테스트 방법
4) 데이터베이스 테스트
- @DataJpaTest와 Testcontainers를 활용하여 DB 관련 테스트 진행하기
- 임베디드 데이터베이스 (H2)를 활용한 테스트 환경 설정
5) Spring Security 테스트
- @WithMockUser와 @WithAnonymousUser을 활용한 보안 테스트
- SecurityMockMvcRequestPostProcessors를 이용한 사용자 인증 테스트
6) 테스트 코드에서 Application Context 문제 해결
- @TestConfiguration을 사용하여 커스텀 설정 주입하기
- @DirtiesContext를 활용하여 캐시된 컨텍스트 초기화하기