Study/Test

TDD(Test Driven Development) 정리

jonghne 2023. 11. 30. 17:10

 

TDD(Test Driven Development)란 ?

TDD란 “테스트 주도 개발” 이라는 뜻으로, 프로덕션 코드보다 테스트 코드를 먼저 작성해서 테스트가 구현 과정을 주도하는 개발 방법론이다.

 

 

TDD 과정 (RED-GREEN-REFACTOR) 

 

TDD는 아래와 같은 RED - GREEN - REFACTOR 과정을 거치며 프로덕션 코드를 완성해간다.

 

1단계 : RED 

기능을 구현하기 전 테스트 코드를 먼저 작성하고, 테스트를 실행시켜 실패하는 과정을 겪는다.

 

📌 예시

아래의 코드는 TDD의 RED 과정의 예시로,  음료의 총 금액을 구하는 calculateTotalPrice 메소드의 단위 테스트 코드이다. 

현재 calculateTotalPrice 메소드는 구현되지 않았고, 테스트 코드만 작성해놓은 상태이기 때문에 테스트를 하면 빨간 불과 함께 실패하게 된다.

 

테스트 코드 작성

@Test
void calculateTotalPriceTest(){
    CafeKiosk cafeKiosk = new CafeKiosk();
    Americano americano = new Americano();
    Latte latte = new Latte();
    
    cafeKiosk.add(americano);
    cafeKiosk.add(latte);
    
    int totalPrice = cafeKiosk.calculateTotalPrice();

	assertThat(totalPrice).isEqualTo(8500);
}


테스트 대상 메소드 (구현 전)

// 구현 전
public int calculateTotalPrice() {
    return 0;
}

 

 

2단계 : GREEN

실패한 테스트가 통과하기 위해 최소한의 코딩을 통해 메소드를 구현한다

이때, 구현 퀄리티는 크게 중요하지 않고 빠르게 테스트를 통과하기 위한 최소한의 코딩을 하는 것에 초점을 맞춘다.

 

📌 예시 
아래와 같이 최소한의 코딩을 통해 테스트를 통과시킨다.

public int calculateTotalPrice() {
    return 8500;
}

 

 

3단계 : REFACTOR

그 다음으로 테스트 코드가 통과하는 상태를 유지하면서 코드를 구현하고 리팩토링을 진행한다.

 

메소드의 수정이 일어나면 테스트 코드를 수행해서 통과하는지 확인해야 한다 !

 

📌 예시

public int calculateTotalPrice() {
    return beverages.stream()
                .mapToInt(Beverage::getPrice)
                .sum();
}

 

 

TDD 장단점

TDD 장점

1. 유연하고 유지보수가 쉬운 코드를 구현할 수 있다. 

  - 테스트가 통과하기 위한 구조를 구현하게 해준다.

  - 테스트하기 어려운 부분을 외부로 분리하게 해준다.

 

2. 쉽게 발견하기 어려운 엣지(Edge) 케이스에 대해 놓치지 않게 해준다


3. 구현에 대한 빠른 피드백이 가능하다 

4. 과감한 리팩토링이 가능해진다. 

  - 구현한 코드를 테스트 코드가 검증해주기 때문에

 

TDD 단점

1. 테스트 코드 작성 과정에서 실수를 범할 수 있다. 

  - 테스트 코드가 프로덕션 코드를 주도하는 방법론인데, 테스트 코드 작성 과정 자체에서 실수가 이루어진다면 TDD는 효과가 없다

 

2. 모든 프로젝트에 적용하기에는 한계가 있다. 

  - 쉽게 변하지 않는 코드에도 모두 TDD를 적용 하기엔 비효율적이다.

 

3. 비즈니스 로직이 변경되는 경우 

  - 고객 요구사항에 의해 비즈니스 로직이 변경되는 경우가 종종 있는데, 그럴때마다 TDD를 적용하기에는 비효율적일 수도 있다. 

 

정리

 TDD는 위의 내용 외에도 여러 장단점이 공존한다. 

실제 현업 개발자들 사이에서도 TDD에 대한 찬반 여론이 존재한다. 

 

그러므로 우선 TDD에 대한 장단점을 인지하고, 본인의 프로젝트 상황에 맞게 적용하는 것이 좋을 것 같다. 

(단, TDD를 적용하지 않아도 테스트 코드는 항상 중요하다는 점을 명심해야 한다)

 

 

 

 

이미지 출처 : 인프런 Practical Testing: 실용적인 테스트 가이드