본문 바로가기
기타

Test Driven Development

by oncerun 2020. 7. 29.
반응형

테스트 주도 개발은 무엇일까요?

 

편하게 목표 주도 개발이라고 할 수 있습니다. 목표를 달성했는지 안 했는지 확인하는 것은 테스트를 하는 것입니다.

테스트에는 우리가 달성해야 될 목표가 정해져 있습니다. 그것이 통과가 된다면 목표를 달성한 것이고 실패한다면 목표를 달성하지 못한 것입니다.

 

또 하나 사용자 중심 개발 , 인터페이스 중심 개발이라고도 합니다.

 

TDD를 하는 이유

첫 번째로 목표를 달성하기 위해 올바르게 작동하는 코드를 작성하는 것입니다.

두 번째 목표는 깔끔한 코드를 만드는 것이 두 번째 목표입니다.

 

한마디로 올바르게 작동하며 깔끔한 코드를 작성하는 것이 TDD의 목표라고 할 수 있습니다.

 

사용하기 위해선 올바르게 작동하는 코드를 만듭니다. 그 이후 깔끔한 코드가 되도록 Refactoring을 합니다.

리팩터링은 작동하는 것은 그대로 둔상태에서 내부 구현 즉 코드만 변경하는 것입니다.

이러기 위해서 올바르게 작동한다는 것을 보장할 수 있는 test code가 필요합니다.

 

따라서 test code를 먼저 작성하는 것이 TDD에서 핵심 아이디어입니다.

 

TDD는 간단한 3가지 과정을 거쳐서 실행하게 됩니다.

 

Red

Green

Refactoring

 

이라는 사이클이 있습니다.

 

Red는 실패하는 테스트를 의미합니다. 

Green은 실질적인 기능을 만듭니다.

Refactoring  코드를 깔끔하게 만듭니다.

 

간단한 실습

 

spring boot에서는 Junit을 기본적으로 지원하므로 사용하여 test코드를 작성합니다.

package kr.co.fastcampus.eatgo.domain;

import org.junit.jupiter.api.Test;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;


class RestaurantTests {

    @Test
    public void cration(){
        Restaurant restaurant = new Restaurant();
        assertThat(restaurant.getName(), is("Bob zip"));


    }

}

assertThat은 '이것'은 '이것'이다라는 코드입니다.

 

실패를 위해서 getName() 메서드의 return값을 ""으로 설정해준 뒤 테스트를 시작해봅니다.

Bob zip but was ""이다라는 코드를 확인할 수 있습니다. 현재는 레드 사이클입니다.

이제 Green으로 갑니다.

 

실제 경우에는 훨씬 복잡하기 때문에 필요한 부분을 구현하고 이렇게 사용할 것이라는 test코드를 만들면 미래에 겪게 될 에러를 방지하고 바로 해결할 수 있습니다.

 

가볍게 MVC TEST를 진행해 봅니다.

package kr.co.fastcampus.eatgo.interfaces;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
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.status;


@ExtendWith(SpringExtension.class)
@WebMvcTest(RestaurantController.class)
class RestaurantControllerTest {

    @Autowired
    private MockMvc mvc;


    @Test
    public void list(){
        try {
            mvc.perform(get("/restaurant")).andExpect(status().isOk());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

MockMvc는 웹 애플리케이션을 애플리케이션 서버에 배포하지 않고도 스프링 MVC의 동작을 재현할 수 있는 클래스입니다. 

junit5에서는 @ExtendWith를 통해서 test를 진행해야 합니다.

ExtendWith는 JUnit5에서 반복적으로 실행되는 클래스나 메서드에 선언한다. SpringExtension는 스프링 5에 추가된 JUnit 5의 주피터(Jupiter) 모델에서 스프링 테스트 콘텍스트(TestContext)를 사용할 수 있도록 합니다.

 

 

TestController는 의존성 주입을 직접 해주어야만 합니다.

Spring boot에서는 @SpyBean으로 DI를 할 수 있습니다.

@SpyBean(RestaurantRepositoryImpl.class)
private RestaurantRepository restaurantRepository;
반응형

'기타' 카테고리의 다른 글

조합회로와 순차회로  (0) 2020.10.26
부동소수점 실수 표현  (0) 2020.10.11
펌 특수문자 모음  (0) 2020.10.11
컴퓨터가 부호 있는 정수를 표현하는 방법  (0) 2020.09.30
진법  (0) 2020.09.30

댓글