본문 바로가기
IT 도서/스프링 부트 실전 활용 마스터

4. 스프링 부트 테스트

by 이민우 2021. 7. 31.
728x90
반응형

출처 : https://book.naver.com/bookdb/book_detail.nhn?bid=20551523

 

스프링 부트 실전 활용 마스터

대규모 트래픽을 적은 비용으로 처리할 수 있는 고성능 서버의 비밀은 무엇일까? 스프링 부트 개발, 테스트, 문서화, 보안, 도커화, 운영까지 모두를 한 권에 마스터하는 것을 목표로, 익숙하고

book.naver.com

*해당 글은 학습을 목적으로 위의 도서 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인을 원하신다면 도서 구매를 추천드립니다.

 

 

 

리액티브 단위 테스트

 

단위 테스트에서 단위하나의 클래스로 볼 수 있다. 즉, 단위 테스트각 대상 클래스만의 기능을 테스트하고 검증하는 것이다. 이는 가장 단순한 테스트로, JUnit5 등으로 쉽게 테스트할 수 있다.

 

스프링 부트는 테스트에 필요한 여러 도구를 제공하는데, spring-boot-starter-test 를 추가하면 다음의 테스트 라이브러리들이 자동으로 추가된다.

 

  • Spring Boot Test
  • JsonPath
  • JUnit5
  • AssertJ
  • Mockito
  • JSONassert
  • Spring Test

 

다음은 스프링 부트에서 도메인 테스트를 수행하는 방법이다.

@Test는 이 메소드가 테스트 메소드임을 JUnit에게 알리는 역할이다.

AssertJ를 활용하면 도메인 객체가 의도한 대로 동작하는지 검증이 가능하다.

 

 

이러한 도메인 객체는 타 객체와 상호작용 하지 않음으로 쉽게 확인이 가능하다.

하지만 타 객체와 상호작용 하는 코드를 테스트 할 때는 어떻게 해야할까? 내부 컬렉션 뿐 아니라 외부 컬렉션과도 상호작용 하는 클래스의 경우에도 마찬가지로 JUnit을 활용하면 테스트할 수 있다.

@ExtendWith테스트 핸들러를 지정할 수 있는 JUnit5의 API로, 스프링에 특화된 테스트 기능을 사용할 수 있게 해준다.

 

그리고 클래스 명은 클래스의 이름과 테스트 범위를 조합하여 명확히 표현해야 한다.

여기서 테스트의 대상이 되는 클래스를 CUT(Class Under Test) 라고 한다.

위의 경우 InventoryService가 바로 CUT이다. 아무 애너테이션도 붙지 않은 상태로 테스트 시작 시 초기화된다.

 

@MockBean은 테스트 대상이 아니므로 가짜 객체를 만들어 테스트에 사용한다. 이 에너테이션은 코드 작성 시간을 단축해주고, 협력자를 표시하기 위해 사용된다.

 

@BeforeEach는 JUnit5의 에너테이션으로, 테스트 실행 전 준비하는 메소드임을 의미한다.

 

 

준비가 끝났음으로 이제 진짜 테스트이다.

마찬가지로 테스트 하는 메소드 명도 어떤 테스트를 하는 것인지 명확히 드러나야 한다.

 

addItemToEmptyCartShouldProduceOneCartItem 메서드의 경우 탑 다운 방식인데, 밑의 alternativeWayToTest 처럼 테스트할 수도 있다. 즉 굳이 create을 먼저 하지 않아도 된다.

 

StepVerifier::create테스트를 전담하는 리액터 타입 핸들러를 생성하는 작업이다.

 

 

내장 컨테이너 테스트

 

다음은 내장 컨테이너 테스트이다. 스프링 부트에서는 완전한 기능을 갖춘 내장 웹 컨테이너를 임의의 포트에 연결해 구동할 수 있다.

 

테스트 케이스는 목이나 스텁 같은 가짜 협력자와 협력할 필요 없이, 진짜 구성요소들과 협력할 수 있다.

@SpringBootTest스프링 부트가 실제 어플리케이션을 구동하게 만든다. @SpringBootApplication이 붙은 클래스를 찾아 내장 컨테이너를 실행하는 작업이다.

여기서 WebEnvironment.RANDOM_PORT는 랜덤한 포트에 내장 컨테이너를 바인딩하는 작업이다.

 

@AutoConfigureWebTestClient어플리케이션에 요청을 날리는 WebTestClient 인스턴스를 생성한다.

 

 

 

 

슬라이스 테스트

 

슬라이스 테스트란, 단위 테스트와 종단 간 통합 테스트의 중간 정도에 해당하는 테스트로, 프로그램을 레이어 단위로 분류하여 각 레이어를 하나의 단위로 보며 단위 테스트를 수행하는 작업이다.

 

스프링 부트에서는 @AutoConfigureRestDocs, @DataJdbcTest다양한 테스트 지원 기능이 준비되어 있다.

 

이 책에서는 몽고디비 슬라이스 테스트와 웹플럭스 슬라이스 테스트 예시를 보여준다.

@DataMongoTest데이터 몽고디비 활용에 초점을 둔 몽고디비 테스트 관련 기능을 활성화한다.

@ExtendWith를 이미 포함하고 있다.

@[a-zA-Z]*Test 는 대부분 @ExtendWith를 포함하고 있다.

 

웹플럭스 슬라이스 테스트이다.

@WebFluxTest는 이 테스트 케이스가 HomeController에 국한된 스프링 웹플럭스 슬라이스 테스트를 사용하도록 설정한다.

 

 

 

블록하운드 사용 단위 테스트

 

메인 함수 시작 부분에 블록하운드를 집어넣어 사용하는 방식은 실제 운영환경에서도 활성화되기에 운용에서 사용되지는 않는다. 그렇기에 이는 테스트 환경에서만 사용하는 것이 낫다.

 

블록하운드를 JUnit과 함께 사용하기 위해서는 다음과 같이 빌드 파일에 추가해야 한다.

 

블록하운드가 검출하는 에러들은 다음과 같다.

  • java.lang.Thread
  • 여러 소켓 및 네트워크 연산
  • 파일 접근 메소드 일부

 

Sleep이 수행되는지 확인하는 예시

 

728x90
반응형