Test Driven Development
Test Driven Development
Agenda
Agenda 1. Learning the TDD Process 2. Waterfall vs. TDD Process 3. Short-term advantages 4. Long-term advantages 5. Common critics and answers
TDD Formula
1. add a test
2. get it to fail
JUnit
JUnit
User Story
Role: Feature: Business Value: As a user I want to be able to create my shopping cart with products So that I can estimate my costs and buy my products
1. add a test...
2. get it to fail...
JUnit
4. improve design
too simple in this case, later...
TDD Formula
2. get it to fail
JUnit
JUnit
1. add a test...
think about the new API before it will be created
JUnit
JUnit
JUnit
by switching from a red bar to a green one, we tested our test itself we fulfilled the test through last implementation
Denis Lutz, 2009
4. improve design
any change
JUnit
evolve your design create only needed abstractions be always sure the code is still
working
2. get it to fail
JUnit
JUnit
1. add a test...
2. get it to fail...
Mac Shortcut: CMD + 1 Windows Shortcut: Win + 1
2. get it to fail...
JUnit
Denis Lutz, 2009
JUnit
Denis Lutz, 2009
4. improve design
always supporting your steps by the test, stay green
JUnit
Analysis
What?
How?
Implementation
Developer
Test
Developer Tester
Analysis
=
1. add a test
Test
What?
2. get it to fail
JUnit
JUnit
How?
3. write code to pass the test Implementation
TDD vs Waterfall
Waterfall:
Analysis
Design
TDD:
ShoppingCart .... ...shouldHaveAListOfProductsInsideItself ...shouldCalculateTheSubotalOfAllProductsInTheShoppingCa rt Behavior Driven Development (last evolvement TDD) is binding the user stories directly to the tests!
TDD vs Waterfall
Waterfall:
predict the right design (M.Fowler, Is design dead?) think about everything upfront? sit down and think where to start, make random
drafts
Design
TDD:
dont think about the design in detail (at class level) adapt your design to your needs later, create the abstractions you will only
need
let your design evolve with time change the design fast alway assured by the tests
TDD vs Waterfall
Waterfall:
fullfill the planned design in anycase or develop without any plan danger to develop things you will not need at the end trying to get classes work somehow together at the end
Implementation
TDD:
Denis Lutz, 2009
develop only what needed dont really think about the design upfront get motivated and driven by the test try to close the loop to green as fast as possible make changes to former code without any concern that you break it
TDD vs Waterfall
Analysis Design Implementation Test
Waterfall testing:
hope to have no bugs, creating ad-hoc and random test cases since the code is not test friendly => time consuming and of bad test quality
(testing of huge private methods after they are written)
boring task, trying to finish it fast already lost time with manual testing will debug the code you wrote days or weeks ago or even not your code might be removed with more project pressure
Test
Behavior Driven Development (BDD) by Dan North Large adoption in the rails community with RSpec
Denis Lutz, 2009
Short-term advantages
Short-term advantages
by writing the test first we are able to think about the API and create it user friendly we did not try to achieve the planned design, which is a hard task we never thought about design, just started to develop we immediately created an executable specification for our code the code is born with two clients: the test using it and the client code => reusable code
avoid loosing the time by build process, build and deploy only if everything is tested compiler is assuring the syntax, tests assuring semantics write the test once and develop against it, never check things manually for their
correctness
agressive refactoring possible through high test coverage => fast reaction on change => agility we will face more bugs upfront and avoid debugging in the future, which is one of the most
consuming time tasks, if the code was written long time ago
reduce the debugging by QA, which is much more time intensive as by developer continuos integration can only be based on a good test suite, TDD is the perfect
base for it
DAO
external Tax-Service
Validation Service
<<implements>>
<<implements>>
DAOImpl
Denis Lutz, 2009
ValidationServiceImlpl
Short term
by writing the test first we are able to think about the API and create it user friendly we did not try to achieve the planned design, which is a hard task we never thought about design, just started to develop we immediately created an executable specification for our code the code is born with two clients: the test using it and the client code => reusable code
simpler APIs for other team members the new code was used by the test itself we will face more bugs upfront and avoid debugging in the future, which is one of the most
consuming time tasks, if the code was written long time ago. Author himself can solve the bugs much faster since he has still the code in its mind
reduce the debugging by QA, which is much more time intensive as by developer tests will enforce compositions oriented design this correlates very well with dependency injection of spring stubbing can be easily realized, making the test much faster
avoid loosing the time by build process, build and deploy only if everything is tested compiler is assuring the syntax, tests assuring semantics write the test once and develop against it, never check things manually for their
correctness
Thanks!