SlideShare a Scribd company logo
www.odd-e.com




      I hate unit testing!!!




Friday, 9 December, 11
Who am I?

                     • Name: Steven Mak
                     • Agile Coach at Odd-e
                     • Lives in Hong Kong
                     • Agile, TDD Coaching
                     • I love coding - Java, C/C++,
                         PHP, Perl, and some weird
                         ones
                     •   I speak English, Cantonese,
                         and Mandarin


                                                       2


Friday, 9 December, 11
3


Friday, 9 December, 11
I HATE UNIT TESTING!


   • Doesn’t catch many bugs
   • Still need to do integration tests
   • Waste time



                                                4


Friday, 9 December, 11
Need to test at integration
                              level anyway?




                               Is this what you mean by integration testing?


                                                                               5

Friday, 9 December, 11
How many tests do you need to cover
                       through system level tests?


                                                                                                       10
                                                                                                     states
                      Tests                                            5 interactions
                                                                                                                      5 interactions




                                                                              10                     5 interactions
                                                                                                                        10
                                                                            states                                    states


                                     • It would take 1000 (or more) tests to this simple system!
                                     • System Level Tests just cannot be thorough
                                                                                                                                       6
     Adapted from: http://www.renaissancesoftware.net/files/sglon/LondonScrumGathering-v1r0.key.pdf


Friday, 9 December, 11
The down side
                     • Tons of them to write
                     • False sense of security
                     • Integration tests are slow
                     • Hard to diagnose
                     • Brittle
                        - one change would trigger many test failures




                                                                        7

Friday, 9 December, 11
Test Automation Pyramid




                You are going to need some integration tests,
                but not in the way you do like unit tests.      8

Friday, 9 December, 11
Write good focused unit tests

        • Don’t test the platform.
        • When writing a single object to test with other
            collaborating objects, use interfaces for those
            other points. Interfaces are not the actual
            collaborating object.
        •   Leverage the interfaces so you don’t need to
            actually test the other objects.
        •   Test the single object to speak to itself, i.e.
            State Tests
        •   Create your focused Collaboration and
            Contract Tests.
                                                              http://b-speaking.blogspot.com/search/label/integration%20tests




                                                                                                                                9

Friday, 9 December, 11
Collaboration and Contract Tests

                     • Collaboration tests:
                        - Do I ask the collaborators the right questions?
                        - Can I handle the collaborators’ responses?
                     • Contract tests:
                        - Can the interface accept the question being asked of it?
                        - Can the interface supply the responses expected?




                                                                                     10

Friday, 9 December, 11
Example:
                                                              We are assuming that
      @Test                                                   compareTo() would return 1
      public void with_arguments(){                           if we pass in “Test”
      ! MyCollaborator c = mock(MyCollaborator.class);
      ! when(c.compareTo("Test")).thenReturn(1);
      ! assertEquals(1,a.doSomethingElse("Test"));
      }



      @Test
      public void compareToShouldReturnOne(){      We write a test for the real
      ! ! MyCollaborator c = new MyCollaborator(); MyCollaborator.compareTo()
      ! ! assertEquals(1,c.compareTo("Test"));
      }



      Contract tests are usually slow but tend to be
      stable. Often running just once a day is plenty                              11

Friday, 9 December, 11
Refactoring?

                                                                                        Code smells!

                                                                                        Code stinks!




                    It’s no fun writing unit test if you don’t spend time refactoring




                                                                                                       12

Friday, 9 December, 11
Why? How?
                                       opportunity for

                         refactoring
                                        amount of code
                                           smells

                              O               indicates          motivation
                                                                 developers
                                                          O
                                       amount of bad
                                          code
                                                              quick hacks


                                  # of bugs                           panic
                                                 time spend on
                                                    bug fixing
                                                                              13

Friday, 9 December, 11
Refactoring visualized
                            Without refactoring:


                Original program:



                Making changes:



                 More changes:




                                                   14

Friday, 9 December, 11
Refactoring visualized
                            Without refactoring:


                Original program:



                Making changes:



                 More changes:




                                                   14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:


                Original program:



                Making changes:



                 More changes:




                         Cost of change
                         increases rapidly!           14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:   With refactoring:


                Original program:



                Making changes:



                 More changes:




                         Cost of change
                         increases rapidly!                               14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:   With refactoring:


                Original program:
                                                                          Small change


                Making changes:



                 More changes:




                         Cost of change
                         increases rapidly!                                              14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:   With refactoring:


                Original program:
                                                                          Small change


                Making changes:



                 More changes:




                         Cost of change
                         increases rapidly!                                              14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:   With refactoring:


                Original program:
                                                                          Small change

                                                                          Refactor
                Making changes:



                 More changes:




                         Cost of change
                         increases rapidly!                                              14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:   With refactoring:


                Original program:
                                                                          Small change

                                                                          Refactor
                Making changes:



                 More changes:




                         Cost of change
                         increases rapidly!                                              14

