본문 바로가기
공부/TDD

테스트 주도 개발 [1 - 9장]

by Moonsc 2020. 9. 5.
728x90

 

TDD의 목적은 작동하는 깔끔한 코드를 얻는 것이다.

작동하는 깔끔한 코드를 얻는 것은 때로는 최고의 프로그래머들 조차 
도달하기 힘든 목표고,
나같은 대부분의 평벙함 프로그래머들에게는 거의 불가능한 일이다. 

그렇다면 나누어서 정복하자. 일단 '작동하는 깔끔한 코드'를 얻어야 한다는
전체 문제 중에서 '작동하는' 에 해당하는 부분을 먼저 해결한다.

그러고 나서 '깔끔한 코드' 부분을 해결하는 것이다. 

 

요구사항

  • 통화가 다른 두 금액을 더해서 주어진 환율에 맞게 변한 금액을 결과로 얻을 수 있어야 한다.
  • 어떤 금액을 어떤 수에 곱한 금액을 결과로 얻을 수 있어야 한다.

할 일 목록

  • $5 + 10CHF = $10(환율이 2:1일 경우)
  • $5 x 2 = $10
  • Dollar 부작용(side effect?)
  • ...
  • ...

 

TDD 주기

  • 객체를 만들면서 시작하는게 아니라 테스트를 먼저 만들어야 한다. (구현이 아닌 테스트를 먼저 생각해야 한다.)
  • 테스트가 어려워 보인다면 작은 것부터 시작하든지, 아니면 아예 손을 대지 않는 게 좋다.
  • 실패하는 테스트 부터 작성하라.
  • 실패한 테스트는 빨리 성공시켜라.
  • 작은 단계를 밟아야 하는 것이 아니라 작은 단계를 밟을 능력을 갖추어야 한다.
  • 올바르게 작동하기 위한 리팩토링
  • 깔끔하게 만들기 위한 (중복 제거) 리팩토링

 

실패하는 테스트의 중요성

실패하는 테스트는 실패에 대한 구체적인 척도를 갖게 해준다. 막연히 실패했다는 사실만 아는 것보다 나아진 것이다.

'다중 통화 구현' 이라는 할 일에서 ' 이 테스트를 통과시킨 후 나머지 테스트들도 통과시키기' 로 변형된 것이다.

이건 훨씬 간단하며, 범위도 훨씬 줄어들어 걱정과 두려움이 줄 것 이다. 

 

실패한 테스트를 빨리 성공 시키는 방법

  • 초록막대를 보기 위해서 깔끔하고 단순한 해법이 있다면 그것을 입력하자. 
  • 만약 깔끔하고 단순한 해법이 있지만 구현하는데 몇 분 정도 걸릴 것 같으면 일단 적어 놓은 뒤에 원래 문제 (초록 막대를 보는 것)로 돌아오자.  
  • 테스트를 성공시키기 위해 스텁 구현 (어떤 죄악) 을 저질러도 된다. 
  • 테스트를 성공시켰다면 올바르게 만든다. 이제 시스템이 작동하므로 직전에 저질렀던 죄악을 수습하자.
  • 좁고 올곧은 소프트퉤어 정의의 길로 되돌아와서 중복을 제거하고 초록 막대로 되돌리자.

 

 

스텁 구현 (상태 테스트)

소프트웨어 개발에서 메소드 스텁 혹은 간단히 스텁은 다른 프로그래밍 기능을 대리하는 코드이다. 스텁은 기존 코드를 흉내내거나 아직 개발되지 않은 코드를 임시로 대치하는 역할을 수행한다.

예 : 테스트를 완료하는데 5 분이 소요된다면 5 분 동안 기다리지 않고 실제 구현을 하드 코딩 된 값을 반환하는 스텁을 구현한다

 

Dummy

예 : 생성자의 많은 필수 매개 변수가 필요한 클래스의 메서드를 테스트하는 경우 테스트에서 클래스의 새 인스턴스를 만들기 위해 더미 객체를 만들 수 있다.

 

Mocks (행동 테스트)

예 : 사용자 등록 클래스를 테스트하고 있다면 Save를 호출 한 후 SendEmail을 호출한다.

 

Fake 

일부 외부 인프라에 의존 할 수있는 클래스의 테스트 구현을 만듭니다. (단위 테스트는 실제로 외부 인프라와 상호 작용하는 하는 것이 좋다.)

 

  • Stubs  Mocks은 실제로 Mock의 하위 유형입니다. 둘 다 실제 구현을 테스트 구현과 교체하지만 구체적인 이유가 다르다.

 

 

 

테스트 성공 전략 하나. 가짜로 구현하기

  • 상수를 반환하게 만들고 진짜 코드를 얻을 때까찌 단계적으로 상수를 변수로 바꾸어 간다.

예상치 못한 빨간 막대를 만나게 되면 뒤로 한발 물러서서 가짜로 구현하기 방법을 사용하면서 올바른 코드로 리팩토링 한다.

 

테스트 성공 전략 둘. 명백한 구현 사용하기

  • 실제 구현을 입력한다. 내가 뭘 입력해야 할지 알 때는 명백한 구현을 계속 더해간다.

이때 나에게 명백한 사실이 컴퓨터에도 명백한 사실인지 확인하기 위해 명백한 구현 사이에 테스트를 한 번씩 실행한다.

 

테스트 성공 전략 셋. 삼각측량 

  • 두 개 이상의 테스트 케이스로 추상화 과정을 명백히 해간다.
public void 삼각측량(){

    assertTrue(new Dollar(5).equals(new Dollar(5)));
    assertFalse(new Dollar(5).equals(new Dollar(6)));
    
}



댓글