Tdd by exam 2
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
5,773
On Slideshare
1,369
From Embeds
4,404
Number of Embeds
5

Actions

Shares
Downloads
24
Comments
0
Likes
0

Embeds 4,404

http://www.code-66.com 4,400
http://translate.googleusercontent.com 1
http://a0.twimg.com 1
http://webcache.googleusercontent.com 1
http://www.proxya.net 1

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