Friday, 9 December, 11
Refactoring visualized
                               Without refactoring:   With refactoring:


                Original program:
                                                                          Small change

                                                                          Refactor
                Making changes:

                                                                           Etc
                 More changes:




                         Cost of change                 Cost of change
                         increases rapidly!             not increases                    14

Friday, 9 December, 11
Refactoring based on unit testing




                                                             15

Friday, 9 December, 11
What to refactor?




                                             16


Friday, 9 December, 11
Beware of blocking
                • Individual Code Ownership?
                • Branching for long time?
                • Deadline pressure?
                  - Refactoring makes your code base easier to work on




                                                                         17


Friday, 9 December, 11
Time consuming?




                          Too busy fire fighting, but no time to write tests?




                                                                              18


Friday, 9 December, 11
Sustainability

       Traditional       Speculate   Code   Test   Debug

      development

Time                           vs




                                                           19

Friday, 9 December, 11
Time developers
                                                    do not notice
                         Sustainability              nor plan for



       Traditional       Speculate   Code   Test   Debug

      development

Time                           vs




                                                               19

Friday, 9 December, 11
Time developers
                                                         do not notice
                         Sustainability                   nor plan for



       Traditional       Speculate    Code     Test     Debug

      development

Time                             vs




       Test-driven       Spec
                                        Test and Code    Debug
      development        ulate



                                                                    19

Friday, 9 December, 11
Sustainability

       Traditional       Speculate    Code     Test     Debug

      development

Time                             vs
                                                           Feels
                                                           slower

       Test-driven       Spec
                                        Test and Code    Debug
      development        ulate



                                                                    19

Friday, 9 December, 11
We are tired of
                             delivering craps




                         Do you have confidence with your work
                                 before you deliver it?         20


Friday, 9 December, 11
Edsger Dijkstra
                         “Those who want really reliable
                         software will discover that they must
                         find means of avoiding the majority
                         of bugs to start with, and as a result,
                         the programming process will
                         become cheaper. If you want more
                         effective programmers, you will
                         discover that they should not waste
                         their time debugging, they should
                         not introduce the bugs to start with.”


                                                                   21

Friday, 9 December, 11
TDD Cycle
            Test

                         Implement

                                     Design




                          • Short
                          • Rhythmic
                          • Incremental
                          • Design-focused
                          • Disciplined
                                                          22

Friday, 9 December, 11
Oh, Our code was there already

                1. Identify change point
                2. Find test points
                3. Break dependencies
                4. Write tests
                5. Make changes and refactor




                           It is always harder to write unit tests
                                   after we wrote the code           23


Friday, 9 December, 11
Our code is too simple,
                            so we don’t need unit testing




                                      Our code is too complicated,
                                    so writing unit tests is too difficult




                         We don’t have problems at unit level

                                                                            24

Friday, 9 December, 11
Tests you write after the fact are
                             Defense or Justification
                • Test later = Test never
                • After-the-fact tests are written by someone
                     who is already vested in the code and
                     already knows how the problem was solved
                •    There’s just no way those tests can be
                     anywhere near as incisive as tests written
                     first




                • If you write the unit test after the fact, you
                     are not going to catch many bugs.


                                                                   25


Friday, 9 December, 11
Unit test is not just about testing




                                   Look at the design through unit tests


                                                                           26

Friday, 9 December, 11
Modularity                ==       Testability




                         Focus on tests first ensures modularity
                            and other good design principles      27

Friday, 9 December, 11
Design from the perspective of use
      rather than implementation

                                           28

Friday, 9 December, 11
It is always harder to write unit tests
                                            after we wrote the code

                • Debug-later-programming don’t consider testability in the first place
                • TDD guarantees testability, while you still need to know good design
                     principles
                •    Unit tests give you a safety net to try different design




                                                                                         29

