• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Test Driven Development by Denis Lutz
 

Test Driven Development by Denis Lutz

on

  • 1,502 views

My presentation at Arvato Systems about TDD. This presentation is based on my own knowledge and experience. I go through two full TDD cycles programmed in Eclipse presenting the written code in the ...

My presentation at Arvato Systems about TDD. This presentation is based on my own knowledge and experience. I go through two full TDD cycles programmed in Eclipse presenting the written code in the presentation.

Statistics

Views

Total Views
1,502
Views on SlideShare
1,500
Embed Views
2

Actions

Likes
0
Downloads
35
Comments
0

1 Embed 2

http://www.docshut.com 2

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Test Driven Development by Denis Lutz Test Driven Development by Denis Lutz Presentation Transcript

    • Test Driven Development Todays Forum Topic:Test Driven Development (TDD)
    • Agenda Test Driven DevelopmentAgenda 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 Test Driven Development 1. add a test 4. improve design2. get it to fail JUnit JUnit through refactoring 3. write enough code to pass the test
    • Test Driven DevelopmentUser Story Role: As a user Feature: I want to be able to create my shopping cart with products Business Value: So that I can estimate my costs and buy my products
    • Test Driven Development1. add a test...
    • Test Driven Development Mac Shortcut: „ CMD + 1“ Windows Shortcut: „ Win + 1“2. get it to fail...
    • Test Driven Development3. write code to pass the test... ... in the simplest possible way JUnit
    • Test Driven Development4. improve design too simple in this case, later...
    • TDD Formula Test Driven Development Start the loop again.... 1. add a test 4. improve design2. get it to fail JUnit JUnit through refactoring 3. write enough code to pass the test
    • Test Driven Development1. add a test... think about the new API before it will be created
    • 2. get the test to fail... Test Driven DevelopmentGenerate now the new missing classes and methods
    • Test Driven Development3. write just enough code to pass the test... JUnit
    • Test Driven Development JUnit JUnitby switching from a red bar to a green one, wetested our test itselfwe fulfilled the test through last implementation
    • Test Driven Development4. improve design any change JUnit • evolve your design • create only needed abstractions • be always sure the code is still working
    • Test Driven Development Start the loop again.... 1. add a test 4. improve design2. get it to fail JUnit JUnit through refactoring 3. write enough code to pass the test
    • Test Driven Development1. add a test... motivate the next new feature by a test!
    • Test Driven Development 2. get it to fail...Mac Shortcut: „ CMD + 1“Windows Shortcut: „ Win + 1“
    • Test Driven Development 2. get it to fail...JUnit
    • Test Driven Development3. write code to pass the test... ... in the simplest possible way JUnit
    • Test Driven Development4. improve design always supporting your steps by the test, stay „green“ JUnit
    • Classical waterfall process Test Driven Development Analysis A new feature CustomerProject Manager or a small library What? Design Architect Senior Developer How? Implementation Developer Test Developer Tester
    • The process resulting from TDD Test Driven Development Analysis = Test What? 1. add a test2. get it to fail JUnit JUnit 4. improve design Design How? 3. write code to pass the test Implementation
    • TDD vs Waterfall Test Driven DevelopmentWaterfall: Analysis Design GAP Formal language lack TDD: ShoppingCart .... ...shouldHaveAListOfProductsInsideItself ...shouldCalculateTheSubotalOfAllProductsInTheShoppingCart Behavior Driven Development (last evolvement TDD) is binding the user stories directly to the tests!
    • TDD vs Waterfall Test Driven DevelopmentWaterfall: Design • predict the right design (M.Fowler, Is design dead?) • think about everything upfront? • sit down and think where to start, make random draftsTDD: • 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 Test Driven DevelopmentWaterfall: Implementation • 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 endTDD: • 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 Test Driven Development Analysis Design Implementation TestWaterfall 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 pressureTDD:Your test is already done!
    • TDD vs Waterfall Test Driven Development Analysis = Test Is a test still a test ? We should consider the test as specification of our requirements! ShoppingCart .... ...shouldHaveAListOfProductsInsideItself ...shouldCalculateTheSubotalOfAllProductsInTheShoppingCartBehavior Driven Development (BDD) by Dan NorthLarge adoption in the rails community with RSpec
    • Short-term advantages Test Driven DevelopmentShort-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
    • Long term advantages Test Driven Development Long term advantages• 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
    • Test Driven DevelopmentLong term advantages • tests will enforce compositions oriented design • this correlates very well with dependency injection of spring • stubbing can be easily realized, making the test faster and independent Main Service DAO external Tax-Service Validation Service <<implements>> <<implements>> <<implements>> Stub DAOImpl ValidationServiceImlpl Implementation
    • Pro and Contra, decide yourself.... Test Driven Development Time Invest into TDD and Maintenance of Tests VS Long term Short term• invasive refactoring possible through high test coverage => fast reaction on • by writing the test first we are able to think about the API and create it user friendly change => agility • we did not try to achieve the planned design, which is a hard task• simpler APIs for other team members the new code was used by the test itself • we never thought about design, just started to develop• we will face more bugs upfront and avoid debugging in the future, which is one • we immediately created an executable specification for our code of the most consuming time tasks, if the code was written long time ago. Author • the code is born with two clients: the test using it and the client code => reusable code himself can solve the bugs much faster since he has still the code in its mind • avoid loosing the time by build process, build and deploy only if everything is tested• reduce the debugging by QA, which is much more time intensive as by developer • compiler is assuring the syntax, tests assuring semantics• tests will enforce compositions oriented design • write the test once and develop against it, never check things manually for their• this correlates very well with dependency injection of spring correctness• stubbing can be easily realized, making the test much faster
    • Test Driven Development „Testing upfront takes to much time“ • of not testable code? of course... • at the end you have to test your code anyway • have you counted your time spent on manual testing during development?„Why to write tests for code I may be not use“ • this is only true for a prototype development or a not modularized code