[Spring] Test code 학습

2022. 12. 10. 17:34Web/Spring

Spring을 공부하며 미니 프로젝트를 만들면서 기능을 테스트할 때마다 변경된 메서드 및 항목들을 사용하기 위해  매번 재실행을 했어야 했다. 이전에는 못 느꼈지만 최근에 들어서 이런 시간들이 아까워서 Test code에 대해 공부를 시작하게 되었다.

 

단위 테스트

 

순수하게 테스트 코드만 작성하는 것을 의미한다. TDD, Test-driven Development와 다르게 리펙토링이 포함되거나 먼저 테스트 코드를 작성하는 것이 아니라고 한다. 그냥 순전히 테스트를 위해서 작성하는 코드, 그게 바로 단위 테스트를 의미하는 것이다.

 

단위 테스트

  • 개발 초기에 문제를 발견하게 도와주는 역할
  • 개발자가 추후에 리펙토링 혹은 사용했던 라이브러리 업그레이드에 대해 기능이 작동하는지 확인 가능
  • 단위 테스트는 기능에 대한 불확실성 감소
  • 빠른 피드백 
  • 웹서버 톰캣을 재실행하는 과정의 생략
  • 수동 검증 System.out.println()이 아닌 테스트 코드를 통한 자동 검증
  • 개발자가 만든 기능 보호

Java의 경우 학습할 때 Junit을 사용하여 공부를 진행했다.

 

JUnit 5

 

JUnit 5

The JUnit team uses GitHub for version control, project management, and CI.

junit.org

 

책에서 나온 TestCode 예제

 

책에서 나온 예제 코드는 Junit4를 기반으로 설명이 되어있다. 이 부분을 조심해서 예제를 따라 해 보았다.

package com.example.page.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }
}

 

package com.example.page.controller;

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.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;


@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));
    }
}

 

사용된 어노테이션 및 객체

 

  • @RunWith(SpringRunner.class)
    • 테스트를 진행될 때 Junit에 내장된 실행자 외에 다른 실행자를 실행시킴
    • 해당 경우에는 SpringRunner라는 스프링 실행자 사용
  • @WebMvcTest
    • 스프링의 테스트 어노테이션에는 다양한 Test 어노테이션이 존재
    • 이때 해당 어노테이션은 Web(Spring MVC)에 집중을 한다는 뜻의 어노테이션
    • 해당 어노테이션 사용 시 @Controller, @ControllerAdvice 사용 가능
    • @Service, @Component, @Repository는 사용 불가
    • 해당 어노테이션은 컨트롤러만 사용 가능   
  • @Autowired
    • 스프링이 관리하는 빈(bean)을 주입 받음
  • private MockMvc mvc
    • 웹 API를  테스트할 때 사용
    • 스프링 MVC 테스트의 시작점
    • 해당 클래스를 통해 HTTP GET, POST 등에 대한 API 테스트 가능
  • mvc.perform(get("/hello"))
    • MockMvc를 통해 /hello 주소로 GET 요청
    • 체이닝이 지원, 아래와 같이 andExpect 같은 여러 가지의 검증 기능을 선언 가능
  • andExpect(status(). isOk())
    • mvc.perform의 결과를 검증
    • HTTP Header의 Status를 검증
    • HTTP 상태 코드를 검증하며 1xx,2xx,3xx,4xx,5xx 등의 상태를 검증
    • isOk()의 존재로 이번의 경우 200이 결괏값으로 나오는지 안 나오는지를 체크한다.
  • andExpect(content(). string(hello))
    • mvc.perform의 결과를 검증
    • 응답 본문의 내용을 검증
    • Controller에서 "hello"를 리턴하기 때문에 해당 값이 맞는지 검증

 

 

진행과정 중 발생한 오류들

 

File - setting - build tool 변경

gradle → Intellij IDEA

 

--

 

아직 TestCode의 존재와 필요성을 느낀 것뿐이다. 그렇기에 해당 부분에 대해 공부를 진행하며 해당 페이지에 내용을 더 채워 넣을 예정이다.

 

참고 서적 및 링크

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 : 네이버 도서 (naver.com)

 

스프링 부트와 AWS로 혼자 구현하는 웹 서비스 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 

https://www.inflearn.com/questions/15495/%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8F%84%EC%A4%91-%EC%97%90%EB%9F%AC-%EB%B0%9C%EC%83%9D

 

테스트 도중 에러 발생 - 인프런 | 질문 & 답변

FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':test'. > No tests found for given includes: [jpabook.jpashop....

www.inflearn.com

MockMvc (Spring Framework 6.0.2 API)

 

MockMvc (Spring Framework 6.0.2 API)

Perform a request and return a type that allows chaining further actions, such as asserting expectations, on the result.

docs.spring.io