Java에서의 Test Code

song yuheon·2023년 9월 23일
1

Java

목록 보기
37/46
post-thumbnail
post-custom-banner

Java에서의 테스트


  1. 단위 테스트 (Unit Test)

    • 주로 사용되는 계층: 모든 계층 (Controller, Service, Repository, 등등 )
    • 상황
      • 로직의 정확성을 검증하고자 할 때
      • 외부 시스템에 의존하지 않고 독립적으로 특정 기능이나 메서드를 테스트하고자 할 때.
  2. 통합 테스트 (Integration Test)

    • 주로 사용되는 계층
      주로 Service 및 Repository
    • 상황
      • 여러 컴포넌트나 레이어가 함께 작동하는지 검증하고자 할 때 (ㄸEx 서비스와 레포지토리 간의 상호 작용)
      • 외부 시스템 (DB, 외부 등등)과의 상호 작용을 테스트하고자 할 때
  3. 인메모리 데이터베이스 (H2, HSQLDB 등)를 사용한 테스트

    • 주로 사용되는 계층
      Repository

    • 상황

      • 실제 DB 환경과 유사하게 데이터 접근 로직을 테스트하고자 할 때 사용한다.
      • 실제 데이터베이스에 영향을 주지 않으면서 CRUD 작업을 테스트하고자 할 때 사용
  4. @Transactional 어노테이션을 사용한 테스트

    • 주로 사용되는 계층
      Service 및 Repository

    • 상황

      • DB와의 상호 작용을 포함한 테스트에서 DB 상태를 초기 상태로 롤백하고자 할 때 씀
      • 여러 테스트 케이스에서 동일한 DB 상태를 유지에 사용

단위 테스트와 통합 테스트 비교


  1. 단위 테스트 (Unit Test)

    • 각 컴포넌트의 독립성을 보장하며 특정 로직의 정확성을 빠르게 검증한다.
    • 대부분의 로직 오류는 단위 테스트에서 발견될 가능성이 높다.
    • 실행 속도가 빠르므로 개발 중에 지속적으로 실행할 수 있다.
  2. 통합 테스트 (Integration Test)

    • 여러 컴포넌트나 레이어가 함께 작동하는지를 검증한다.
    • 예시를 들자면 서비스 레이어에서 레파지토리 레이어로의 호출과 같은 연계 부분을 테스트한다.
    • 데이터베이스, 외부 서비스, 메시지 큐와 같은 외부 시스템과의 상호 작용을 테스트한다.

실무에서의 사용


  • Controller 계층에서는 MockMvc를 사용하여 요청과 응답의 형식, 상태 코드, 헤더 등을 테스트한다.
    이 때 Service나 Repository를 Mocking하여 외부 의존성을 제거하고 테스트의 격리를 보장한다.
  • Service 계층에서는 로직의 정확성 및 외부 시스템과의 상호 작용을 검증하기 위해 단위 테스트와 통합 테스트를 모두 사용할 수 있다.
    하지만 대부분은 단위 테스트
  • Repository 계층에서는 데이터베이스와의 상호 작용을 중점적으로 테스트한다.
    여기서는 인메모리 데이터베이스나 @Transactional을 사용하여 테스트의 격리를 보장할 수 있다.

profile
backend_Devloper
post-custom-banner

0개의 댓글