JUnit에서 REST API를 테스트하는 방법은?
_____A1: JUnit 단독으로는 REST API 호출 및 검증 기능이 제한적이므로, 보통 `Spring Boot Test`의 `MockMvc`, `RestTemplate`, `WebTestClient`, 또는 외부 라이브러리인 `RestAssured` 등을 함께 사용합니다.
---
Q2: Spring 환경에서 REST API를 JUnit으로 쉽게 테스트하는 방법은?
A2: Spring Boot를 사용할 경우 `@SpringBootTest`와 `@AutoConfigureMockMvc` 애노테이션을 함께 사용해 `MockMvc` 객체를 주입받아 API 엔드포인트를 비동기 호출하고 응답을 검증할 수 있습니다.
예)
```java
@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John"));
}
}
```
---
Q3: MockMvc 말고 어떤 방법이 있나요?
A3:
- `TestRestTemplate`: Spring Boot에서 통합 테스트 시 실제 서버 같이 동작하는 API를 호출할 때 편리합니다.
- `WebTestClient`: 주로 WebFlux(비동기 웹) 환경에서 비동기/반응형 API 테스트 시 사용합니다.
---
Q4: RestAssured란 무엇인가요?
A4: REST API 테스트를 위한 Java DSL(도메인 특화 언어) 라이브러리입니다. 문법이 직관적이며 JSON 파싱 및 검증에 강력합니다. JUnit과 같이 사용해 외부 서비스 또는 서버를 띄운 상태에서 API를 테스트할 때 자주 활용됩니다.
예)
```java
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
@Test
public void testGetUser() {
given().
baseUri("http://localhost:8080").
when().
get("/users/1").
then().
statusCode(200).
body("name", equalTo("John"));
}
```
---
Q5: API 응답 데이터(JSON 등)를 검증하는 팁이 있나요?
- `MockMvc`에서는 `jsonPath()` 메서드를 활용해 JSON 필드 값을 검증합니다.
- `RestAssured`도 `body()`와 `Matchers`를 사용해 세부 필드를 검증할 수 있습니다.
- POJO로 응답을 매핑해 직접 검증하는 방법도 있습니다 (`ObjectMapper` 사용).
---
Q6: 테스트 실행 시 서버를 실제로 띄워야 하나요?
A6:
- `MockMvc`는 서버를 띄우지 않아도 컨트롤러를 단위 테스트하고 요청을 시뮬레이션합니다.
- `TestRestTemplate`이나 `RestAssured`는 실제 서버를 띄워 통합 테스트용으로 주로 사용합니다 (`@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)`).
---
Q7: JUnit 5 환경에서 MockMvc 사용법은 어떻게 되나요?
A7: 기존 JUnit 4와 비슷하지만, 테스트 메서드에 `@Test`를 적용하고 `@ExtendWith(SpringExtension.class)`를 명시적으로 붙입니다. 보통 `@SpringBootTest`와 `@AutoConfigureMockMvc`만 붙여도 됩니다.
---
Q8: JSON 요청 바디를 포함한 POST 요청을 테스트하려면?
A8:
`MockMvc` 예시:
```java
mockMvc.perform(post("/users")
.contentType(MediaType.APPLICATION_JSON)
.content("{\"name\":\"John\"}"))
.andExpect(status().isCreated());
```
`RestAssured` 예시:
```java
given().
contentType(ContentType.JSON).
body("{\"name\":\"John\"}").
when().
post("/users").
then().
statusCode(201);
```
---
Q9: 인증이 필요한 API를 JUnit에서 테스트하려면?
A9:
- `MockMvc`에서는 `with(user("username").password("pwd").roles("USER"))` 식으로 보안 컨텍스트를 설정할 수 있습니다.
- 토큰 기반 인증이면 헤더에 `Authorization` 값을 수동으로 추가해서 테스트 가능합니다.
- RestAssured에서도 헤더 설정이 가능합니다.
---
Q10: 비동기 API 테스트 시 주의할 점은?
A10:
비동기 테스트는 `MockMvc`의 `asyncDispatch()`를 활용하거나, `WebTestClient` 같은 비동기 지원 클라이언트를 사용해야 정확한 응답 검증이 가능합니다.
---
이와 같이 JUnit과 다양한 보조 도구를 결합하면 REST API 테스트를 효과적이고 체계적으로 수행할 수 있습니다.
JUnit 자체는 테스트 프레임워크로, REST API를 호출하고 응답을 검증하는 기능은 제공하지 않지만, 이를 보완하기 위해 여러 라이브러리 및 방법론이 쓰입니다.
1. 단위 테스트 vs 통합 테스트 구분하기 - *단위 테스트(Unit Test)*: 컨트롤러나 서비스 레이어 내부 로직만 테스트하고 외부 REST 호출은 모킹(Mock) 처리 - *통합 테스트(Integration Test)*: 실제 REST API를 호출하여 시스템 전체 작동 여부를 확인
2. MockMvc (스프링 프레임워크 환경에서) 스프링을 사용하고 있다면 `MockMvc` 클래스를 이용해 웹 애플리케이션 컨텍스트 없이도 컨트롤러 계층에 대해 REST API 호출을 시뮬레이션할 수 있다.
주요 특징: - 서버를 띄우지 않고도 REST 엔드포인트를 호출 가능 - HTTP 메서드(GET, POST 등) 호출, 요청 바디(json 등) 전달, 응답 상태 및 내용 검증 지원 - 예시 코드: ```java @Autowired private MockMvc mockMvc; @Test public void testGetUser() throws Exception { mockMvc.perform(get("/api/users/1")) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$.username").value("testuser")); } ``` 이는 내장된 Mock 환경에서 REST 호출을 흉내 내는 것이므로 빠르고 효율적이다.
3. RestTemplate 또는 WebTestClient (실제 서버 대상 테스트) - `RestTemplate` (스프링 5 이전)이나 `WebTestClient` (Spring WebFlux에서 도입) 등을 사용해 실제로 서버가 띄워져 있는 상태를 대상으로 REST API를 호출한다.
- 보통 `@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)`와 함께 사용해 실제 웹 서버 환경에서 통합 테스트를 수행한다.
- 예시: ```java @LocalServerPort private int port; private String baseUrl; @BeforeEach void setUp() { baseUrl = "http://localhost:" + port; } @Autowired private TestRestTemplate restTemplate; @Test public void testCreateUser() { User user = new User("testuser", "[email protected]"); ResponseEntity
4. 외부 라이브러리 활용 (RestAssured 등) - `RestAssured`는 간결한 문법으로 REST API 테스트를 작성할 수 있도록 도와준다. - JUnit 테스트 내에서 실제 HTTP 요청을 보내고 응답 상태, 내용 등을 쉽게 검증할 수 있다.
- 예시: ```java import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; @Test public void testGetUsers() { given() .baseUri("http://localhost") .port(port) .when() .get("/api/users") .then() .statusCode(200) .body("size()", greaterThan(0)); } ```
5. 테스트 데이터 준비 및 청소 - API 테스트 시 일관된 결과를 위해 테스트 실행 전후에 DB 초기화 혹은 Mock 데이터 등록이 중요하다. - JUnit의 `@BeforeEach`, `@AfterEach` 또는 `@BeforeAll`, `@AfterAll`을 적절히 사용하여 데이터 세트를 관리한다.
6. 검증 요소 - HTTP 상태 코드 (200 OK, 404 Not Found 등) - 응답 헤더 (Content-Type 등) - 응답 바디 내용 (JSON 필드 값, 배열 크기 등) - 예외 발생 여부 및 메시지
7. 실행 자동화 및 지속적 통합 연계 - Maven, Gradle 등의 빌드 도구에서 JUnit 테스트가 실행되도록 설정한다.
- Jenkins, GitHub Actions 등 CI/CD 파이프라인에 통합하여 코드 변경 시마다 API 테스트가 수행되도록 한다.
--- 요약 - 스프링 환경에서는 `MockMvc`를 이용한 컨트롤러 계층 테스트가 효율적이며 빠름 - 실제 서버를 띄워 통합 테스트를 하려면 `@SpringBootTest`와 `TestRestTemplate` 혹은 `WebTestClient` 활용 - 더 다양한 REST API 테스트 기능을 원하면 RestAssured 같은 외부 라이브러리 사용 가능 - 테스트 환경 구축 시 데이터 상태 초기화와 응답 검증을 철저히 하여 신뢰성 확보 이와 같은 방법으로 JUnit을 기반으로 REST API에 대한 다양한 층위의 테스트를 설계하고 수행할 수 있습니다.
작성자:
정지윤 [비회원]
| 작성일자: 1년 전
2025-05-26 02:51:21
조회수: 169 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 169 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.