Tdd by exam 2

5,869 views

Published on

Published in: Business, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
5,869
On SlideShare
0
From Embeds
0
Number of Embeds
4,536
Actions
Shares
0
Downloads
25
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Tdd by exam 2

  1. 1. TDD By Example Piya Lumyong
  2. 2. In the past● Chaos Design not clear Communication Quality
  3. 3. Evolution TDD Automated Testing BDDDirty Hacking Test-First Dev. ...
  4. 4. Requirements engineering process
  5. 5. analysis
  6. 6. An essential user interface prototype prototype CRC card
  7. 7. The Workshop● Requirement – RESTful WS สำหรับการโอนเงิน
  8. 8. The Workshop● Raw need ในการโอนเงินแต่ละครั้ง ผู้ใช้จะต้องระบุหมายเลขบัญชี ปลายทางที่ต้องการโอน โดยยอดเงินที่โอนต้องไม่ต่ำกว่ายอดเงินขั้นต่ำ ในการโอนซึ่งถูกกำหนดโดยเจ้าหน้าที่ และในการโอนเงินลูกค้า จะถูกหักค่าธรรมเนียมตามอัตราที่ธนาคารกำหนด And etc.
  9. 9. The Workshop● Which is our domain model? Account TransferReceipt Lab Step1
  10. 10. Service● Which is our service? ในการโอนเงินแต่ละครั้ง ผู้ใช้จะต้องระบุหมายเลขบัญชี FeePolicy AccRepository(DAO) ปลายทางที่ต้องการโอน โดยยอดเงินที่โอนต้องไม่ต่ำกว่ายอดเงินขั้นต่ำ >> ncy nde epe < D หน้าที่ และในการโอนเงินลูกค้า ในการโอนซึ่งถูกกำหนดโดยเจ้า < จะถูกหักค่าธรรมเนียมตามอัตราที่ธนาคารกำหนด << Depe n dency > > TransferService
  11. 11. JigsawHow do we know what our service should be like if we dont try to use it? FeePolicy use ? AccRepository(DAO) > test test y> ndenc Depe << ? << Depe ndency >> test useTransferService FeePolicy Lab Step2 ->
  12. 12. Lab2● Draft FeePolicy public interface FeePolicy { public double calculateFee(double transferAmount); }● Write FlatFeePolicyTest● Write interface FeePolicy● Implement FlatFeePolicy
  13. 13. Service● Whats next? FeePolicy AccRepository(DAO) >> ncy nde Depe << ? << Depe n dency > > TransferService
  14. 14. Trouble● How to write unit test which result not depend on dependency? FeePolicy ? AccRepository(DAO) >> ncy nde Depe << ? << Depe n dency > > ? TransferService Able to control.
  15. 15. Solution● Use anything that I can control. – Static stub (utility, fake, dummy class) – Dynamic stub Lab Step3 ->
  16. 16. Lab3● Draft TransferService public interface TransferService { TransferReceipt transfer(double amount, String srcAcctId, String destAcctId); void setMinimumTransferAmount(double minimumTransferAmount); }● Write DefaultTransferServiceTest● Write interface TransferService● Draft AccountRepository public interface AccountRepository { Account findById(String srcAcctId); void updateBalance(Account dstAcct); }● Write interface AccountRepository● Implement all static stub● Implement DefaultTransferService
  17. 17. Trouble● Additional need. ค่าธรรมเนียมการโอน 100 - 1,000 ไม่เสียค่าโอน 1,001 - 1,000,000 เสียเป็น % ส่วน 1,000,001 จะเสียเป็น Flat Rate
  18. 18. Solutioninterface
  19. 19. The Workshop FeePolicy AccRepository(DAO) >> de ncy n Depe << << Depe n dency > >TransferService New implemention of interface FeePolicy !! All right Im ok. FeePolicy was depended on me through interface. Lab Step4
  20. 20. Trouble● Additional need. ลูกค้าจะไม่สามารถทำรายการโอนได้หลังสี่ทุ่มเป็นต้นไปจนถึงหกโมงเช้า (รู้เหตุผลแต่ไม่อยากบอก)
  21. 21. The Workshop FeePolicyTimeService Services at present? >> cy den en Dep << > ency > << Depend ? << De pe nd en cy >> AccRepository(DAO)TransferService Lab Step5 >
  22. 22. Lab5● Draft TimeService public interface TimeService { boolean isServiceAvailable(LocalTime testTime); }● Write DefaultTimeServiceTest● Write interface TimeService● Implement DefaultTimeService
  23. 23. Service Services at presentTimeService TimeService use FeePolicy > y> nc test nde test pe De << << Dependency >> ? << De pe nd test use ency >> AccRepository(DAO)TransferService
  24. 24. Use the Service TransferService TimeServiceRefactoring Caller ? Must change TransferService AOP Proxy Caller TimeService
  25. 25. Refactoring TimeService TransferServiceTest use test test ? Call test useTransferService Im sure about my work. How do I verify TransferService calling TimeService right?
  26. 26. Trouble● How do I know ? – TransferService call TimeService really. – In the test, I cant control time, TransferService sents to TimeService. TimeService TransferServiceTest TransferService Test call all C TransferReceipt transfer(...) { ... if (timeService.isServiceAvailable(new LocalTime())) { ... } } Cant control
  27. 27. Solution● Use anything that I can control. – Static mock (special class) – Dynamic mock
  28. 28. The Workshop TransferServiceTest Call ? ? TransferService TimeServiceAble to capture TransferService behavior Lab Step6 >
  29. 29. AOP

×