1.3.7 Spring 프로젝트 테스팅

효과적인 테스팅은 어떤 애플리케이션의 개발 과정에서도 중요한 부분입니다. Spring 프레임워크는 Spring 테스트 컨텍스트 프레임워크를 통해 애플리케이션 컴포넌트의 테스팅을 지원하며, 단위 테스트와 통합 테스트를 쉽고 효율적으로 수행할 수 있는 기능을 제공합니다.

Spring 테스트 컨텍스트

Spring 테스트 컨텍스트 프레임워크는 Spring 애플리케이션의 테스트를 위한 기반을 제공합니다. 이는 테스트 중에 애플리케이션 컨텍스트를 캐싱하고, 테스트 간에 재사용함으로써, 테스트 실행 시간을 단축시킵니다.

  • 테스트 컨텍스트 관리: 테스트를 위한 애플리케이션 컨텍스트의 설정, 생성, 종료를 관리합니다.
  • 의존성 주입: 테스트 인스턴스에 필요한 의존성을 자동으로 주입합니다.
  • 트랜잭션 관리: 테스트 중에 데이터베이스 트랜잭션을 시작하고, 테스트가 종료된 후에 롤백할 수 있습니다.

단위 테스트와 통합 테스트

단위 테스트

단위 테스트는 가장 작은 코드 단위(주로 메소드)의 기능을 검증하는 테스트입니다. Spring에서는 @SpringBootTest 애노테이션 없이 @MockBean이나 @Mock을 사용하여 의존성을 목(mock) 객체로 대체함으로써, 격리된 상태에서 테스트를 수행할 수 있습니다.

  • 목 객체 사용: 테스트 대상이 의존하는 컴포넌트를 목 객체로 대체하여, 테스트 대상의 기능만을 격리하여 테스트합니다.
  • 예시:
    @ExtendWith(SpringExtension.class)
    public class UserServiceTest {
    
        @MockBean
        private UserRepository userRepository;
    
        @Autowired
        private UserService userService;
    
        @Test
        public void testFindUserById() {
            given(userRepository.findById(1L)).willReturn(Optional.of(new User("Alice")));
            User user = userService.findUserById(1L);
            assertThat(user.getName()).isEqualTo("Alice");
        }
    }
    

통합 테스트

통합 테스트는 애플리케이션의 다양한 컴포넌트가 함께 정상적으로 작동하는지 검증합니다. Spring에서는 @SpringBootTest 애노테이션을 사용하여 애플리케이션 컨텍스트를 전체적으로 로드함으로써, 실제 운영 환경에 가까운 조건에서 테스트를 수행할 수 있습니다.

  • 애플리케이션 컨텍스트 로딩: @SpringBootTest는 통합 테스트를 위해 전체 애플리케이션 컨텍스트를 로드합니다.
  • 예시:
    @SpringBootTest
    public class ApplicationIntegrationTest {
    
        @Autowired
        private UserService userService;
    
        @Test
        public void testUserServiceIntegration() {
            User user = userService.findUserById(1L);
            assertNotNull(user);
        }
    }
    

Spring 테스트 컨텍스트 프레임워크를 활용한 단위 테스트와 통합 테스트는 애플리케이션의 안정성과 신뢰성을 보장하는 데 중요한 역할을 합니다.
이러한 테스팅 접근 방식을 통해, 개발 과정에서 발생할 수 있는 문제를 조기에 발견하고, 수정할 수 있습니다.

source: DevOps/1.Programming_Languages_&_Frameworks/1.3.Spring/1.3.7.md