struggling to create maintainable unit tests?

Download Struggling to Create Maintainable Unit Tests?

Post on 18-Nov-2014

4.404 views

Category:

Technology

0 download

Embed Size (px)

DESCRIPTION

Learn how to create maintainable unit tests by using jMock with Test Data Builders.

TRANSCRIPT

  • 1.

2. 3. Protocol => Mocks Data => Builders 4. Roadmap

  • Define Maintainable Unit Test
  • Create a Shared Vocabulary
  • Examples
  • When to Use Mocks

5. Define Maintainable Unit Test 6. 10% of Unit Tests Break

  • If you really have a lot of unit tests, the amount of investment you'll have to make in maintaining those unit tests, keeping them up-to-date and keeping them passing, starts to become disproportional to the amount of benefit that you get out of them.
  • Joel Spolsky

7. Maintainable Unit Tests

  • The benefits of unit tests outweigh the costs as a codebase evolves.

8. Shared Vocabulary 9. Mocks Builders 10. 11. xUnit Test Patterns 12. Mocks Builders 13. Mock Object

  • Amock objectis a simulated object that mimics the behaviour of a real object in controlled ways.

14. Test Data Builder

  • Builder Pattern
  • build()method
  • Default values
  • Chainable configuration methods

15. Shared Vocabulary

  • 4Phase Test
  • System Under Test
  • DependedOn Component
  • Mock Objects
  • Test Data Builders

16. Examples 17. 18. Domain Model 19. public voidshould_recognize_pediatric_patient() { // setup Patient sut =aPatient ().age(17).build(); // exercise and verify assertTrue (sut.isPediatric()); assertTrue (!sut.isAdult()); } 20. public voidshould_recognize_pediatric_patient() { // setup Patient sut =aPatient ().age(17).build(); // exercise and verify assertTrue (sut.isPediatric()); assertTrue (!sut.isAdult()); } 21. public voidshould_recognize_pediatric_patient() { // setup Patient sut =aPatient ().age(17).build(); // exercise and verify assertTrue (sut.isPediatric()); assertTrue (!sut.isAdult()); } aPatient ().dob(april(1, 1992)).build(); 22. Add Patient to Care Team

  • Patient must be registered at the same Facility as the Care Team.
  • Patient must meet the Care Team Membership Criteria (appropriate Age Category and Diagnosis).

23. public classCareTeamMembershipService implementsICareTeamMembershipService { privateCareTeamMembershipDaocareTeamMembershipDao ; public voidaddMember(Patient patient, CareTeam careTeam) { if(!patient.isRegisteredAt(careTeam.getFacility())) { throw newCareTeamAdminException(); } if(!patient.meets(careTeam.getMembershipCriteria())) { throw newCareTeamAdminException(); } careTeamMembershipDao .create( patient.getId(), careTeam.getId());} } 24. private finalCareTeamMembershipDaocareTeamMembershipDao= context .mock(CareTeamMembershipDao. class ); private finalICareTeamMembershipServicesut= createCareTeamMembershipService(); public voidshould_permit_add_for_appropriate_care_team() { // setup finalFacility jacobi =aFacility ().build(); finalPatient patient =aPatient ().at(jacobi).age(18) .with(Diagnosis. DIABETES ).build(); finalCareTeam careTeam =anAdultCareTeam ().at(jacobi) .with(Diagnosis. DIABETES ).build(); // verify context .checking( newExpectations() {{ one( careTeamMembershipDao ).create( patient.getId(), careTeam.getId()); }}); // exercise sut .addMember(patient, careTeam); } 25. private finalCareTeamMembershipDaocareTeamMembershipDao= context .mock(CareTeamMembershipDao. class ); private finalICareTeamMembershipServicesut= createCareTeamMembershipService(); // verify @Test (expected=CareTeamAdminException. class ) public voidshould_disallow_add_adult_to_pediatric_care_team() { // setup finalFacility jacobi =aFacility ().build(); finalPatient patient =aPatient ().at(jacobi).age(18) . with (Diagnosis. DIABETES ).build(); finalCareTeam careTeam =aPediatricCareTeam ().at(jacobi) .with(Diagnosis. DIABETES ).build(); // exercise sut .addMember(patient, careTeam); } 26. Examples

  • Test vs Production API
  • Builders as shared test asset
  • Mocks and Builders as Firewalls

27. When to UseMocks 28. Mocks Builders 29. Protocol Data 30. Protocol => Mocks Data => Builders 31. Now What?

  • ReadxUnit Test Patterns
  • Read Nat Pryces Builder posts
  • Distinguish Protocol vs Data
  • Try using Mocks with Builders

32. 33. 34. Contact

  • Jason Cheong-Kee-You
  • [email_address]
  • Alistair McKinnell
  • [email_address]

35. Resources

  • xUnit Test Patterns
  • http://xunitpatterns.com/
  • jMock
  • http://www.jmock.org/
  • Test Data Builders
  • http://nat.truemesh.com/archives/000714.html

36. Credits Obstacle Race http://www.flickr.com/photos/foxypar4/1004464889/ Einstein Blackboard Writing Generator http://generator.kitt.net/2006/12/ einstein-blackboard-writing-generator.html Holy Grail http://www.flickr.com/photos/ spiritual_marketplace/2207966935/ 37.