Practicing Advanced 
Unit Testing 
v2.3.2 (17.09.2014) 
withthe 
«Trading Card Game» 
Kata 
Battlecry: Draw a slide. 
Deat...
Kata 
Kata (型or 形literally: "form”) is 
a Japanese word describing detailed 
choreographed patterns of movements 
practice...
Trading Card Game (TCG) 
A […] trading card game (TCG) […] is 
a card game that uses specially 
designed sets of playing c...
Why invent another Kata? 
Bro, why U not use 
????? 
Rules not 
extensible 
Not TDD-friendly 
Too easy
Hearthstone: Heroes ofWarcraft®
Kata Trading Card Game
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
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 
R...
Forced Turn Skip 
0/1 
30 1/1 
29 
5 8 2 
3 2 
2 4 
3 
No affordable 
Cards 
2/2 
7
2/-2 
29 
27 
4 
Ongoing Gameplay 
0/2 
30 1/1 
5 8 2 
3 2 
3 4 
2 
2 
7
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
Mana Cap 
10/10 4 
5 
8 10/10 
6 Mana is 6 1 
capped at 
10 Slots
Bleedout Rule 
Cause 
1 Damage 
10/10 4 
5 
8 10/10 
Drawing 
from empty 
6 6 1 
Deck 
7-1
Game End 
10/10 4 
5 
4/10 
7 10/10 
--62 
6 6 1 
Winner! Loser!
Kata TCG Rules & Variations 
https://github.com/bkimminich/kata-tcg 
Detailed rules description 
Advanced Variations 
Heal...
Kata TCG Sample Solution in Java 
https://github.com/bkimminich/kata-tcg 
Java 8 
Lambdas & Stream API 
Junit 
Mockito 
Fo...
Other Sample Solutions 
https://github.com/bkimminich/kata-tcg 
Groovy 
Spock 
JavaScript 
Karma 
Jasmine 
PhantomJS
Advanced Unit Testing 
Examples
Skip No-Brainers 
… 
Compile Error 
as Red Test 
Red 
Refactor Green
Obvious Implementation 
Simplest 
possible step 
Simplest 
useful step
Specify theObject under Test 
Irrelevant 
Details 
Setter introduced 
for testing 
Implementation 
Detail 
Assuming 
Hidde...
Define theObject under Test 
Another unwanted 
setter 
Hidden default 
problem solved
Builder Pattern 
Reads like natural 
language 
Explicitly listed 
Expectations 
No unnecessary 
details 
…?
Builder Internals 
Sensible 
Default Values 
Package visible full 
Constructor needed
Fluent API 
Setting properties 
via fluent API
Mocking Behavior 
Interface has no 
implementation yet 
Mock Behavior 
for this Test
Trashcan Refactoring 
CardPicker turned out 
to be overengineered 
Mocking
Mocking BDD Style 
Can be 
confused with 
Given-When-Then 
part 
Can be 
confused with 
Given-When-Then 
part
Mocking BDD Style 
Sugar coating 
for BDD syntax 
Matches its meaning in 
Given-When-Then structure
Avoid Redundancy 
Redundant & spoiled with 
Implementation Details 
Another slight 
redundancy
Avoid Constants 
Disturbs the 
reading flow
Syntactic Sugar 
Improves 
Legibility and 
removes 
Redundancy
More Syntactic Sugar 
Magic 
Numbers Different Level of 
Abstraction
Syntactic Artificial Sweetener 
No-Op 
Syntactic 
Sugar for 
Legibility 
Syntactic 
Sugar reduces 
Redundancy
Test Diabetes 
Too much Sugar is 
bad for your Test 
Customer Matchers 
can medicate this
Custom Matcher 
Encapsulation of 
Expectation 
Produces helpful 
Error Messages 
Even better 
with just a little 
bit of S...
Demo | Q&A
Demo: Test Execution 
Pretty fast All tests pass
Demo: Code Coverage
UglUygRleytUroI UI 
Demo: Human vs. AI Game 
Player Input 
via System.in 
AI beats me! 
Again! 
Thank you for your attention! 
Recording of this talkat „Agile SaturdayX“ in Tallinn, Estonia 
https://vimeo.com/92886146 ...
Credits 
Background Image: Demonplay (Permission of use granted) 
Other Images: 
Blizzard Entertainment (Permission of use...
Upcoming SlideShare
Loading in...5
×

Practicing Advanced Unit Testing

6,559

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

Transcript of "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.
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×