[테코톡] Controller 테스트

원모어깨찰빵·2024년 8월 8일
1

우테톡 정리

목록 보기
2/2

REST-Assured

HTTP 빌더 위에 구축된 REST 기반 서비스의 테스트를 간소화하기 위한 Java DSL
BDD 방식(given-when-then)으로 행위 주도 개발이 가능하다.
요청/응답 데이터에 특정 지정사항을 줄 수 있고, 응답 데이터를 검증하거나 추출할 수 있다.
Default로 로컬8080으로 지정되어 있고, 컨트롤러의 메소드를 불러온 후 REST-Assured로 검증 시 트랜잭션이 깨질 수 있다.
(독립 라이브러리로, Spring에 의존하지 않는다.)

DSL(Domain Specific Language)이란?

SQL같이 작고 범용적이지 않은 특정 도메인을 대상으로 한 특수 프로그래밍 언어

MockMvc

Spring의 공식 스펙이며, 서버 실행 없이 Spring MVC 테스트 환경을 구성한다.
웹서버(servlet container)를 띄울 필요가 없기 때문에 빠르고, Mocking을 사용하기 때문에 원하는 구간에만 Slice Test를 할 수 있다.

차이점

Rest-Assured는 실제 서버에 요청을 보내 검증하며, 주로 @SpringBootTest와 함께 사용하는 E2E 테스트이다.
MockMvc는 웹 서버를 띄우지 않기 때문에 실제 요청을 보내지 않으며, 주로 @WebMvcTest, @SpringBootTest(MOCK)과 함께 사용하는 Slice Test이다.

@SpringBootTest

전체 application context를 로드한다.
WebEnvironment(환경변수)로는 MOCK(디폴트), RANDOM_PORT, DEFINED_PORT, NONE이 존재한다.
통합 테스트를 하거나, 실제 production과 유사한 테스트를 하고 싶은 경우, 외부 서버와 통신이 필요한 경우 사용한다.

@WebMvcTest

web관련 context만 로드한다. 즉, 컨트롤러, 필터, WebMvcConfigurer 빈들만 로드한다. (@Component, @ConfigurationProperties는 등록하지않음)
컨트롤러 레이어만 가볍고 빠르게 slice test 하고싶은 경우 사용한다.

결과 : 어떻게 컨트롤러를 테스트해야 하는가?

도구를 먼저 생각하기보다, 테스트 할 범위를 먼저 정하고, 그에 맞는 도구를 선택한다.

추가 키워드

WebTestClient : WebFlux를 지원하는 비동기 및 반응형 웹 애플리케이션을 테스트하기 위한 클라이언트
TestRestTemplate : Spring Boot에서 제공하는 테스트용 REST 클라이언트
RestAssuredMockMvc : RestAssured와 MockMvc를 결합한 도구로, Spring MVC 애플리케이션의 컨트롤러를 테스트하기 위해 사용(HTTP 요청을 보내지 않고 테스트 가능)
@DirtiesContext : @DirtiesContext는 테스트 중 변경된 애플리케이션 컨텍스트를 다시 로드하게 만드는 애너테이션, 컨텍스트의 상태가 테스트 간에 격리되어야 할 때 유용
테스트 격리
테스트 격리는 각 테스트가 독립적으로 실행되어 다른 테스트의 상태나 부작용에 영향을 받지 않도록 하는 원칙입니다. 이를 통해 테스트의 신뢰성과 재현성을 높일 수 있습니다.
주요 방법:
독립된 데이터 설정: 각 테스트마다 독립적인 데이터를 설정하고 사용합니다.
Mock 객체 사용: 외부 의존성을 격리하기 위해 Mock 객체를 사용합니다.
컨텍스트 재설정: @DirtiesContext 등을 사용하여 테스트 후 애플리케이션 컨텍스트를 다시 로드합니다.

+@

Mocking이란?

실제 객체 대신 테스트용으로 가짜 객체(Mock)를 만들어 사용하는 것을 의미
이를 통해 실제 객체의 복잡한 동작이나 외부 시스템과의 의존성을 제거하고, 테스트를 더 쉽게 수행할 수 있다.

애플리케이션 컨텍스트(Application Context)란?

Spring 애플리케이션 컨텍스트는 애플리케이션의 모든 구성 요소(빈)와 그들 간의 관계를 관리하는 컨테이너입니다. 여기에는 다음과 같은 요소들이 포함됩니다:
빈(Bean): Spring이 관리하는 객체들입니다. 애플리케이션의 각종 컴포넌트(서비스, 리포지토리, 컨트롤러 등)가 빈으로 등록됩니다.
빈 설정(Configuration): 빈의 생성과 설정을 정의한 Java 클래스나 XML 파일입니다.
프로퍼티(Properties): 애플리케이션 설정 정보로, 외부 파일(application.properties, application.yml 등)에서 로드됩니다.
환경(Environment): 프로파일(profile)과 속성(property) 소스를 포함하는 추상화입니다.

profile
https://fuzzy-hose-356.notion.site/1ee34212ee2d42bdbb3c4a258a672612

0개의 댓글

관련 채용 정보