상세 컨텐츠

본문 제목

Spring_boot를 테스트하기 위한 어노테이션 및 메소드

개인 공부/TDD

by 카페코더 2020. 6. 29. 17:16

본문

반응형

단순 API를 테스트하는것은 문제가 될 것이 없다.

하지만, Spring-boot Application의 테스트를 위해서는 새로운 방식이 도입되어야 한다.

공부를 위해 이번 포스팅에서 이것을 정리한다. (계속 업데이트하여 정리)

2020.06.21 HelloControllerTest.java

package com.tistory.cafecoder.springboot.web;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.CoreMatchers.is;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello() throws Exception{
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }

    @Test
    public void helloDto가_리턴된다() throws Exception {
        String name = "hello";
        int amount = 1000;

        mvc.perform(
                get("/hello/dto")
                .param("name", name)
                .param("amount", String.valueOf(amount))
        )
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
                .andExpect(jsonPath("$.amount", is(amount)));
    }
}

어노테이션

  • @RunWith(SpringRunner.class)

    테스트를 진행할 때, JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다.
    여기서는 SpringRunner라는 스프링 실행자를 사용한다.
    즉, 스프링 부트 테스트와, JUnit 사이의 연결자 역할을 한다.
  • @WebMvcTest(controllers = helloController.class)

    여러 스프링 어노테이션 중, Web(Spring MVC)에 집중할 수 있는 어노테이션이다.
    선언할 경우, @Controller, @ControllerAdvice 등을 사용할 수 있다.
    단, @Service, @Component, @Repository 등은 사용할 수 없다.
    여기서는 컨트롤러만 사용하기 떄문에 문제없이 사용이 가능하다.

  • @Autowired

    웹 API를 테스트할 때 사용한다.
    스프링 MVC테스트의 시작점이다.
    이 클래스를 통해 HTTP GET, POST등에 대한 API테스트를 할 수 있다.

  • @After

    JUnit에서 단위 테스트가 끝날 때 마다 수행되는 메소드를 지정한다.
    보통은 배포 전 전체 테스트를 수행할 때 테스트간 데이터 침범을 막기 위해 사용한다.
    여러 테스트가 동시에 수행되면 테스트용 데이터베이스인 H2에 데이터가 그대로 남아있어 다음 테스트에 영향을 주는 경우가 있는데 이것을 방지하기 위한 코드를 입력한다.


  • @Before

    단위 테스트가 시작하기 전, 테스트를 위한 설정을 진행한다.

  • @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    • @SpringBootTest()

      @SpringBootApplication을 찾아서 테스트를 위한 Bean들을 자동으로 생성하며, @MockBean으로 정의된 Bean을 찾아 교체한다. 기본적으로 @RunWith(SpringRunner.class)와 함께 사용해야 하며, Bean설정 파일 역시 자동으로 찾아준다.

    • webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT

      스프링 부트 테스트를 선언하는 어노테이션 이며, 내부에 선언 된 인자는 실제 내장 톰캣을 사용하게 해준다. 이 때 MockMvc 대신 RestTemplate를 사용할 수 있다.

      실제 사용 가능한 포트로 내장톰캣을 작동시키며, 응답을 받아서 테스트를 수행한다.

 


SpringSecurity 테스트를 위한 메소드

@WithMockUser(권한)

인증된 모의 사용자를 만들어서 사용한다.
권한을 추가로 지정할 수 있다.
이 어노테이션으로 인해 특정 권한을 가진 사용자가 API를 요청하는 것 과 동일한 효과를 갖게 된다.


라이브러리 및 메소드

  • .andExpect() - mvc.perform의 결과를 검증한다.

    내부 파라미터에 따른 검증 내용
    • status().isOK()

      HTTP Header의 Status를 검증한다.
      200, 404, 500 등의 상태를 검증한다.
      여기서는 OK 즉, 200인지 아닌지를 검증한다.
    • content().string(hello))

      응답 본문의 내용을 검증한다.
      Controller에서 "hello"를 리턴하기 때문에, 이 값이 맞는지 검증된다.
  • param

    API를 테스트할 때 사용될 요청 파라미터를 설정한다.
    값은 String만을 지원하므로, 숫자 / 날짜 등의 데이터도 등록할 때는 문자열로 변경해야 가능하다.

  • jsonPath

    JSON 응답값을 필드별로 검증할 수 있는 메소드다.
    $를 기준으로 필드명을 명시한다.
    여기서는 name과 amount를 검증하니, $.name, $.amount로 검증한다.
반응형

관련글 더보기

GitHub 댓글

댓글 영역