Practicing Advanced Unit Testing

8,767 views
8,562 views

Published on

Doing Code Katas alone or in a Dojo can help sharpen our elementary skills as software developers. Practicing IDE shortcuts and TDD mini-step cycles is very useful for the daily business, yet I find some existing Code Katas too far away from real-life programming situations.

That’s why I came up with the Trading Card Game Kata – which is (very loosely) based on Blizzard Entertainment’s free-to-play online-game “Hearthstone – Heroes of Warcraft”. This Kata is focused on practicing TDD in a slightly more complex (but not complicated) situation where you might have to think about rules like Single Responsibility Principle or Command Query Separation and might even feel the urge to use a Mocking framework at some point. The rules are kept very simple to begin with but can be extended easily to make the Kata more challenging or concentrate on specific aspects of software development.

In this talk I will first introduce the ideas of Katas in general and explain the TCG Kata rules to you. Then I will present some real-life best practices for writing good developer tests, using my TCG Kata sample solutions as a showcase. This will include:

* Picking the right Test Double
* Test Data Builders
* Behavior Tests with BDDMockito
* Prose-like Assertions with Hamcrest
* Readability Sugar
* Custom Matchers against Test Diabetes

The full Kata ruleset and sample solutions in Java 8 (JUnit4, Mockito, Hamcrest) and Groovy (Spock) can be found on https://github.com/bkimminich/kata-tcg.

A recording of this talk at „Agile Saturday X“ in Tallinn, Estonia can be found on https://vimeo.com/92886146.

Published in: Technology

Practicing Advanced Unit Testing

  1. 1. Practicing Advanced Unit Testing v2.3.2 (17.09.2014) withthe «Trading Card Game» Kata Battlecry: Draw a slide. Deathrattle: Transform audience into 1/1 sheep. Speaker
  2. 2. Kata Kata (型or 形literally: "form”) is a Japanese word describing detailed choreographed patterns of movements practiced either solo or in pairs.
  3. 3. Trading Card Game (TCG) A […] trading card game (TCG) […] is a card game that uses specially designed sets of playing cards […] mass-produced for trading or collectibility, and it must have rules for strategic game play. Acquiring these cards may be done by trading with other players or buying card packs.
  4. 4. Why invent another Kata? Bro, why U not use ????? Rules not extensible Not TDD-friendly Too easy
  5. 5. Hearthstone: Heroes ofWarcraft®
  6. 6. Kata Trading Card Game
  7. 7. Player Setup Health Mana 30 0/0 0 0 1 2 2 2 3 3 3 4 4 4 5 6 6 7 8 Deck 1 3 5 Hand
  8. 8. Cause 1 Damage 30 0/0 30 2 7 Active Player 1 3 5 8 01//11 Gameplay 2 3 Play Card 1 29 0/0 Draw Card -1 Receive +1 Replenish Mana Slot Mana Pay 1 Mana Game Table Draw extra Card
  9. 9. Forced Turn Skip 0/1 30 1/1 29 5 8 2 3 2 2 4 3 No affordable Cards 2/2 7
  10. 10. 2/-2 29 27 4 Ongoing Gameplay 0/2 30 1/1 5 8 2 3 2 3 4 2 2 7
  11. 11. 12 4 Overload Rule 8/8 18 7/7 5 8 7 6 1 0 8 2 Discard Card when Hand already holds 5 Cards 7
  12. 12. Mana Cap 10/10 4 5 8 10/10 6 Mana is 6 1 capped at 10 Slots
  13. 13. Bleedout Rule Cause 1 Damage 10/10 4 5 8 10/10 Drawing from empty 6 6 1 Deck 7-1
  14. 14. Game End 10/10 4 5 4/10 7 10/10 --62 6 6 1 Winner! Loser!
  15. 15. Kata TCG Rules & Variations https://github.com/bkimminich/kata-tcg Detailed rules description Advanced Variations Healing cards Use cards as Minions Different cost & damage Card drawer cards Deck customization
  16. 16. Kata TCG Sample Solution in Java https://github.com/bkimminich/kata-tcg Java 8 Lambdas & Stream API Junit Mockito For handling dependencies of tested objects Hamcrest Matchers for better legibility in assertions System Rules JUnit@Rules for substituting java.lang.System
  17. 17. Other Sample Solutions https://github.com/bkimminich/kata-tcg Groovy Spock JavaScript Karma Jasmine PhantomJS
  18. 18. Advanced Unit Testing Examples
  19. 19. Skip No-Brainers … Compile Error as Red Test Red Refactor Green
  20. 20. Obvious Implementation Simplest possible step Simplest useful step
  21. 21. Specify theObject under Test Irrelevant Details Setter introduced for testing Implementation Detail Assuming Hidden Default
  22. 22. Define theObject under Test Another unwanted setter Hidden default problem solved
  23. 23. Builder Pattern Reads like natural language Explicitly listed Expectations No unnecessary details …?
  24. 24. Builder Internals Sensible Default Values Package visible full Constructor needed
  25. 25. Fluent API Setting properties via fluent API
  26. 26. Mocking Behavior Interface has no implementation yet Mock Behavior for this Test
  27. 27. Trashcan Refactoring CardPicker turned out to be overengineered Mocking
  28. 28. Mocking BDD Style Can be confused with Given-When-Then part Can be confused with Given-When-Then part
  29. 29. Mocking BDD Style Sugar coating for BDD syntax Matches its meaning in Given-When-Then structure
  30. 30. Avoid Redundancy Redundant & spoiled with Implementation Details Another slight redundancy
  31. 31. Avoid Constants Disturbs the reading flow
  32. 32. Syntactic Sugar Improves Legibility and removes Redundancy
  33. 33. More Syntactic Sugar Magic Numbers Different Level of Abstraction
  34. 34. Syntactic Artificial Sweetener No-Op Syntactic Sugar for Legibility Syntactic Sugar reduces Redundancy
  35. 35. Test Diabetes Too much Sugar is bad for your Test Customer Matchers can medicate this
  36. 36. Custom Matcher Encapsulation of Expectation Produces helpful Error Messages Even better with just a little bit of Sugar
  37. 37. Demo | Q&A
  38. 38. Demo: Test Execution Pretty fast All tests pass
  39. 39. Demo: Code Coverage
  40. 40. UglUygRleytUroI UI Demo: Human vs. AI Game Player Input via System.in AI beats me! Again! 
  41. 41. Thank you for your attention! Recording of this talkat „Agile SaturdayX“ in Tallinn, Estonia https://vimeo.com/92886146 https://twitter.com/bkimminich https://linkedin.com/in/bkimminich https://google.com/+BjörnKimminich http://slideshare.net/BjrnKimminich/
  42. 42. Credits Background Image: Demonplay (Permission of use granted) Other Images: Blizzard Entertainment (Permission of use requested) Wikipedia, Github, Agile Estonia Allmystery.de, Gueball.de, Natekohl.net, Scenicreflections.com Hearthstone: Heroes of Warcraft® is a trademark or registered trademark of Blizzard Entertainment, Inc., in the U.S. and/or other countries.

×