Friday, 9 December, 11
When you find it hard to
                           write unit tests...
                     • Instantiating class instance that is hard to setup?
                        - What about using Factories?
                        - Have you think about Dependency Injection?
                     • Long methods?
                        - Does it have more than one responsibilities?
                     • Bare classes?
                        - Why not provide abstract base classes to support better mocking?
                        - Why clients need to know everything from this base class?
                           •   Interface Segregation Principle




                                                                                             30

Friday, 9 December, 11
TDD, The Professional Option
              •          Confidence and trust in the code

                          -   Treading the happy path

                          -   “If it doesn’t have to work, I can get it done a lot faster!”

                          -   “Cost of bug fixing is lower if it is found earlier”

              •          Encourages good design

                          -   Clean it up later

                          -   Experimenting different design

              •          Integration Testing

                          -   Making assumptions explicit

                                                                                              31

Friday, 9 December, 11
Resources


                         32

Friday, 9 December, 11
Agile Tour ShenZhen
                     • Tencent Building, Shenzhen (
                        - 20 Nov 2011
                        - Tencent Building, Kejizhongyi Avenue, Hi-techPark,Nanshan
                             District,Shenzhen.
                         -                              腾讯                   侧


                     • http://www.agiletour.cn
                     • Contact: steven@odd-e.com




                                                                                      33

Friday, 9 December, 11
I want to organise a group in
                          Hong Kong!


                     http://tinyurl.com/HKALSDN




                                                  34

Friday, 9 December, 11
Further readings
                     • Integration Tests are a Scam:
                        - http://www.jbrains.ca/series/integrated-tests-are-a-scam
                     • Integration Contract Tests:
                        - http://martinfowler.com/bliki/IntegrationContractTest.html
                     • Opportunistic Refactoring:
                        - http://martinfowler.com/bliki/OpportunisticRefactoring.html
                     • Demand Technical Excellence:
                        - http://www.renaissancesoftware.net/files/sglon/
                            LondonScrumGathering-v1r0.key.pdf
                     •   Clean Coder, by Robert Martin




                                                                                        35

Friday, 9 December, 11
Books - Technical Practices




                                                 36

Friday, 9 December, 11
Thank you :-)


     Steven Mak
     Email: steven@odd-e.com
                                         37


Friday, 9 December, 11

More Related Content

PPTX
An Introduction to Unit Testing
PDF
Unit Test + Functional Programming = Love
PDF
Unit testing (workshop)
PPTX
Benefit From Unit Testing In The Real World
PDF
How and what to unit test
PPTX
Unit Testing And Mocking
PPTX
Roy Osherove on Unit Testing Good Practices and Horrible Mistakes
PPTX
Unit Testing Concepts and Best Practices
An Introduction to Unit Testing
Unit Test + Functional Programming = Love
Unit testing (workshop)
Benefit From Unit Testing In The Real World
How and what to unit test
Unit Testing And Mocking
Roy Osherove on Unit Testing Good Practices and Horrible Mistakes
Unit Testing Concepts and Best Practices

What's hot (19)

