[Spring Boot] 테스트 어노테이션

2020. 12. 23. 01:46Spring/Spring Boot

※ 공식 레퍼런스 문서(docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing)에도 자세히 기술되어 있다.

1. 테스트 어노테이션

어노테이션 설명 Bean
@SpringBootTest 통합 테스트, 전체 Bean 전체
@WebMvcTest 단위 테스트, MVC 테스트 MVC 관련된 Bean
@DataJpaTest 단위 테스트, JPA 테스트 JPA 관련 Bean
@RestClientTest 단위 테스트, Rest API 테스트 일부 Bean
@JsonTest 단위 테스트, Json 테스트 일부 Bean

 

 

 

2. @SpringBootTest

이 어노테이션은 통합 테스트를 제공하는 기본적인 어노테이션이다. 애플리케이션이 실행 될 때의 설정을 임의로 변경하여 테스트를 진행할 수 있으며, 여러 단위 테스트를 하나의 통합된 테스트로 수행할 때 적합하다. 쉽게 말해 모든 테스트를 수행할 수 있는 어노테이션이라고 생각하면 쉽다. 단, 애플리케이션의 설정을 모두 로드하는 만큼 규모가 커질 수 록 느려진다. 

 

 

 

3. @WebMvcTest

이 어노테이션은 MVC를 위한 테스트로 웹에서 테스트하기 힘든 컨트롤러를 테스트하는데 적합하다. 웹상에서 요청과 응답에 대한 테스트를 진행하며 시큐리티 혹은 필터까지 자동으로 테스트하여 수동으로 추가하거나 삭제가 가능하다. 또한 MVC 관련 설정만 로드되기에 @SpringBootTest 어노테이션에 비해 가볍다.

 

 

 

4. @DataJpaTest

이 어노테이션은 JPA와 관련된 설정만 로드한다. 데이터 소스의 설정이나 JPA를 사용하여 CRUD가 정상적으로 동작하는지 테스트할 수 있다. 기본적으로 인메모리 데이터베이스를 사용한다. @Entity 클래스를 스캔하여 스프링 데이터 JPA 저장소를 구성한다.

 

 

 

5. @RestClientTest

이 어노테이션은 Rest와 관견된 테스트를 도와준다. Rest 통신의 JSON 형식이 예상대로 응답을 반환하는지 테스트한다.

// test.json
{
  "id": 1,
  "title": "title",
  "price": 1000
}
@RunWith(SpringRunner.class)
@RestClientTest(BookRestService.class)
public class BookRestServiceTest {

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Autowired
    private BookRestService bookRestService;

    @Autowired
    private MockRestServiceServer server;

    @Test
    public void rest_test() {

        server.expect(requestTo("/rest/test"))
                .andRespond(
                        withSuccess(new ClassPathResource("/test.json", getClass()), MediaType.APPLICATION_JSON));

        Book book = bookRestService.getRestBook();

        assertThat(book.getId(), is(notNullValue()));
        assertThat(book.getTitle(), is("title"));
        assertThat(book.getPrice(), is(1000D));

    }
}

 

 

 

6. @JsonTest

이 어노테이션은 JSON의 직렬화, 역직렬화를 수행하는 라이브러리은 Gson과 Jackson의 테스트를 제공한다.

@RunWith(SpringRunner.class)
@JsonTest
public class BookJsonTest {

    @Autowired
    private JacksonTester<Book> json;

    @Test
    public void json_test() throws IOException {

        final Book book = new Book("title", 1000D);

        String content= "{\n" +
                "  \"id\": 0,\n" +
                "  \"title\": \"title\",\n" +
                "  \"price\": 1000\n" +
                "}";


        assertThat(json.parseObject(content).getTitle()).isEqualTo(book.getTitle());

        assertThat(json.write(book)).isEqualToJson("/test.json");
    }
}

[참고] cheese10yun.github.io/spring-boot-test/

728x90