코딩하는 문과생

[Spring Boot] TDD & 단위테스트 본문

웹 프로그래밍/Spring Boot

[Spring Boot] TDD & 단위테스트

코딩하는 문과생 2020. 11. 30. 00:41

 

※ 해당 글은 튜토리얼이 아닌 헷갈리거나 중요한 개념 위주로 정리한 글입니다. 

 

[TDD]

: 테스트가 주도하는 개발

  • 테스트코드 작성 후(red)
  • 테스트가 통과하는 프로덕트 코드를 작성(green)
  • 이후 리팩토링 진행(refactoring)

 

[단위테스트]

: 기능 단위의 테스트 코드를 작성

- 장점

  • 톰캣을 계속내렸다 올릴 필요가 없다.
  • 자동검증이 가능하다.
  • 개발자가 만든 기능을 보호한다.

* 테스트코드 작성을 도와주는 프레임워크: JUnit

 

예제코드) 컨트롤러 내 테스트 코드 작성

@RunWith(SpringRunner.class) //Junit 프레임워크의 SpringRunner라는 클래스를 실행시켜라
@WebMvcTest(controllers = HelloController.class) //@Controller등을 사용할 수 있다.
public class HelloControllerTest {
    @Autowired //스프링이 관리하는 빈 주입을 받는다.
    private MockMvc mvc; // 웹 API 테스트 시 사용(HTTP GET, POST), 스프링 MVC의 시작

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

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

}

[단위 테스트의 예시]

-lombok?

: 자바 개발시 자주 사용하는 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성

ex) @Getter, @RequiredArgsContstuctor

* 플러그인은 한번 설정하면 되지만, 의존성은 계속 작성해야한다.

 

-lombok이 잘 작동하는 지 테스트

 

1. HelloResponseDto를 작성하고

@Getter
@RequiredArgsConstructor //final필드가 포함된 생성자를 생성해 준다.
public class HelloResponseDto {

    private final String name;
    private final int amount;
}

2. Dto자체 단위테스트 진행 후

: 값을 잘 담는지 확인

public class HelloResponseDtoTest {

    @Test
    public void lombok_function_test(){
        //given
        String name = "test";
        int amount = 1000;

        //when
        HelloResponseDto dto = new HelloResponseDto(name, amount);

        //then
        assertThat(dto.getName()).isEqualTo(name); //assertThat: 테스트 검증 라이브러리
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

3. 컨트롤러 내에서 dto를 이용해 값을 잘 받아오는 지 확인한다.

: 컨트롤러가 잘 동작하는 지 확인

@RunWith(SpringRunner.class) //Junit 프레임워크의 SpringRunner라는 클래스를 실행시켜라
@WebMvcTest(controllers = HelloController.class) //@Controller등을 사용할 수 있다.
public class HelloControllerTest {
    @Autowired //스프링이 관리하는 빈 주입을 받는다.
    private MockMvc mvc; // 웹 API 테스트 시 사용(HTTP GET, POST), 스프링 MVC의 시작

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

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

    @Test
    public void helloDto_return() throws Exception {
        String name = "hello";
        int amount = 1000;

        mvc.perform(get("/hello/dto").param("name", name).param("amount", String.valueOf(amount))) //api테스트 시 요청 파라미터 설정, 단 String만 허용
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name))) //json응답을 필드별 검증할 수 있는 메소드, $기준으로 필드명을 명시한다.
                .andExpect(jsonPath("$.amount", is(amount)));
    }

}
즉, 단위테스트란, 컨트롤러, DTO, 서비스, 리포지토리 등 각 단위별로 테스트를 진행하는 것을 의미한다.

예를 들어 컨트롤러에서 서비스, 리포지토리가 정확하게 구현되어 있지않아도 단위별로 테스트 진행이 가능하다. 컨트롤러 내 MockMvc 객체(단지 브라우저의 요청과 응답을 담당)나 DTO내 assertThat 등을 이용해 단위테스트를 구현할 수 있다.

 

  

[참고사항 - 단위테스트란?]

brunch.co.kr/@springboot/418

 

주니어 개발자를 위한 단위테스트 샘플 코드 소개

자바&스프링 환경에서 단위 테스트 경험해보기 | 이 글에서는, 자바&스프링부트 환경에서의 단위 테스트 샘플 사례를 설명합니다. 테스트 코드를 처음 접하는 주니어 개발자를 대상으로 작성한

brunch.co.kr

- 사실 단위테스트에 대해 모호한 느낌이 강했는데, 위 글을 읽고 어느정도 개념이 잡힌 듯하다. 읽어보면 좋을 듯 하다.

 

※ 해당 글은 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)"를 참고해 작성하였습니다.