Your SlideShare is downloading. ×
Tdd by exam 2
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Tdd by exam 2

5,545
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,545
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
24
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. TDD By Example Piya Lumyong
  • 2. In the past● Chaos Design not clear Communication Quality
  • 3. Evolution TDD Automated Testing BDDDirty Hacking Test-First Dev. ...
  • 4. Requirements engineering process
  • 5. analysis
  • 6. An essential user interface prototype prototype CRC card
  • 7. The Workshop● Requirement – RESTful WS สำหรับการโอนเงิน
  • 8. The Workshop● Raw need ในการโอนเงินแต่ละครั้ง ผู้ใช้จะต้องระบุหมายเลขบัญชี ปลายทางที่ต้องการโอน โดยยอดเงินที่โอนต้องไม่ต่ำกว่ายอดเงินขั้นต่ำ ในการโอนซึ่งถูกกำหนดโดยเจ้าหน้าที่ และในการโอนเงินลูกค้า จะถูกหักค่าธรรมเนียมตามอัตราที่ธนาคารกำหนด And etc.
  • 9. The Workshop● Which is our domain model? Account TransferReceipt Lab Step1
  • 10. Service● Which is our service? ในการโอนเงินแต่ละครั้ง ผู้ใช้จะต้องระบุหมายเลขบัญชี FeePolicy AccRepository(DAO) ปลายทางที่ต้องการโอน โดยยอดเงินที่โอนต้องไม่ต่ำกว่ายอดเงินขั้นต่ำ >> ncy nde epe < D หน้าที่ และในการโอนเงินลูกค้า ในการโอนซึ่งถูกกำหนดโดยเจ้า < จะถูกหักค่าธรรมเนียมตามอัตราที่ธนาคารกำหนด << Depe n dency > > TransferService
  • 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. Lab2● Draft FeePolicy public interface FeePolicy { public double calculateFee(double transferAmount); }● Write FlatFeePolicyTest● Write interface FeePolicy● Implement FlatFeePolicy
  • 13. Service● Whats next? FeePolicy AccRepository(DAO) >> ncy nde Depe << ? << Depe n dency > > TransferService
  • 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. Solution● Use anything that I can control. – Static stub (utility, fake, dummy class) – Dynamic stub Lab Step3 ->
  • 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. Trouble● Additional need. ค่าธรรมเนียมการโอน 100 - 1,000 ไม่เสียค่าโอน 1,001 - 1,000,000 เสียเป็น % ส่วน 1,000,001 จะเสียเป็น Flat Rate
  • 18. Solutioninterface
  • 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. Trouble● Additional need. ลูกค้าจะไม่สามารถทำรายการโอนได้หลังสี่ทุ่มเป็นต้นไปจนถึงหกโมงเช้า (รู้เหตุผลแต่ไม่อยากบอก)
  • 21. The Workshop FeePolicyTimeService Services at present? >> cy den en Dep << > ency > << Depend ? << De pe nd en cy >> AccRepository(DAO)TransferService Lab Step5 >
  • 22. Lab5● Draft TimeService public interface TimeService { boolean isServiceAvailable(LocalTime testTime); }● Write DefaultTimeServiceTest● Write interface TimeService● Implement DefaultTimeService
  • 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. Use the Service TransferService TimeServiceRefactoring Caller ? Must change TransferService AOP Proxy Caller TimeService
  • 25. Refactoring TimeService TransferServiceTest use test test ? Call test useTransferService Im sure about my work. How do I verify TransferService calling TimeService right?
  • 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. Solution● Use anything that I can control. – Static mock (special class) – Dynamic mock
  • 28. The Workshop TransferServiceTest Call ? ? TransferService TimeServiceAble to capture TransferService behavior Lab Step6 >
  • 29. AOP