Your SlideShare is downloading. ×
0
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Bad test, good test
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Bad test, good test

3,237

Published on

Slides from my presentation at DunDDD, 17th Nov 2012. …

Slides from my presentation at DunDDD, 17th Nov 2012.
Most of this session was spent discussing unit test examples harvested from github. If anyone would like to see them, just ask.

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

No Downloads
Views
Total Views
3,237
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
45
Comments
0
Likes
4
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
  • Untestable code. Test first/TDD
  • Naming Locality of reference Symbolic constants Distinguish Context/Action/Outcome Documentation - writing for other developers NOT the compiler
  • Symbolic constant
  • Naming Locality Context/Action/Outcome
  • Abstractions White box (TDD) but not mirroring implementation SOLID - DRY
  • Data
  • Data
  • Builders/Data DRY Can build graphs
  • Builders
  • Builders
  • No unreliable resources file system/network No dates/random numbers
  • Triangulation
  • What’s this for?
  • Single behaviour CHeck back to naming Executable Documentation
  • No unreliable resources file system/network No dates/random numbers
  • Osherove - maintainable, trustworthy, readable Bache - coverage, readability, robustness, speed
  • TDD. Decoupling.
  • Transcript

    • 1. Bad Test, Good Test Seb Rose Claysnow Limited @sebrose
    • 2. Take an index cardWhat makes a unit test good or bad?- Write 3 ‘good’ things on one side- Write 3 ‘bad’ things on the other side
    • 3. What is a unit test?
    • 4. Understandable
    • 5. @Testpublic void scale() { Date now = new Date(); Calendar calBegin = Calendar.getInstance(); calBegin.setTime(now); calBegin.add(Calendar.HOUR, -4); Date begin = calBegin.getTime(); Period p = new Period(4); long delta = p.getBegin().getTime() - begin.getTime(); Assert.assertTrue( p.getEnd().compareTo(now) >= 0); logger.trace(delta); Assert.assertTrue(delta < 10 && delta > -10); Assert.assertEquals( new Integer(4), new Integer(p.getScale()));}
    • 6. [Test] public void asterisk_should_format_to_em() { // Context Formatter f = new MarkdownFormatter(); String expected = "This is <em>em</em> text"; // Action String actual = f.Format("This is *em* text"); // Outcome Assert.AreEqual(expected, actual); }
    • 7. Maintainable
    • 8. @Test public void smoker_requires_manual_referral() { Customer customer = new Customer(“Joe”, “Smith”, “12/12/1980”, “Accountant”, “$300,000”, “Yes”, “No”); Referral referral = underwriting.process(customer); Assert.assertEquals(Referral.Manual, referral); }
    • 9. @Test public void non_smoker_does_not_require_referral() { Customer customer = new Customer(“Joe”, “Smith”, “12/12/1980”, “Accountant”, “$300,000”, “No”, “No”); Referral referral = underwriting.process(customer); Assert.assertEquals(Referral.None, referral); }
    • 10. public interface CustomerBuilder { public CustomerBuilder standardSingleMale(); public CustomerBuilder standardSingleFemale(); public CustomerBuilder smoker(); public CustomerBuilder hasOccupation(String occupation); public Customer build();}
    • 11. @Test public void non_smoker_does_not_require_referral() { Customer customer = customerBuilder .standardSingleMale() .build(); Referral referral = underwriting.process(customer); Assert.assertEquals(Referral.None, referral); }
    • 12. @Test public void smoker_requires_manual_referral() { Customer customer = customerBuilder .standardSingleFemale() .smoker() .build(); Referral referral = underwriting.process(customer); Assert.assertEquals(Referral.Manual, referral); }
    • 13. Repeatable
    • 14. @Testpublic void testRolling() { Yahtzee y = Yahtzee.roll(); assertEquals(y, y); Yahtzee y1 = new Yahtzee(1,2,3,4,5); Yahtzee y2 = new Yahtzee(1,2,3,4,5); assertTrue(y1.equals(y2)); assertEquals(y1,y2); assertFalse(Yahtzee.roll()==Yahtzee.roll());}
    • 15. Necessary
    • 16. [Test]#region TestCase...public void TestMapFromRomanNormalToRomanOnes( string roman, int times){ var actual = _engine.ToRomanOnes(roman); var expected = _engine.Repeat(I, times); Assert.That(actual, Is.EqualTo(expected));}
    • 17. Granular
    • 18. @Testpublic void testRolling() { Yahtzee y = Yahtzee.roll(); assertEquals(y, y); Yahtzee y1 = new Yahtzee(1,2,3,4,5); Yahtzee y2 = new Yahtzee(1,2,3,4,5); assertTrue(y1.equals(y2)); assertEquals(y1,y2); assertFalse(Yahtzee.roll()==Yahtzee.roll());}
    • 19. Fast
    • 20. Properties of unit testing Understandable Maintainable Repeatable Necessary Granular Fast
    • 21. Look back at your index cardFor each of your ‘good’ things, which ofthe properties does it exhibit?For each of your ‘bad’ things, which ofthe properties does it contravene?
    • 22. Have I missed any?
    • 23. None of this is a substitute for writing testable code.
    • 24. class PriceCalculator { public Price getPrice() { if (DateTime.Compare(DateTime.Now,PRICE_RISE_DATE)<0){ return LOW_PRICE; } else { return HIGH_PRICE; } }}
    • 25. [Test] public void prices_should_increase_on_2013_03_31() { PriceCalculator calc = new PriceCalculator(); // How can we set the date? // ... }
    • 26. class PriceCalculator { public PriceCalculator( SystemClock clock ) { clock_ = clock; } public Price getPrice() { if (DateTime.Compare(clock.Now, PRICE_RISE_DATE)<0){ return LOW_PRICE; } else { return HIGH_PRICE; } }}
    • 27. [Test] public void prices_should_increase_on_2013_03_31() { SystemClock clock = new SystemClock(2013, 03, 31); PriceCalculator calc = new PriceCalculator(clock); // Now we control the date? // .... }
    • 28. How can we improve?
    • 29. Properties of unit testing Understandable Maintainable Repeatable Necessary Granular Fast
    • 30. Unit tests are your executable specificationTreat them with as much respect as your production code
    • 31. The Feather’s definition of legacycode: Code that has no tests
    • 32. Seb RoseTwitter: @sebroseBlog: www.claysnow.co.ukE-mail: seb@claysnow.co.uk

    ×