본문 바로가기
Baeldung번역&공부/Java-test

REST API 테스트하기(Test a REST API with Java)

by ms727 2025. 2. 26.

원본 글: https://www.baeldung.com/integration-testing-a-rest-api

이 글에서는 통합테스트를 통해서 REST API를 테스트하는 방법에 대해 다룹니다.
실제 있는 API를 호출하고 응답값을 받아와서 검증하는 절차까지 진행해봅니다.

테스트 의존성

  • testImplementation 'org.apache.commons:commons-lang3:3.17.0
  • testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2'
  • testImplementation 'com.fasterxml.jackson.core:jackson-databind:2.18.2'

1. API Integration Testing

API 통합 테스트는 본인이 만든 프러덕트와 외부 의존성(데이터베이스, third-party 서비스, API 등)에 대해 상호작용을 평가하는데 의미를 두고 있습니다. 통합 테스트의 목적은 시스템의 다양한 구성요소가 예상대로 함께 동작하도록 기대하는것입니다. 개별 기능 테스트에 초점을 둔 유닛 테스트와는 다르게 통합 테스트는 실제 환경에 HTTP request 요청을 보내고 API 응답이 제대로 왔는지 등을 검증하는데에 초점이 있습니다.

1.1 Why API Integration Testing Is Important

단위 테스트는 개별 코드가 의도한대로 동작하는지 파악합니다. 하지만 이는 각 코드가 합쳐졌을때 어떤 문제를 발생시키는지는 확인하지 못합니다.
통합 테스트는 시스템의 서로 다른 부분이 어떻게 통신하는지 확인하고 구성요소간 잘못된 통신이나 오류로 인해 전체 프로그램에 영향이 미치지않도록 하여 이러한 문제를 해결합니다.
또한, 실제 운영환경에서 시스템이 잘 동작할 것임을 팀에제 제공하여 배포 실패 위험을 줄일 수 있습니다.

1.2 When to Conduct API Integration Testing

일반적으로 통합테스트는 단위 테스트 이후 실제 릴리즈되기 전에 실행됩니다.
통합테스트는 실제 릴리즈될때 수행되어 새로운 기능 추가나 업데이트로 인한 잠재적 문제를 확인할 수 있습니다.

2. Testing the Status Code

github에 유저정보를 가져오는 요청을 보내고 만약 유저정보가 없을때 status code를 검증하는 테스트를 작성합니다.

    @Test
    public void givenUserDoesNotExists_whenUserInfoRetrieved_then404IsReceived() throws IOException {
        // Given
        String name = RandomStringUtils.randomAlphabetic(10);
        HttpGet request = new HttpGet("https://api.github.com/users/" + name);

        // When
        HttpResponse httpResponse = HttpClientBuilder.create().build().execute(request);

        // Then
        Assertions.assertEquals(httpResponse.getCode(), HttpStatus.SC_NOT_FOUND);
    }

추가적인 테스트 케이스를 만들 필요 없는 간단한 테스트입니다. 만약 테스트가 실패한다면 다른 테스트는 할 필요없이 문제를 해결하고 바로 테스트가 가능합니다.

이렇게 테스트는 간결해야합니다.

3. Testing the Media Type

응답의 기본 Content-Type이 Json인지 확인하기 위해 Media Type테스트도 가능합니다.

    @Test
    public void givenRequestWithNoAcceptHeader_whenRequestIsExecuted_thenDefaultResponseContentTypeIsJson() throws IOException {
        // Given
        String jsonMimType = "application/json";
        HttpGet request = new HttpGet("https://api.github.com/users/eugenp");

        // When
        HttpResponse response = HttpClientBuilder.create().build().execute(request);

        // Then
        Assertions.assertEquals(response.getFirstHeader("Content-Type").getValue().split(";")[0], jsonMimType);
    }

Response에 Json 데이터가 포함되어있는지 확인합니다.

순차적으로 테스트를 진행하고 있습니다. 2번째 섹션에서는 Http상태값을 확인하였고, 이번 섹션에서는 응답값 형식에 대해서 확인하였습니다. 다음 섹션에서는 Json값을 제대로 받아왔는지 확인합니다.

4. Testing the JSON Payload

    @Test
    public void givenUserExists_whenUserInformationIsRetrieved_thenRetrievedResourceIsCorrect() throws IOException, ParseException {
        // Given
        HttpGet request = new HttpGet("https://api.github.com/users/kkminseok");

        // When
        CloseableHttpResponse response = HttpClientBuilder.create().build().execute(request);

        // Then
        GitHubUser gitHubUser = retrieveResourceFromResponse(response, GitHubUser.class);
        Assertions.assertEquals("kkminseok", gitHubUser.login());

    }

    private <T> T retrieveResourceFromResponse(final CloseableHttpResponse response, final Class<T> clazz) throws IOException, ParseException {
        final String jsonFromResponse = EntityUtils.toString(response.getEntity());
        final ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return mapper.readValue(jsonFromResponse, clazz);
    }

public record GitHubUser(String login) { }

테스트용으로 제가 원본글을 참고하여 작성하였습니다.

Json값을 클래스로 반환하여 해당 값과 기댓값이 같은지 확인하고 있습니다.

5. Utilties for Testing

위의 코드를 살펴보면 ObejctMapper에 FAIL_ON_UNKNOWN_PROPERTIES라는 옵션을 False로 하였습니다.

이 코드의 의도는 불필요한 데이터를 무시하고 필요한 데이터만 추출하여, 테스트 코드를 간결하고 읽기 쉽고, 높은 수준의 추상화로 유지하자는 것입니다. 특히 GitHub API에서 오는 사용자 정보는 다양한 필드를 포함할 수 있는데, 여기서는 그 중 필요한 부분만 받아오는 방식입니다. FAIL_ON_UNKNOWN_PROPERTIES를 false로 설정하여, GitHub API가 보내는 다른 정보들을 처리하지 않고 무시합니다.

7. 결론

통합테스트를 진행하는 법을 알아봤습니다. 복잡한 시나리오가 필요없이 기초적인 방법으로 REST API검증을 진행하였습니다.


옛날에 쓰여진 글이다보니 제가 추가적으로 작성한 테스트 코드도 있습니다. 참고부탁드립니다.

예제코드