270 likes | 532 Views
Unit testing. Lecture Outline. Introduction to Unit Testing Development principles Unit Test Frameworks Unit tests for legacy code Resources. Introduction to Unit Testing. Overview: Why write unit tests? Why not? What are bugs? What unit tests won't do for you.
E N D
Lecture Outline • Introduction to Unit Testing • Development principles • Unit Test Frameworks • Unit tests for legacy code • Resources
Introduction to Unit Testing • Overview: Why write unit tests? Why not? • What are bugs? • What unit tests won't do for you
Introduction to Unit Testing Overview Why write Unit Tests? • Clean, bug-free, documented code • Quality software: less complaints • Coding simplicity: less stress Why not? Not enough time!
Introduction to Unit Testing Overview • The less tests, the more bugs • The more bugs, the more complaints • The more complaints, the more stress • The more stress, the less tests we write
Introduction to Unit Testing Overview Can we write bug-free code? ? ? ? ? ? ? ?
Introduction to Unit Testing Overview What is a bug? • An unwanted feature (memory leak, feature creep etc.) • A "broken" feature • A misunderstood feature (by the client or the coder) "It's not a bug, it’s a feature!"
Introduction to Unit Testing Overview What Unit Tests don’t do: Performance issues Integration errors User interface issues
Introduction to Unit Testing Statistics According to some very reliable sources, programmers tend to spend over 80% of their working time looking for causes of bugs in existing code, 15% fixing these bugs, and 5% designing and developing new code. (source: N.Connault's astute observations, 2008).
Introduction to Unit Testing Collateral Damage Code Library 1 Code Library 2 Dependencies Identify Bug Fix bug Test library 1 Patch library 1 NEW HIDDEN BUG !!! Result: Waste of time
Introduction to Unit Testing Solution Code Library 1 Code Library 2 Dependencies Identify Bug Fix bug Test alllibraries Patch libraries When all tests pass... Result: Better code
Coding principles • Coding principles • that apply to unit testing • ...
If you don't know why your modification fixed a bug, Coding principles Ignorance is the enemy • you're almost guaranteed • to be the creator of at least one new bug
Coding principles Holistic development Development and testing are not separate tasks
Coding principles Automation The goal of programming is to reduce the amount of repetitive work and the number of simple decisions humans need to make. Testing code is repetitive, and it is usually simple. Tests should be automated.
Coding principles Isolation Each unit test must test a single unit of code. A unit of code is usually a simple function or a simple method. Example of an overloaded function: solveWorldHunger(money)
Coding principles Independence One unit test must never affect another. The order in which they are run must be absolutely inconsequential
Coding principles Test-driven development When you need new functionality, first write a failing unit test, then implement the new code.
Coding principles Reliability Never introduce bugs in your unit tests. Write them with the same rigour as with your regular code.
Coding principles Mock objects • Write mock objects for: • Objects whose behaviour is non-deterministic (news feed) • Objects that are complex/difficult to set up • Objects that are slow • Objects that have or are a User Interface • Objects whose behaviour is hard to trigger • Objects that haven't yet been implemented
Coding principles Golden Rule NEVER, NEVER, NEVER commit code if any unit test fails !!!
Coding principles Thoroughness Test boundary conditions as much as is possible and reasonable, including heavy load conditions.
Coding principles Prioritise Don't write tests for code that will obviously never fail
Unit test Frameworks Advantages • Automate the generation of unit testing code • Simplify the entire process • Provide advanced testing features (mock objects, fancy reports, expectations etc…)
Too big a job to “catch up” all at once Create unit tests to verify bug reports Use unit tests to fix bugs Refactor code when needed Commit bug fix when all unit tests pass Unit Tests in legacy code
Andrew Hunt and David Thomas. Pragmatic Unit Testing in Java with JUnit. The Pragmatic Programmers, LLC, Raleigh, NC, and Dallas, TX, 2004. Venkat Subramaniam and Andy Hunt. Practices of an Agile Developer working in the Real World, The Pragmatic Bookshelf, 2006. http://blog.daveastels.com/2005/07/05/a-new-look-at-test-driven-development http://www.ibm.com/developerworks/java/library/j-cq09187/index.html http://video.google.com/videoplay?docid=8135690990081075324 Resources