[SpringBoot] @SpringBootTest의 webEnvironment 속성
테스트의 웹 환경을 설정하는 속성이며 기본값은 SpringBootTest.WebEnvironment.MOCK이다.
WebEnvrionment.MOCK은 실제 서블릿 컨테이너를 띄우지 않고 서블릿 컨테이너를 *mocking한 것이 실행된다.
이 속성값을 사용할 때는 보통 *MockMVC를 주입받아 테스트한다.
*mocking ::
먼저 MOCK이란 개념을 잘 짚고 가야한다. Mock의 의미는 모조, 모조품, 가짜를 의미하는 것이다. Mock Object(모의 객차)란 주로 객체 지향 프로그래밍으로 개발한 프로그램을 테스트할 경우에 테스트를 수행할 모듈과 연결되는 외부의 다른 서비스나 모듈들을 실제 사용하는 모듈을 사용하지 않고 실제의 모듈을 '흉내'내는 '가짜'모듈을 작성하여 테스트의 효용성을 높이는데 사용하는 객체이다.
다음과 같은 상황을 테스트하는 데에 유용하게 사용된다.
-UI 테스트 : 사용자의 반응이 필요한 테스트를 수행할 경우 사용자가 테스트에 참여해야하기 때문에 자동화된 테스트를 수행하기가 어렵다. 이럴 경우 모의 객체를 이용해 사용자의 응답을 흉내내어 사용자 개입 없이도 테스트를 수행할 수 있다.
-데이터베이스 테스트 : 자료의 변경을 수반하는 데이터베이스에 대한 작업을 테스트하는 경우 테스트 수행 후 매번 데이터베이스의 자료를 원래대로 돌려놔야하는데, 이 때에 MOCK을 사용해서 데이터베이스의 응답을 흉내내어 데이터 변경 없이 테스트가 가능하다.
-> 테스트 주도 개발(Test Driven Development)에서는 자동화된 테스트가 필수요소 중의 하나이다. 모의 객체를 이용하면 상당 부분의 테스트를 사용자의 개입 없이 자동화 할 수 있다.
*MockMVC ::
웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현할 수 있는 클래스이다.
SpringBootTest.WebEnvironment.RANDOM_PORT로 설정하면, 실제로 테스트를 위한 서블릿 컨테이너를 띄운다. MOCK과는 달리 *TestRestTemplate를 주입받아 테스트한다.
실제 객체의 통합을 테스트하기 위해(클라이언트와 서버의 상호작용을 테스트하기 위해) RANDOM_PORT를 사용해야 한다. 통합테스트는 생산환경과 최대한 유사해야하기 때문에, MOCK을 사용해서는 안된다.
+ 통합테스트는 우리가 만든 서비스를 테스트할 때 단위테스트를 진행한다. 그러나 단위테스트만으로 모든 테스트를 완료했다고 말할수는 없다. 만들어진 서비스들끼리 서로 상호작용하며 기능을 수행하는 것도 있을 수도 있고, 타시스템과의 연동을 통해 결과물이 나오는 상황도 있기 때문에, 모든 전반적인 상황을 하나로 묶어서 진행하는 테스트를 통합테스트라고 알면 된다.
*TestRestTemplate ::
RestTemplate의 확장이 아니라, 통합테스트를 단순화하고, 테스트 중 인증을 용이하게 해주는 대안이 된다.
추후에 TestRestTemplate과 RestTemplate의 차이점을 정리하는 글을 쓸 예정이다.
- 참고
https://ko.wikipedia.org/wiki/%EB%AA%A8%EC%9D%98_%EA%B0%9D%EC%B2%B4