본문 바로가기
개발/TEST관련

테스트 주도 개발 - 1~2장

by ahoy~ 2020. 5. 24.

TDD의 주기

  1. 테스트를 작성한다.
    올바른 답을 얻기 위해 필요한 모든 요소를 포함하여야한다!
  2. 실행 가능하게 만든다.
    빨리 초록 막대를 보는 것이 핵심이다.
    깔끔하고 단순한 해법이 명백히 보인다면 바로 구현하는 것도 괜찮다.
    하지만 구현에 몇분이상 걸린다면 최대한 짧고 나쁘게(?) 구현한다.
  3. 올바르게 만든다.(리팩토링)
    저질렀던 죄악을 수습한다. 소프트웨어 정의에 따라 구현한다.

이러한 주기를 짧게 가져갈 수 록 좋다.
테스트도 작은 테스트 단위로 추가하고 코드를 조금 수정 후, 바로 리팩토링을 한다.


TDD의 목표는 무엇일까?

  • 작동하는 깔끔한 코드를 얻는 것이 목적이다.
  • 두려움을 관리할 수 있다. 두려움을 테스트로 극복하는 것이다.
  • TDD는 로직이 복잡할 때 빛을 발한다.
    간단한 경우에는 아무렇게나 작성해도 상관없다.
    로직이 복잡해지는 경우 TDD로 작성하면 깨끗하고 아름다운 코드가 산출된다.

실제 구현을 해보도록 하자

구현해야하는 것

어떤 금액(주가)를 어떤 수(주식의 수)에 곱한 금액을 결과로 얻을 수 있어야 한다.

먼저 테스트부터 작성하는 것이 핵심이다.
바로 간단한 곱셈 테스트를 만든다.

public void testMultiplication(){
    Dollar five= new Dollar(5);
    five.times(2);
    assertEquals(10, five.amount);
}

아직 문제가 많다.
이를 리스트로 작성하고 나중에 하나하나 처리하도록 하자.(하나의 테스트 단위로 문제를 처리하는 것이 TDD이다.)

  • $5*2=$10
  • amount를 private으로 만들기
  • Dollar부작용(side effect)?
  • Money 반올림

테스트를 돌리면 컴파일조차 되지 않는다!
컴파일부터 되게 하자!
컴파일 에러 목록을 작성한다.

  • Dollar 클래스가 없음
  • 생성자가 없음
  • times(int) 메서드가 없음
  • amount 필드가 없음

컴파일만 되게 구현하여 보자

class Dollar{
    int amount;
    Dollar(int amount){
    }
    void times(int multiplier){
    }
}

말 그대로 컴파일만 되게 하였다.

이제 초록 막대만 띄우기 위해 최소 작업을 한다.

    int amount=10;

말 그대로 최소 작업이고 테스트만 통과한다.

이제 리팩토링을 해보자!!!!
Dollar.times()함수에서 amount를 수정하면 된다.

class Dollar{
    void times(int multiplier){
        aount*=multiplier;
    }
}

자 하나를 처리하였다.

  • $5*2=$10
  • amount를 private으로 만들기
  • Dollar부작용(side effect)?
  • Money 반올림

이러한 식으로 하나하나 처리해나가는 것이다.
TDD를 따르면 그냥 기계처럼 사고를 줄이고 코딩을 할 수 있게 된다.
이 방식은 특히나 로직이 복잡할 때, 짧은 단위의 코딩을 억지로 하게 함으로써 코드 퀄리티를 많이 향상시킬 것이라고 생각한다.

2장에서는 똑같은 방식으로 "amount를 private으로 만들기" 를 처리한다.
이를 위해 테스트를 수정하고 Dollar.times()함수에서 amount를 수정하지 않고 새로운 Dollar객체를 반환하는 방식을 사용한다.(필요에 따라 테스트를 수정하여도 된다.)


개인적으로 직접 해보니

직접 해보면서 느낀 점은 코딩의 호흡이 엄청나게 짧다는 것이다.
이렇게 짜면 함수 하나가 절때 길어질 수가 없을 뿐더러 모든 함수나 클래스가 각자의 최소한의 책임을 가지는 방식으로 구현이 될것임이 자명하다.
꽤 괜찮은 방법론이라는 것이 1장에서 부터 느껴진다.
이 또한 적어도 코딩을 한번 깊게 해본 사람만이 느낄 수 있을 것 같고 현재 나에게 딱 도움이 되는 책이라는 것이 확실하다.

'개발 > TEST관련' 카테고리의 다른 글

테스트에서의 서비스 추상화  (0) 2020.10.05
테스트 주도 개발 3~9장  (0) 2020.06.15
테스트 주도 개발  (2) 2020.05.24

댓글