4.3 테스트 코드 작성

SummerToday·2024년 2월 2일
1
post-thumbnail
post-custom-banner

테스트 코드 작성

1. 테스트 코드 파일 생성

테스트 코드를 작성하고 싶은 클래스 위에 마우스 커서를 올려 놓고 Alt + Enter를 눌러 [createTest]를 누르면 해당 클래스의 테스트 파일이 자동으로 test/java/ 패키지 아래에 생성된다.

2. 테스트 클래스 로직 작성 준비

테스트 클래스 로직 작성 전 다음과 같이 테스트 코드의 틀을 먼저 작성한다.

//TestControllerTest.java

@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성
class TestControllerTest {

    @Autowired
    protected MockMvc mockMvc;

    @Autowired
    private WebApplicationContext context;

    @Autowired
    private MemberRepository memberRepository;

    @BeforeEach //  테스트 실행 전 실행하는 메소드
    public void mockMvcSetUp() {
        this.mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .build();
    }

    @AfterEach // 테스트 실행 후 실행하는 메소드
    public void cleanUp() {
        memberRepository.deleteAll();
    }
    
    /*
    
      테스트 클래스 로직 작성
    
    */
}
  • @SpringBootTest
    메인 애플리케이션 클래스에 추가하는 애너테이션인 @SpringBootApplication이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트라는 것을 만든다. 이를 통해 테스트할 때 실제 애플리케이션과 유사한 빈들을 포함하는 컨텍스트를 사용할 수 있게 된다

  • @AutoConfigureMockMvc
    MockMvc를 생성하고 자동으로 구성하는 애너테이션이다.

    MockMvc는 애플리케이션을 서버에 배포하지 않고도 테스트용 MVC환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스이다. 즉, 컨트롤러를 테스트할 때 사용되는 클래스이다.

  • @Autowired
    : 의존성 주입을 할 때 사용하는 Annotation으로 의존 객체의 타입에 해당하는 bean을 찾아 주입하는 역할을 한다. 생성자, setter, 필드에 사용될 수 있다.

  • @BeforeEach
    테스트를 실행하기 전에 실행하는 메소드에 적용하는 애너테이션이다.
    위 코드에서는 MockMvcSetUp()메소드를 실행해 MockMvc를 설정해준다.

  • @AfterEach
    테스트를 실행한 이후에 실행하는 메소드에 적용하는 애너테이션이다.
    위 코드에서는 cleanUp()메소드를 실행해 member 테이블에 있는 데이터들을 모두 삭제한다.

3. 테스트 클래스 로직 작성

@SpringBootTest // 테스트용 애플리케이션 컨텍스트 생성
@AutoConfigureMockMvc // MockMvc 생성

class TestControllerTest {

    /*
    
      생략
    
    */
    
    // Given-When-Then 패턴 적용
    
    @DisplayName("getAllMembers: 아티클 조회에 성공한다.") //테스트 이름을 명시
    @Test // 테스트를 수행하는 메소드임을 명시
    public void getAllMembers() throws Exception {
        // given
        final String url = "/test";
        Member savedMember = memberRepository.save(new Member(1L, "홍길동"));

        // when
        final ResultActions result = mockMvc.perform(get(url) 
                .accept(MediaType.APPLICATION_JSON)); 

        // then
        result
                .andExpect(status().isOk())
                .andExpect(jsonPath("$[0].id").value(savedMember.getId()))
                .andExpect(jsonPath("$[0].name").value(savedMember.getName()));
    }
}
  • Given : 멤버 저장
  • When : 멤버 리스트를 조회하는 API 호출
  • Then 응답 코드가 200 Ok이고, 반환받은 값 중에 0번째 요소의 id와 name이 저장된 값이 같은지 확인한다.
  • ResultActions 클래스
    : Spring MVC의 테스트 프레임워크에서 제공되며, HTTP 요청에 대한 응답을 테스트하기 위한 메서드를 제공한다. 이 클래스는 주로 MockMvc.perform() 메서드로부터 반환되고, 다양한 검증에 관한 메서드를 제공한다.

    • andExpect()
      : 응답의 상태 코드, 내용, 헤더 등을 검증하는 데 사용된다.

    • andDo()
      : 테스트 실행 중에 추가 작업을 수행하는 데 사용된다. 예를 들어, 로그를 출력하거나 디버깅에 도움이 되는 정보를 수집하는 등의 작업을 수행할 수 있다.

    • andReturn()
      : 컨트롤러 메서드가 반환한 객체나 데이터를 가져오는데 사용된다. 이를 통해 컨트롤러에서 반환한 객체를 테스트에서 활용할 수 있다.

    • andDo(print())
      : 요청 및 응답의 내용을 콘솔에 출력하는 데 사용된다. 주로 디버깅 시 사용된다 .
  • perform()
    : MockMvc에서 제공되는 메서드로, 실제 HTTP 요청을 수행하는 역할을 한다.
    perform() 메서드의 인자에는 MockHttpServletRequestBuilder 객체가 들어가고, 이 객체는 MockMvc를 사용하여 수행할 HTTP 요청(post, get, put, delete, ...)을 나타낸다.

    • MockHttpServletRequestBuilder 제공 메서드
      • get(String url, ...)
      • post(String url, ...)
      • put(String url, ...)
      • delete(String url, ...)

    • 각 메서드별로 URL, URL 매개변수, Query 매개변수 등을 인자로 줄 수 있다.
  • accept()
    : 요청을 보낼 때 무슨 타입으로 응답을 받을지 결정하는 메소드. JSON, XML 등 다양한 타입의 응답을 받을 수 있다.

  • andExpect()
    : ResultActions 객체가 제공하는, HTTP 응답을 검증하는 메소드이다. 예를 들어, 상태 코드, 헤더, JSON 응답의 특정 필드 등을 확인할 수 있다.

  • jsonPath("[n].[n].{필드명}).value(x)
    : JSON 응답값의 값을 가져오는 메소드이다. n번째 배열에 들어있는 객체의 필드 값을 가져오고, 저장된 값과 x값이 같은 지 확인한다.

cf. 주요 HTTP 응답 확인 메소드

  • isOk()
    : HTTP 응답 코드가 200 OK인지 확인.

  • isCreated()
    : HTTP 응답 코드가 201 Created인지 확인.

  • isBadRequest()
    : HTTP 응답 코드가 400 Bad Request인지 확인.

  • isForbidden()
    : HTTP 응답 코드가 403 Forbidden인지 확인.

  • isNotFound()
    : HTTP 응답 코드가 404 Not Found인지 확인.

  • is4xxClientError()
    : HTTP 응답 코드가 400번대인지 확인.

  • isInternalServerError()
    : HTTP 응답 코드가 500 Internal Server Error인지 확인.

  • is5xxServerError()
    : HTTP 응답 코드가 500번대인지 확인.

4. 테스트 코드 실행

해당 테스트 파일에 오른쪽 마우스를 클릭하고 [Run '클래스 이름']를 선택하여 테스트 코드를 실행한다.

cf. 만약 테스트 실행 버튼이 없다면 @Test 관련 import문을 잘 작성했는지 확인한다.




해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽
profile
IT, 개발 관련 정보들을 기록하는 장소입니다.
post-custom-banner

0개의 댓글