제목 | 테스트 주도 개발 1부 최종 산출물 | ||
---|---|---|---|
글쓴이 | 한대승(불의회상) | 작성시각 | 2012/08/24 08:38:22 |
|
|||
솔직히 어떻게 해야할 지 막막한 것은 사실 입니다. 회사에 "테스트 주도 개발"이라는 책이 눈에 띄였고... "PHP5 도 class를 지원 하니까.." 라는 생각으로 책을 읽으며 "JAVA로 되어 있는 예제를 PHP로 바꿔보자." 라고 결심! 가장 큰 문제는 Unit Test 였는데.. CI에 내장되어 있는 unit_test 라이브러리는 이전에도 써 봤지만 불편하고 Junit과 다른 방식을 사용하고 있어 예제에 기술 되어 있는 테스트 방식으로 가기가 힘들었습니다. Google에 접신 결과 Toast라는 Unit Test 툴을 찾게 되었고... 조건에 맞다고 판단 작업 시작하여 아래와 같은 최종 결과물이 나왔습니다. ------------ money_report_test.php require_once(APPPATH . '/controllers/test/Toast.php'); require_once(APPPATH . '/class/money.php'); require_once(APPPATH . '/class/expression.php'); require_once(APPPATH . '/class/bank.php'); require_once(APPPATH . '/class/sum.php'); require_once(APPPATH . '/class/pair.php'); class Money_report_test extends Toast { function __construct() { parent::__construct(__FILE__); } function test_Multiplication() { $five = Money::dollar(5); $this->_assert_true(Money::dollar(10)->equals($five->times(2))); $this->_assert_true(Money::dollar(15)->equals($five->times(3))); } function test_Equality() { $this->_assert_true(Money::dollar(5)->equals(Money::dollar(5))); $this->_assert_false(Money::dollar(5)->equals(Money::dollar(6))); $this->_assert_false(Money::franc(5)->equals(Money::dollar(5))); } function test_FrancMultiplication() { $five = Money::franc(5); $this->_assert_true(Money::franc(10)->equals($five->times(2))); $this->_assert_true(Money::franc(15)->equals($five->times(3))); } function test_Currency() { $this->_assert_equals('USD', Money::dollar(1)->currency()); $this->_assert_equals('CHF', Money::franc(1)->currency()); } function test_SimpleAddition() { $five = Money::dollar(5); $result = $five->plus($five); $sum = $result; $this->_assert_true($five->equals($sum->augend)); $this->_assert_true($five->equals($sum->addend)); } function test_ReduceSum() { $sum = new Sum(Money::dollar(3), Money::dollar(4)); $bank = new Bank(); $result = $bank->reduce($sum, 'USD'); $this->_assert_true(Money::dollar(7)->equals($result)); } function test_ReduceMoney() { $bank = new Bank(); $result = $bank->reduce(Money::dollar(1), 'USD'); $this->_assert_true(Money::dollar(1)->equals($result)); } function test_ReduceMoneyDifferentCurrency() { $bank = new Bank(); $bank->addRate('CHF', 'USD', 2); $result = $bank->reduce(Money::franc(2), 'USD'); $this->_assert_equals(Money::dollar(1)->equals($result), TRUE); } function test_ArrayEquals() { $this->_assert_equals(array('abc') , array('abc')); } function test_IdentityRate() { $this->_assert_equals(1, Bank::rate('USD', 'USD')); } function test_MixedAddition() { $fiveBucks = Money::dollar(5); $tenFrancs = Money::franc(10); $bank = new Bank(); $bank->addRate('CHF', 'USD', 2); $result = $bank->reduce($fiveBucks->plus($tenFrancs), 'USD'); $this->_assert_equals(Money::dollar(10)->equals($result), TRUE); } function test_SumPlusMoney() { $fiveBucks = Money::dollar(5); $tenFrancs = Money::franc(10); $bank = new Bank(); $bank->addRate('CHF', 'USD', 2); $sum = new Sum($fiveBucks, $tenFrancs); $sum = $sum->plus($fiveBucks); $result = $bank->reduce($sum, 'USD'); $this->_assert_equals(Money::dollar(15)->equals($result), TRUE); } function test_SumTimes() { $fiveBucks = Money::dollar(5); $tenFrancs = Money::franc(10); $bank = new Bank(); $bank->addRate('CHF', 'USD', 2); $sum = new Sum($fiveBucks, $tenFrancs); $sum = $sum->times(2); $result = $bank->reduce($sum, 'USD'); $this->_assert_equals(Money::dollar(20)->equals($result), TRUE); } } bank.php class Bank { private $rates; function reduce($source, $to) { return $source->reduce($this, $to); } function rate($from, $to) { if($from == $to) return 1; $rate = $this->rates[md5(serialize(new Pair($from, $to)))]; return $rate; } function addRate($from, $to, $rate) { $this->rates[md5(serialize(new Pair($from, $to)))] = $rate; } }expression.php interface Expression { function reduce($bank, $to); function plus($addend); function times($multiplier); }money.php class Money { public $amount; protected $currency; function __construct($amount, $currency) { $this->amount = $amount; $this->currency = $currency; } static function dollar($amount) { return new Money($amount, 'USD'); } static function franc($amount) { return new Money($amount, 'CHF'); } function times($multiplier) { return new Money($this->amount * $multiplier, $this->currency); } function equals($object) { $money = $object; return $this->amount == $money->amount && $this->currency() == $money->currency(); } function currency() { return $this->currency; } function plus($addend) { return new Sum($this, $addend); } function reduce($bank, $to) { $rate = $bank->rate($this->currency, $to); return new Money($this->amount / $rate, $to); } }pair.php class Pair { private $from; private $to; function __construct($from, $to) { $this->from = $from; $this->to = $to; } function equals($object) { $pair = $object; return $this->from == $pair->from && $this->to == $pair->to; } function hashCode() { return 0; } }sum.php class Sum implements Expression{ public $augend; public $addend; function __construct($augned, $addend) { $this->augend = $augned; $this->addend = $addend; } function reduce($bank, $to) { $amount = $this->augend->reduce($bank, $to)->amount + $this->addend->reduce($bank, $to)->amount; return new Money($amount, $to); } function plus($addend) { return new Sum($this, $addend); } function times($multiplier) { return new Sum($this->augend->times($multiplier), $this->addend->times($multiplier)); } } Toast를 이용한 TDD 결과물... Toast Unit Tests:
All tests completed in 0.0435 seconds |
|||
다음글 | ssd 사세요 2번사세요 (3) | ||
이전글 | 쩝... php를 너무 물로 봤나?? (5) | ||
한대승(불의회상)
/
2012/08/24 08:41:55 /
추천
0
|
인스카
/
2012/08/24 14:15:50 /
추천
0
Local hostname을 blog.hoksi.st 로 쓰시나보군요...
|
한대승(불의회상)
/
2012/08/24 15:21:25 /
추천
0
인스카// 넵... 없는 도메인이니 클릭하셔도 이상한 사이트가 나올겁니다.
|
milosz
/
2012/09/13 09:00:22 /
추천
0
좋은 예제 감사합니다^^
|
처음 시작할 때는 과연 가능할 까라는 의문으로 시작 했습니다.
중간 코드를 보시면 JAVA에 대한 이해가 부족한 관계로 PHP로 변환 도중 난해한 부분이 있어 억지코드(?)가 조금 들어가 있습니다.
참고 하세요.