티스토리 뷰

책도 읽고

테스트 주도 개발 - 켄트백

사용자 eungding 2019. 7. 29. 00:57
728x90
반응형

 

https://marsner.com/blog/why-test-driven-development-tdd/

 

[ TDD의 주문 ]

TDD의 주문 = 빨강/초록/리팩토링

 

1. 빨강 - 실패하는 작은 테스트를 작성한다. 처음에는 컴파일조차 되지 않을 수 있다

2. 초록 - 빨리 테스트가 통과하게끔 만든다. 이를 위해 어떤 죄악을 저질러도 좋다
(죄악이란 기존 코드 복사해서 붙이기, 테스트만 간신히 통과할 수 있게끔 함수가 무조건 특정 상수를 반환하도록 구현하기 등을 의미한다)

3. 리팩토링 - 일단 테스트를 통과하게만 하는 와중에 생겨난 모든 중복을 제거한다

 

 

[ 예제 ]

 

1. 정말 리얼 말그대로 테스트를 가장 먼저 작성한다 

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

 

2. 당연히 컴파일 에러가 난다 

 

- Dollar 클래스가 없음

- 생성자가 없음

- times(int) 메서드가 없음

- amount 필드가 없음 

 

위의 4가지의 컴파일 에러가 있는데, 이것을 하나씩 정복한다 

- Dollar 클래스 만들고

- 생성자 만들고

-  times(int) 메소드 만들고

- amount 필드를 추가한다 

 

컴파일만 될 수 있는 아주 최소한의 구현만으로...!!! 

 

3. 그리고 하나씩 제대로 동작하게 만든다 ('작동하는 코드' 먼저)

 

4. 마지막으로 깔끔한 코드로 만든다  ('깔끔한 코드' 는 그 다음에)

 

 

[ 그외 ]

 

<UI 구현도 TDD로>

하나하나 테스트를 작성하며 컨트롤을 붙여나가고,

컨트롤 간의 상호 작용에 대해서 역시 테스트를 작성하고 구현하며 리팩토링하는 리듬을 계속 유지할 수 있다

 

예를 들어보자

필요한 View를 만들 때 일단 테스트 코드를 작성한다 

public void testPresentation() {
    VendingMachinePanel vmp;
    vmp = new VendingMachinePanel();
    
    assertNotNull(vmp.moneyPanel);
    assertNotNull(vmp.tackbackPanel);
    assertNotNull(vmp.buttonTakeBack);
    assertNotNull(vmp.buttonInsertMoney);
}

 

테스트가 통과하도록 구현한다

public class VendingMachinePanel extends JFrame {
    public JTextField moneyPanel = new JTextField();
    public JTextField tackbackPanel = new JTextField();
    public JTextField buttonTakeBack = new JTextField();
    public JTextField buttonInsertMoney = new JTextField();
}

 

<뷰-모델 간 상호작용도>

public void testInsertMoney() {
    VendingMachinePanel vmp = new VendingMachinePanel();
    VendingMachine vn = new VendingMachine();
    
    vmp.setVendingMachine(vm);
    int money = 500;
    vmp.moneyPanel.setText(new Integer(money).toString());
    vmp.buttonInsertMoney.doClick();
    assertEquals(money, vm.getCurrentMoney())
}

이런식으로 테스트를 먼저 짠다음에 테스트를 통과하도록 구현한다 

728x90
반응형
댓글
댓글쓰기 폼