주제

book

  • 내용 : 테스트 주도 개발(켄트 백 저) 내용 리뷰
  • 계획 : 전체가 테스트 주도 개발 예제와 파이썬을 활용한 xUnit 구현으로 나뉘어있음. 우선 샘플 예제를 전부 작성하고 리뷰한 후, 추가적으로 Java를 활용하여 JUnit을 구현해보겠습니다.
  • 이슈사항 : 파이썬으로 작성된 코드에 대해 분석하고.. 자바로 구현을 해야할텐데 파이썬을 몰라서.. 켄트백이 작성한 다른 문서를 참고할 수도 있어요ㅠ

내용

Chapter 0. 들어가는 글 및 시나리오

현재 회사에서는 달러 화폐에 대한 채권 포트폴리오 관리 시스템을 판매하고 있다.

그러던 중 새로운 고객으로 부터 "새로운 채권 펀드를 시작하려 하는데 다른 화폐로 채권을 다룰 수 있도록 커스터마이징 해주세요"라는 요청을 받았다.

이를 반영하기 위해 TDD를 이용하여 리팩토링을 진행해보자.

이 책은 한가지 화폐에 대한 기능만을 가진 시스템을 다중 화폐를 지원하도록 리팩토링 하는 과정을 TDD를 통해 풀어내며 TDD의 반복 주기를 학습하는 과정을 담고 있다.

그리고 이 과정을 통해 알게된 테스팅 프레임워크를 파이썬으로 구현하는 과정을 진행하는데 테스팅 프레임워크는.. 파이썬을 모르므로 자바로 진행할 계획인데.. 우선 해보자..ㅎㅎ

  • 아무래도 책보고 정리하는 내용이다보니 주관적인 생각이 들어갈 수 있으므로… 참고만 하시고 자세한 공부는 따로 꼭 책을 읽어보시는걸 추천합니다.
  • 또한 책은… JUnit을 사용하고 있으나 경우에 따라서는 assertJ를 활용하니 참고하시기 바랍니다.

Chapter 1. 다중 통화를 지원하는 Money 객체

종목 가격 합계
IBM 1000 25 25000
GE 400 100 40000
    합계 65000

위와 같은 보고서에서 만약 다중 통화를 지원하려면 아래와 같이 통화 단위를 추가해야 한다.

종목 가격 합계
IBM 1000 25USD 25000USD
GE 400 150CHF 60000CHF
    합계 65000USD

또한 위와 같은 값을 산출할 환율 정보도 추가 되어야한다.

기준 변환 환율
CHF USD 1.5

이를 구현하기 위한 To Do List를 작성해두고 현재 진행 중인 작업은 굵은 글씨로 표기하도록 하겠다.

$5 + 10CHF = $10(환율이 2:1 인 경우)
$5 * 2 = $10

우선 위의

우선 위의 기능(Operation 혹은 Method)을 구현하기에 앞서 테스트 케이스에 대해 작성해야하는데 어떠한 기능이 필요한지 그 기능에 대한 인터페이스를 우선 고민해보는 습관이 필요하다.

기존의 Dollar 객체에 2를 곱하는 테스트를 작성하면 아래와 같다.

import org.junit.Test;
import static org.assertj.core.api.Assertions.*;

public class DollarTest {
    @Test
    public void testMuliplication(){
        Dollar five = new Dollar(5);
        five.times(2)
        assertThat(five.amount).isEqualTo(10);
    }
}

위의 테스트를 위해 필요한 사항을 리스트로 적어보자

  1. Dollar 클래스(생성자)
  2. times Method
  3. amount 변수(int)

그리고 위의 3가지 사항을 틀만 구현하여 컴파일에러 상태부터 벗어나자.물론 아주 간단한 기능을 하는 함수이므로 바로 구현가능하겠지만.. 우선은 TDD를 연습하는 목적이므로 아주 작은 단위로 작업을 진행하도록 권장한다.

위의 세가지 리스트 대로 “틀만 완성된” Dollar Class는 아래와 같다.

package Dollar;

public class Dollar {
    public int amount;
    
    public Dollar(int dollar) {}

    public void times(int times) {}
}

틀만 완성되었기 때문에 테스트에는 아직도 빨간색의 막대가 떠있다.

이를 최소한의 구현(하드코딩…)을 통해 통과시켜보자.

package Dollar;

public class Dollar {
    public int amount = 10;

    public Dollar(int dollar) {

    }

    public void times(int times) {
    }
}

하지만 현재로서는 만약 처음 객체를 생성할 때 입력한 값을 바꾸면 다시 테스트는 빨간색의 막대를 보여주기 때문에 약간의 수정을 더 진행해보자.