test stubs... getting the world under control. tdd of state pattern to implement gammatown...
TRANSCRIPT
![Page 1: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/1.jpg)
Test Stubs
... getting the world under control
![Page 2: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/2.jpg)
TDD of State Pattern
To implement GammaTown requirements I
CS, AU Henrik Bærbak Christensen 2
![Page 3: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/3.jpg)
Resulting Production Code
CS, AU Henrik Bærbak Christensen 3
public boolean isWeekend() { ... } Read system clock to determine if weekend
![Page 4: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/4.jpg)
Requirement
After introducing Gammatown I no longer have automated tests because I have to run some of the tests during the weekend.– I have a ‘manual run on weekend and another run on
weekdays targets’
I want to get back to as much automated testing as possible.
Henrik Bærbak Christensen 4CS, AU
![Page 5: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/5.jpg)
Tricky Requirement
The test case for AlphaTown:
… problematic for GammaTown…
Henrik Bærbak Christensen 5CS, AU
![Page 6: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/6.jpg)
Analysis
Gammatown, however, has one more parameter in the rate policy test case
The problem is
This parameter is not accessible from the testing code!
Henrik Bærbak Christensen 6CS, AU
![Page 7: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/7.jpg)
Code view
CS, AU Henrik Bærbak Christensen 7
Direct input parameter: paymentDirect input parameter: payment
Indirect input parameter: day of weekIndirect input parameter: day of week
![Page 8: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/8.jpg)
Definitions
This reflection allows me to classify parameters:
UUT = Unit Under Test.– here it is the RateStrategy instance...
Henrik Bærbak Christensen 8CS, AU
![Page 9: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/9.jpg)
Where does indirect input come from?
So the 1000$ question is: where does the indirect input parameter come from?
Exercise: Name other types of indirect input?
Henrik Bærbak Christensen 9CS, AU
![Page 10: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/10.jpg)
Analysis: Code view
Structure of xUnit test cases
Here – box = executing unit– Collaboration diagram: interaction between objects
DOU = Depended On Unit
Henrik Bærbak Christensen 10CS, AU
![Page 11: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/11.jpg)
Direct versus Indirect
Henrik Bærbak Christensen 11
Direct input Indirect input
CS, AU
![Page 12: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/12.jpg)
The Gammatown Rate Policy
My DOU is the C#/Java system clock:
Henrik Bærbak Christensen 12
Test code AlternatingRateStrategySystem Clock
System.DateTime java.util.Calendar
Method parameters Calling library methods
CS, AU
![Page 13: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/13.jpg)
The Challenge
This analysis allows me to state the challenge:
How can I make the DOU return values that are defined by the testing code?
Henrik Bærbak Christensen 13
Test code AlternatingRateStrategy
System ClockSystem.DateTime java.util.Calendar
CS, AU
![Page 14: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/14.jpg)
Analysis
Basically it is a variability problem– During testing, use data given by test code– During normal ops, use data given by system
So I can reuse my previous analysis– parametric proposal– polymorphic proposal– compositional proposal
Henrik Bærbak Christensen 14CS, AU
![Page 15: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/15.jpg)
Parametric
This is perhaps the oldest solution in the C world
#ifdef DEBUG today = PRESET_VALUE; #else today = (get date from clock); # return today == Saturday || today == Sunday;
Henrik Bærbak Christensen 15CS, AU
![Page 16: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/16.jpg)
Polymorphic
Subclass or die...
Actually a quite reasonable approach...
Argue why!!!
Henrik Bærbak Christensen 16
AlternatingRateStrategy
TestAlternatingRateStrategy
CS, AU
Override ‘isWeekend()’method
![Page 17: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/17.jpg)
Compositional
3-1-2 leads to yet another Strategy Pattern:
Henrik Bærbak Christensen 17CS, AU
![Page 18: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/18.jpg)
Static Architecture View
Exercise: Why is this Strategy and not State?
Henrik Bærbak Christensen 18CS, AU
![Page 19: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/19.jpg)
Code View
CS, AU Henrik Bærbak Christensen 19
![Page 20: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/20.jpg)
Test Stub
I have made a test stub
Henrik Bærbak Christensen 20CS, AU
![Page 21: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/21.jpg)
Key point
CS, AU Henrik Bærbak Christensen 21
![Page 22: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/22.jpg)
Note
(Please note that once again the 3-1-2 is the underlying and powerful engine for Test Stub. I use the 3-1-2 to derive a solution that “accidentally” has a name and is a well known concept; just as I previously derived several design patterns.)
Henrik Bærbak Christensen 22CS, AU
![Page 23: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/23.jpg)
The Code View
CS, AU Henrik Bærbak Christensen 23
![Page 24: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/24.jpg)
The Stub
CS, AU Henrik Bærbak Christensen 24
![Page 25: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/25.jpg)
Setting it up
CS, AU Henrik Bærbak Christensen 25
Direct input parameter: payment
Now: Direct input parameter: weekend or not
![Page 26: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/26.jpg)
Reusing the variability points...
Aah – I could do this...
CS, AU Henrik Bærbak Christensen 26
![Page 27: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/27.jpg)
Variability points to the rescue
The WeekendDecisionStrategy introduces yet another variability point...
Often they come in handy later if 1) they encapsulate well-defined responsibilities 2) are defined by interfaces and 3) uses delegation
CS, AU Henrik Bærbak Christensen 27
![Page 28: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/28.jpg)
Static Architecture View
Henrik Bærbak Christensen 28CS, AU
![Page 29: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/29.jpg)
Manual testing
Manual testing of GammaTown
CS, AU Henrik Bærbak Christensen 29
![Page 30: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/30.jpg)
Discussion
CS, AU Henrik Bærbak Christensen 30
![Page 31: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/31.jpg)
Test Doubles
Test Stub is a subtype of Test Double. Other sub types exists:– Stub: Get indirect input under control– Spy: Get indirect output under control
• to validate that UUT use the proper protocol– count method calls, ensure proper call sequence
– Mock: A spy with fail fast property• Frameworks exists that test code can ‘program’ mocks
without every coding them in the native language• Fail fast: fail on first breaking of protocol
– Fake: A lightweight but realistic double• when the UUT-DOU interaction is slow and tedious• when the Double interaction is not the purpose of test
Henrik Bærbak Christensen 31CS, AU
![Page 32: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/32.jpg)
Package/Namespace View
I always organize folder hierarchy into two– src: all production code rooted here– test: all test code rooted here
Here– WeekendDecisionStrategy (interface)– ClockBasedDecisionStrategy (class)– FixedDecisionStrategy (class)
Exercise: Where would you put these units?
Henrik Bærbak Christensen 32CS, AU
![Page 33: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/33.jpg)
C# Delegates
The strategy only contains a single method and having an interface may seem a bit of an overkill.– In Java 8, you still have to use a
@FunctionalInterface and Lambda
– In C# you may use delegates that is more or less a type safe function pointer.
– In functional languages you may use closures
Henrik Bærbak Christensen 33CS, AU
![Page 34: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/34.jpg)
Summary
![Page 35: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/35.jpg)
Key Points
Test Stubs make software testable.
3-1-2 technique help isolating DOUs– because I isolated the responsibility by an interface I
had the opportunity to delegate to a test stub
My solution is overly complex– Yes! Perhaps subclassing would be better here.– But
• it scales well to complex DOUs• it is good at handling aspects that may vary across the entire
system (see next slide)
Henrik Bærbak Christensen 35CS, AU
![Page 36: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/36.jpg)
Analysis
The WDStrategy is local. If there was many places in production code that needed to vary behaviour depending on weekend or not, then:
Henrik Bærbak Christensen 36CS, AU
![Page 37: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/37.jpg)
Still Untested Code
Some code units are not automatically testable in a cost-efficient manner– Note that if I rely on the automatic tests only, then the
ClockBasedDecisionStrategy instance is never tested!
• (which it actually was when using the manual tests!)
Thus: – DOUs handling external resources must still be
manually tested (and/or formally reviewed).– Isolate them to a minimum, and if it ain’t broke, then
don’t fix it
Henrik Bærbak Christensen 37CS, AU
![Page 38: Test Stubs... getting the world under control. TDD of State Pattern To implement GammaTown requirements I CS, AUHenrik Bærbak Christensen2](https://reader035.vdocuments.net/reader035/viewer/2022070413/5697bfc11a28abf838ca46b5/html5/thumbnails/38.jpg)
Know When to Stop Testing
Note also that I do not test that the return values from the system library methods are not tested.
I expect Sun / MicroSoft to test their software.– sometimes we are wrong but it is not cost efficient.
Do not test the random generator
Henrik Bærbak Christensen 38CS, AU