저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

'HTTP mock 서버'에 해당되는 글 1건

  1. 2015.10.22 유용한 도구 WireMock 소개

요즘 만드는 모듈 중 하나로 클라이언트 모듈이 있는데, 이 모듈은 서버와 HTTP를 이용해서 JSON으로 데이터를 주고 받는다. 내가 맡은 부분은 클라이언트쪽이었는데, 서버와 어떤 구조의 JSON을 주고 받을지 정한 상태였다. 난 클라이언트 기능이 정상적으로 동작하는지 확인하고 싶었는데 아직 서버는 만들어지기 전이었다. 간단한 웹 서버를 만들어서 테스트를 해야 하나라는 생각을 순간 했다가 바로 접고 검색을 해 봤는데, 딱 원하는 걸 해주는 걸 발견했다. 바로 WireMock이다.


WireMock은 테스트 목적으로 사용할 수 있는 일종의 mock 웹 서버다. WireMock을 사용하면서 특정 포트로 지정한 규칙과 매칭된 HTTP 요청이 들어오면 지정한 응답을 전송한다. 따라서, 실제 웹 서버가 존재하지 않더라도 HTTP 클라이언트를 테스트할 수가 없다. 특히 좋은 점은 JUnit을 지원한다는 것이다.


다음은 실제 WireMock을 사용한 코드의 한 부분을 발췌한 것이다. (이름을 약간 변경했다.)


import static com.github.tomakehurst.wiremock.client.WireMock.*;

...


public class SomeClientTest {


    @Rule

    public WireMockRule wireMockRule = new WireMockRule(8089);

    private SomeClient sender;

    ...


    @Before

    public void setupStub() {

        stubFor(post(urlEqualTo(url)) // url로 요청이 오면

                .willReturn(aResponse() // 응답으로

                        .withStatus(200) // 200을 전송하고

                        .withHeader("Content-Type", "application/json") // JSON 타입의 

                        .withBody("{....json데이터...}"))); // 데이터를 전송

        sender = new SomeClient("localhost", 8089); // WireMock이 생성한 서버에 연결

    }


    @Test

    public void postSomeMetric() throws Exception {

        ...

        MetricValues metricValues = new MetricValues(NOW, values);

        sender.send(metricValues);


        List<LoggedRequest> requests = findAll(postRequestedFor(urlMatching(url)));

        MetricValues postedValues = mapper.readValue(

            requests.get(0).getBodyAsString(), MetricValues.class);

        ...

    }



위 코드에서 WireMockRule은 JUnit의 Rule로서 Mock 서버를 구동하고 중지하는 처리를 한다.


@Before 메서드는 mock 웹 서버를 설정하고 있다. WireMock.stubFor()를 이용해서 mock 웹 서버의 동작 방식을 지정한다. 위 코드에서는 지정한 URL로 POST 요청이 들어오면, 200 상태 코드와 함께 JSON 형식의 데이터를 응답으로 전송하도록 설정하고 있다. 따라서, 클라이언트 해당 URL을 요청하면 @Before에서 설정한 응답을 받게 된다.


실제 테스트 메서드 대상은 WireMock이 생성한 mock 서버에 연결하기 위해 호스트와 포트를 지정하고, 클라이언트 기능을 실행한다. 위 @Test 메서드는 WireMock.findAll()을 이용해서 POST로 들어온 요청의 데이터를 구하고 있다. 즉, 클라이언트 전송한 데이터를  구하는데, 이를 이용해서 클라이언트가 제대로 데이터를 전송하는지 확인했다.


WireMock은 테스트를 지원하기 위한 다양한 기능을 제공하고 있다. 요청이 정해진 규칙대로 왔는지 검증하는 기능이 있고, 타임아웃을 테스트할 수 있는 응답 지연 기능이 있다. 프록시 기능을 제공하고, 독립 모드로 실행할 수 있다. WireMock에 대한 내용은 자세한 내용은 http://wiremock.org/ 사이트에서 확인할 수 있다.



Posted by 최범균 madvirus

댓글을 달아 주세요