lang/tdd

TDD 실습 - 은행계좌(Account) 클래스 만들기

C/H 2010. 12. 3. 08:30

은행계좌 클래스

* 첫번째 질문

  • 구현해야 할 기능을 파악하고, 목록을 작성한다.
  • 계좌 생성 기능을 구현하기 위한 최초의 테스트 케이스를 만들고 실패하는 모습을 확인한다.
작성하고자 하는 메소드나 기능이 무엇인지 선별하고, 작성 완료 조건을 정해서 실패하는 케이스를 작성하는것.

클래스 설계서와 같은 산출물이 있는 경우라면, 크게 고민할 것 없이 메소드 외양부터 만들기 시작.
이때 리턴 타입은 기본 초기값(null, 0 등) 위주로 설정해놓으면 편한다. 이런 방식을 클래스 스켈레톤(skeleton) 구현이라고 부른다.

업무전문가나 설계자로부터 넘겨받은 산출물이 없다면 개발에 필요한 내용을 개발자가 스스로 머릿속에서 떠올려야 한다.
이 예제에서는 설계문서 없이 곧바로 개발한다. 라고 가정.

* 기능요구사항 & 유의사항

ToDo
  • 클래스 이름 Account
  • 기능은 세가지
    • 잔고조회
    • 임금
    • 출금

    * 금액은 원 단위로 (예 : 천 원 = 1000)
테스트 케이스 작성 접근방식
  1. 구현 대상 클래스의 외형에 해당하는 메소들을 먼저 만들고 테스트 케이스를 일괄적으로 만드는 방식
  2. 테스트 케이스를 하나씩 추가해나가면서 구현 클래스를 점진적으로 만드는 방식

대부분의 TDD 책에서는 2번을 권장한다. 첫 번째 방식을 사용했을 경우에는, 모든 테스트가 정상 통과하는 올 그린(All Green) 상태에 이르기까지 긴 시간이 걸릴 수 있다. 그로 인해 TDD의 몇 가지 장점을 잃을 우려가 있기 때문에 초보자에게는 권하지 않는다.

* 첫 번째 응답: 계좌 생성 메소드 구현

  • 계좌 생성 테스트 케이스를 통과하는 코드를 작성한다.
package test;

import main.Account;

/**
 * 계좌 테스트 클래스 
 * @author uncaose
 *
 */
public class AccountTest {
	/**
	 * 계좌생성 테스트
	 * @throws Exception 
	 */
	public void testAccount() throws Exception{
		Account account = new Account();
		if( account == null){
			throw new Exception("계좌생성 실패");
		}
	}
	
	/**
	 * 테스트 실행
	 */
	public static void main(String[] args){
		AccountTest test = new AccountTest();
		try {
			//테스트 케이스 실행
			test.testAccount();
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("성공");
	}
}
package main;

public class Account {
	
}

최대한 빨리 실패하기
TDD에서는 테스트 자동화를 통해 개발이 시작된 시점부터 완료될 때까지 가능한 한 빠른 시점 내에 그리고 자주 실패를 경험하도록 유도하고 있다. 심지어는 개발이 시작되기도 전에 실패가 발생하는 상황부터 보고 시작하라고 하니 말 다했다. 그런데 이런 방식은 사실 일반적인 문제해결 방식과는 조금 다르다. 보토은 작업의 중관 과정에서조차도 실패를 하지 않기 위해 최대한 노력하는 경우가 더 많다. 하지만 TDD는 실패를 통해 배움을 늘겨가는 법이다. OK 조건을 사전에 정해두고 빠르게 실패를 경험하며, 그 조건을 등대로 삼아 실패 상황을 최대한 빠리 극복하고자 노력한다. 성공한 항목과 실패한 항목이 명확하고, 작업해야 하는 부분이 확실하다. 성공에 필요한 조건을 만들고, 실패하는 조건 항목을 성공시킨다. 그래서 빨리 실패하면 실패할수록 좀 더 성공에 가까워지는 묘한 개발 방식이다.

* 최초의 정재

  • 리팩토링을 적용할 부분이 있는지 찾아본다.
  • ToDo 목록에서 완료된 부분을 지운다.
  • 소스의 가독성이 적절한가?
  • 중복된 코드는 없는가?
  • 이름이 잘못 부여된 메소드나 변수명은 없는가?
  • 구조의 개선이 필요한 부분은 없는가?

테스트 케이스 추가
	public static void main(String[] args){
		AccountTest test = new AccountTest();
		try {
			test.testAccount();		// 계좌 생성
			test.testGetBalance();	// 잔고 조회
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("성공");
	}
ToDo
  • 클래스 이름 Account
  • 기능은 세가지
    • 잔고조회
    • 임금
    • 출금

    * 금액은 원 단위로 (예 : 천 원 = 1000)

올 그린(All Green) : TDD에서는 모든 테스트 케이스가 통과하면 녹색 막대가 표시된다. 테스트 케이스를 기준으로 소스코드가 모든 테스트를 정상통과해, 현재 시스템이 건강하다고 판단하는 상태를 흔히 올 그린 상태라고 표현한다.


반응형

'lang > tdd' 카테고리의 다른 글

OOP 객체 액션  (0) 2010.12.14
TDD 우분투에서 phpunit 설치  (0) 2010.12.08
TDD jUnit4 비교표현확장: Hamcrest  (0) 2010.12.07
TDD jUnit4 특징  (0) 2010.12.06
TDD 개발 진행방식  (0) 2010.12.02