PDF
Clean Unit Test Patterns
KEY
Unit Testing Your Application
PPS
Unit Testing
PPTX
Understanding Unit Testing
PPTX
A Brief Introduction to Test-Driven Development
PDF
Test Driven Development
PPTX
Getting started with Test Driven Development - Ferdous Mahmud Shaon
PDF
Unit Testing Fundamentals
PPTX
Unit Testing (C#)
PPT
Getting Unstuck: Working with Legacy Code and Data
PPTX
Software Quality via Unit Testing
PPT
Unit testing
PPTX
Test driven development in .Net - 2010 + Eclipse
PPTX
Unit testing - the hard parts
PPTX
Unit Testing
PDF
iOS Test-Driven Development
PPTX
Mock driven development using .NET
PPT
Unit Testing, TDD and the Walking Skeleton
Clean Unit Test Patterns
Unit Testing Your Application
Unit Testing
Understanding Unit Testing
A Brief Introduction to Test-Driven Development
Test Driven Development
Getting started with Test Driven Development - Ferdous Mahmud Shaon
Unit Testing Fundamentals
Unit Testing (C#)
Getting Unstuck: Working with Legacy Code and Data
Software Quality via Unit Testing
Unit testing
Test driven development in .Net - 2010 + Eclipse
Unit testing - the hard parts
Unit Testing
iOS Test-Driven Development
Mock driven development using .NET
Unit Testing, TDD and the Walking Skeleton
Ad

Similar to Is this how you hate unit testing? (20)

PDF
Seconf2011 database driven combinatorial testing
PPTX
Continous testing for grails
PDF
Pragmatic Not Dogmatic TDD Agile2012 by Joseph Yoder and Rebecca Wirfs-Brock
PDF
Pragmatic notdogmatictdd agile2012
PDF
Test Driven Sysadmin
PDF
Practical Guide to Unit Testing
PPTX
Test Driven Development on Android (Kotlin Kenya)
PPTX
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
PDF
Are Your Tests Really Helping You?
PDF
Completely Test-Driven
PDF
ChefConf2014 - Chef TDD
PDF
Test Driven Development - Caleb Tutty
PDF
Morph your mindset for Continuous Delivery, Agile Roots 2014
PDF
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
PPTX
2016 10-04: tdd++: tdd made easier
PPTX
Unit Test Lab - Why Write Unit Tests?
PPTX
Test-Driven Development
PDF
Test Driven Development - Workshop
PDF
Test-Driven Development
PDF
The Test Case as Executable Example
Seconf2011 database driven combinatorial testing
Continous testing for grails
Pragmatic Not Dogmatic TDD Agile2012 by Joseph Yoder and Rebecca Wirfs-Brock
Pragmatic notdogmatictdd agile2012
Test Driven Sysadmin
Practical Guide to Unit Testing
Test Driven Development on Android (Kotlin Kenya)
assertYourself - Breaking the Theories and Assumptions of Unit Testing in Flex
Are Your Tests Really Helping You?
Completely Test-Driven
ChefConf2014 - Chef TDD
Test Driven Development - Caleb Tutty
Morph your mindset for Continuous Delivery, Agile Roots 2014
Unit Testing and Behavior Driven Testing with AngularJS - Jesse Liberty | Fal...
2016 10-04: tdd++: tdd made easier
Unit Test Lab - Why Write Unit Tests?
Test-Driven Development
Test Driven Development - Workshop
Test-Driven Development
The Test Case as Executable Example
Ad

More from Steven Mak (11)

PDF
Continuous Security Testing
PDF
Quality comes free with open source testing tools
PDF
Adopting technical practices 2013
PDF
100 doors kata solution
PDF
Bossless companies
PDF
Driving Quality with TDD
PDF
Unbearable Test Code Smell
PDF
Sustainable TDD
KEY
Introduction to Acceptance Test Driven Development
KEY
Essential practices and thinking tools for Agile Adoption
KEY
ATDD in Practice
Continuous Security Testing
Quality comes free with open source testing tools
Adopting technical practices 2013
100 doors kata solution
Bossless companies
Driving Quality with TDD
Unbearable Test Code Smell
Sustainable TDD
Introduction to Acceptance Test Driven Development
Essential practices and thinking tools for Agile Adoption
ATDD in Practice

Recently uploaded (20)

PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Electronic commerce courselecture one. Pdf
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
A Presentation on Artificial Intelligence
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
Cloud computing and distributed systems.
PDF
Machine learning based COVID-19 study performance prediction
PDF
KodekX | Application Modernization Development
PDF
Modernizing your data center with Dell and AMD
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
cuic standard and advanced reporting.pdf
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
The Rise and Fall of 3GPP – Time for a Sabbatical?
Building Integrated photovoltaic BIPV_UPV.pdf
Chapter 3 Spatial Domain Image Processing.pdf
Review of recent advances in non-invasive hemoglobin estimation
Advanced methodologies resolving dimensionality complications for autism neur...
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
20250228 LYD VKU AI Blended-Learning.pptx
Electronic commerce courselecture one. Pdf
Digital-Transformation-Roadmap-for-Companies.pptx
Reach Out and Touch Someone: Haptics and Empathic Computing
A Presentation on Artificial Intelligence
NewMind AI Weekly Chronicles - August'25 Week I
Cloud computing and distributed systems.
Machine learning based COVID-19 study performance prediction
KodekX | Application Modernization Development
Modernizing your data center with Dell and AMD
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
cuic standard and advanced reporting.pdf
Per capita expenditure prediction using model stacking based on satellite ima...

Is this how you hate unit testing?

  • 1. www.odd-e.com I hate unit testing!!! Friday, 9 December, 11
  • 2. Who am I? • Name: Steven Mak • Agile Coach at Odd-e • Lives in Hong Kong • Agile, TDD Coaching • I love coding - Java, C/C++, PHP, Perl, and some weird ones • I speak English, Cantonese, and Mandarin 2 Friday, 9 December, 11
  • 4. I HATE UNIT TESTING! • Doesn’t catch many bugs • Still need to do integration tests • Waste time 4 Friday, 9 December, 11
  • 5. Need to test at integration level anyway? Is this what you mean by integration testing? 5 Friday, 9 December, 11
  • 6. How many tests do you need to cover through system level tests? 10 states Tests 5 interactions 5 interactions 10 5 interactions 10 states states • It would take 1000 (or more) tests to this simple system! • System Level Tests just cannot be thorough 6 Adapted from: http://www.renaissancesoftware.net/files/sglon/LondonScrumGathering-v1r0.key.pdf Friday, 9 December, 11
  • 7. The down side • Tons of them to write • False sense of security • Integration tests are slow • Hard to diagnose • Brittle - one change would trigger many test failures 7 Friday, 9 December, 11
  • 8. Test Automation Pyramid You are going to need some integration tests, but not in the way you do like unit tests. 8 Friday, 9 December, 11
  • 9. Write good focused unit tests • Don’t test the platform. • When writing a single object to test with other collaborating objects, use interfaces for those other points. Interfaces are not the actual collaborating object. • Leverage the interfaces so you don’t need to actually test the other objects. • Test the single object to speak to itself, i.e. State Tests • Create your focused Collaboration and Contract Tests. http://b-speaking.blogspot.com/search/label/integration%20tests 9 Friday, 9 December, 11
  • 10. Collaboration and Contract Tests • Collaboration tests: - Do I ask the collaborators the right questions? - Can I handle the collaborators’ responses? • Contract tests: - Can the interface accept the question being asked of it? - Can the interface supply the responses expected? 10 Friday, 9 December, 11
  • 11. Example: We are assuming that @Test compareTo() would return 1 public void with_arguments(){ if we pass in “Test” ! MyCollaborator c = mock(MyCollaborator.class); ! when(c.compareTo("Test")).thenReturn(1); ! assertEquals(1,a.doSomethingElse("Test")); } @Test public void compareToShouldReturnOne(){ We write a test for the real ! ! MyCollaborator c = new MyCollaborator(); MyCollaborator.compareTo() ! ! assertEquals(1,c.compareTo("Test")); } Contract tests are usually slow but tend to be stable. Often running just once a day is plenty 11 Friday, 9 December, 11
  • 12. Refactoring? Code smells! Code stinks! It’s no fun writing unit test if you don’t spend time refactoring 12 Friday, 9 December, 11
  • 13. Why? How? opportunity for refactoring amount of code smells O indicates motivation developers O amount of bad code quick hacks # of bugs panic time spend on bug fixing 13 Friday, 9 December, 11
  • 14. Refactoring visualized Without refactoring: Original program: Making changes: More changes: 14 Friday, 9 December, 11
  • 15. Refactoring visualized Without refactoring: Original program: Making changes: More changes: 14 Friday, 9 December, 11
  • 16. Refactoring visualized Without refactoring: Original program: Making changes: More changes: Cost of change increases rapidly! 14 Friday, 9 December, 11
  • 17. Refactoring visualized Without refactoring: With refactoring: Original program: Making changes: More changes: Cost of change increases rapidly! 14 Friday, 9 December, 11
  • 18. Refactoring visualized Without refactoring: With refactoring: Original program: Small change Making changes: More changes: Cost of change increases rapidly! 14 Friday, 9 December, 11
  • 19. Refactoring visualized Without refactoring: With refactoring: Original program: Small change Making changes: More changes: Cost of change increases rapidly! 14 Friday, 9 December, 11
  • 20. Refactoring visualized Without refactoring: With refactoring: Original program: Small change Refactor Making changes: More changes: Cost of change increases rapidly! 14 Friday, 9 December, 11
  • 21. Refactoring visualized Without refactoring: With refactoring: Original program: Small change Refactor Making changes: More changes: Cost of change increases rapidly! 14 Friday, 9 December, 11
  • 22. Refactoring visualized Without refactoring: With refactoring: Original program: Small change Refactor Making changes: Etc More changes: Cost of change Cost of change increases rapidly! not increases 14 Friday, 9 December, 11
  • 23. Refactoring based on unit testing 15 Friday, 9 December, 11
  • 24. What to refactor? 16 Friday, 9 December, 11
  • 25. Beware of blocking • Individual Code Ownership? • Branching for long time? • Deadline pressure? - Refactoring makes your code base easier to work on 17 Friday, 9 December, 11
  • 26. Time consuming? Too busy fire fighting, but no time to write tests? 18 Friday, 9 December, 11
  • 27. Sustainability Traditional Speculate Code Test Debug development Time vs 19 Friday, 9 December, 11
  • 28. Time developers do not notice Sustainability nor plan for Traditional Speculate Code Test Debug development Time vs 19 Friday, 9 December, 11
  • 29. Time developers do not notice Sustainability nor plan for Traditional Speculate Code Test Debug development Time vs Test-driven Spec Test and Code Debug development ulate 19 Friday, 9 December, 11
  • 30. Sustainability Traditional Speculate Code Test Debug development Time vs Feels slower Test-driven Spec Test and Code Debug development ulate 19 Friday, 9 December, 11
  • 31. We are tired of delivering craps Do you have confidence with your work before you deliver it? 20 Friday, 9 December, 11
  • 32. Edsger Dijkstra “Those who want really reliable software will discover that they must find means of avoiding the majority of bugs to start with, and as a result, the programming process will become cheaper. If you want more effective programmers, you will discover that they should not waste their time debugging, they should not introduce the bugs to start with.” 21 Friday, 9 December, 11
  • 33. TDD Cycle Test Implement Design • Short • Rhythmic • Incremental • Design-focused • Disciplined 22 Friday, 9 December, 11
  • 34. Oh, Our code was there already 1. Identify change point 2. Find test points 3. Break dependencies 4. Write tests 5. Make changes and refactor It is always harder to write unit tests after we wrote the code 23 Friday, 9 December, 11
  • 35. Our code is too simple, so we don’t need unit testing Our code is too complicated, so writing unit tests is too difficult We don’t have problems at unit level 24 Friday, 9 December, 11
  • 36. Tests you write after the fact are Defense or Justification • Test later = Test never • After-the-fact tests are written by someone who is already vested in the code and already knows how the problem was solved • There’s just no way those tests can be anywhere near as incisive as tests written first • If you write the unit test after the fact, you are not going to catch many bugs. 25 Friday, 9 December, 11
  • 37. Unit test is not just about testing Look at the design through unit tests 26 Friday, 9 December, 11
  • 38. Modularity == Testability Focus on tests first ensures modularity and other good design principles 27 Friday, 9 December, 11
  • 39. Design from the perspective of use rather than implementation 28 Friday, 9 December, 11
  • 40. It is always harder to write unit tests after we wrote the code • Debug-later-programming don’t consider testability in the first place • TDD guarantees testability, while you still need to know good design principles • Unit tests give you a safety net to try different design 29 Friday, 9 December, 11
  • 41. When you find it hard to write unit tests... • Instantiating class instance that is hard to setup? - What about using Factories? - Have you think about Dependency Injection? • Long methods? - Does it have more than one responsibilities? • Bare classes? - Why not provide abstract base classes to support better mocking? - Why clients need to know everything from this base class? • Interface Segregation Principle 30 Friday, 9 December, 11
  • 42. TDD, The Professional Option • Confidence and trust in the code - Treading the happy path - “If it doesn’t have to work, I can get it done a lot faster!” - “Cost of bug fixing is lower if it is found earlier” • Encourages good design - Clean it up later - Experimenting different design • Integration Testing - Making assumptions explicit 31 Friday, 9 December, 11
  • 43. Resources 32 Friday, 9 December, 11
  • 44. Agile Tour ShenZhen • Tencent Building, Shenzhen ( - 20 Nov 2011 - Tencent Building, Kejizhongyi Avenue, Hi-techPark,Nanshan District,Shenzhen. - 腾讯 侧 • http://www.agiletour.cn • Contact: steven@odd-e.com 33 Friday, 9 December, 11
  • 45. I want to organise a group in Hong Kong! http://tinyurl.com/HKALSDN 34 Friday, 9 December, 11
  • 46. Further readings • Integration Tests are a Scam: - http://www.jbrains.ca/series/integrated-tests-are-a-scam • Integration Contract Tests: - http://martinfowler.com/bliki/IntegrationContractTest.html • Opportunistic Refactoring: - http://martinfowler.com/bliki/OpportunisticRefactoring.html • Demand Technical Excellence: - http://www.renaissancesoftware.net/files/sglon/ LondonScrumGathering-v1r0.key.pdf • Clean Coder, by Robert Martin 35 Friday, 9 December, 11
  • 47. Books - Technical Practices 36 Friday, 9 December, 11
  • 48. Thank you :-) Steven Mak Email: steven@odd-e.com 37 Friday, 9 December, 11