테스트 코드 - 이론

ChoRong0824·2025년 3월 19일
0

Web

목록 보기
48/51
post-thumbnail

시간이 지날 수록 테스트를 해야하는 기능들이 많아진다.

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

지속 가능한 소프트웨어를 만들기 위해 테스트 코드는 필수이다.


테스트 코드 작성의 원칙?

FIRST 원칙

  • F (Fast)
    • 테스트 코드는 빠르게 실행되어야한다.
  • I (Isolated)
    • 테스트는 독립적 이어야한다.
    • 다른 테스트나 외부 시스템을 의존해서는 안된다.
    • 테스트 코드를 통해 검증하고 싶은건 외부 시스템이 정상적으로 동작하는지가 아니라 내 소프트웨어가 정확하게 동작하는지다.
    • Isolation 원칙이 깨졌을 때 다음에 소개할 Repeatable 원칙도 함께 위배될 확률이 매우높다.
  • R (Repeatable)
    • 테스트 코드는 반복실행해도 항상 동일한 결과여야한다.
    • 변경한것도 없는데 갑자기 테스트 코드가 실패한다면 Repeatable 원칙이 위배된 것이다.
  • S (Self-validating)
    • 테스트 코드는 그 자체로 스스로 검증되어야한다.
    • 콘솔 출력문(print()) 혹은 로그 등을 통해 개발자가 직접 검증해야하는 부분이 있으면 안된다.
    • 테스트 코드를 CI/CD 배포 파이프라인의 구성요소로 추가하기도 하는데, 이런 상황에서 Self-validating 원칙이 깨진다면 충분히 검증이 안되는 상황이 생길 수 있다.
  • T (Timely)
    • 테스트 코드는 즉시 작성되어야한다.

테스팅 7원칙

  1. 테스트는 결함의 존재를 찾는 행위이다.

    • 테스트의 목적은 코드가 완벽함을 증명하는 것이 아니라 다양한 케이스를 통해 버그를 찾기 위함이다.
  2. 완벽한 테스트는 불가능하다.

    • 테스트를 수십만, 수백만 번을 진행하고 확인해도 모든 부분을 전부 확인할 수 없다.
      안정적인 소프트웨어를 만들기 위해 검증하는 방법중 한 개일 뿐이다.
      그렇기 때문에 가장 중요한 부분 먼저 진행함으로써 효과를 극대화 해야한다.
  3. 테스트 구성은 가능한 빠르게 시작한다.

    • 개발 초기에 환경을 구축하고 테스트를 진행하여 차후 개발 과정에서의 노력을 최소화한다.
  4. 결함은 집중된다.

    • 파레토 법칙: 제품의 결점 중 80%는 20%의 요인으로부터 발생한다는 개념
      • 즉, 적은 비율의 원인이 아주 큰 영향을 가져온다는 말!
    • 대부분의 결함은 특정 모듈에 의해 발생되는 경우가 많다.
      - 복잡한 구조를 가지고 있는 모듈
      - 기존것이 아닌 새롭게 개발한 모듈
      - 다른 모듈들과 복잡한 상호작용을 하고 있는 모듈
  5. 살충제 역설.

    • 동일한 테스트가 반복되면 새로운 결함을 발견할 수 없다.
      코드가 테스트코드에 면역이 되는 것을 의미한다.
    • 기능은 계속 수정되고 발전하고 있는데 테스트 코드가 변함없이 유지된다면 기존에 있던 문제는 계속 확인이 가능하겠지만 새롭게 생긴 문제에 대해서는 확인이 불가능하기 때문에 지속적으로 테스트 코드 리뷰 및 업데이트로 새로 생긴 결함을 검출 해야한다.
  6. 테스트는 정황에 의존적이다.

    • 서비스의 특성을 파악하고 그에 맞는 테스트를 진행해야한다.
      쇼핑몰을 만든다고 하면 가장 중요한것은 상품을 보여주고 선택하는 것이 아닌 결제이기 때문에 결제 모듈을 먼저 꼼꼼히 테스트 해야한다. 이처럼 각 서비스에서의 중요한 정황이 무엇인지 파악하고 그에 맞는 테스트 코드를 작성해야한다.
  7. 오류가 부재함은 궤변이다.

    • 테스트 케이스를 꼼꼼히 세우지 않아 발견하지 못한 버그가 발생할 수 있기 때문에
      테스트가 모두 통과했다고 서비스에는 문제가 없다고 생각하는 것을 주의하여야 한다.
      테스트의 목적은 많은 문제(결함)를 찾는 것에 있다.

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) 다양한 테스트 전략 학습

  • 슬라이스 테스트
    @WebMvcTest (컨트롤러 테스트)
    @DataJpaTest (JPA 관련 테스트)
    @RestClientTest (RestClient 테스트)

  • 통합 테스트
    @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
    TestRestTemplate 또는 WebTestClient 활용

3) Mocking과 테스트 도구 활용

  • @MockBean으로 의존성 주입하여 테스트하기
  • Mockito와 MockMvc를 활용한 단위 테스트 방법

4) 데이터베이스 테스트

  • @DataJpaTest와 Testcontainers를 활용하여 DB 관련 테스트 진행하기
  • 임베디드 데이터베이스 (H2)를 활용한 테스트 환경 설정

5) Spring Security 테스트

  • @WithMockUser와 @WithAnonymousUser을 활용한 보안 테스트
  • SecurityMockMvcRequestPostProcessors를 이용한 사용자 인증 테스트

6) 테스트 코드에서 Application Context 문제 해결

  • @TestConfiguration을 사용하여 커스텀 설정 주입하기
  • @DirtiesContext를 활용하여 캐시된 컨텍스트 초기화하기
profile
백엔드를 지향하며, 컴퓨터공학과를 졸업한 취준생입니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글