1 / 53

Test Driven Refactoring

Learn about refactoring, bad smells in code, and how to improve code quality through unit testing. Explore a catalog of refactorings and discover how to minimize risks.

Download Presentation

Test Driven Refactoring

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Test Driven Refactoring by Andreas Thies

  2. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  3. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  4. What‘s Refactoring? • A change made to the internal structure of software • to make it easier to understand • to make it cheaper to modify • without changing its observable behaviour XP 2004 - Test Driven Refactoring

  5. Why should I refactor? • Refactoring improves the design of software • Refactoring makes software easyer to understand • Refactoring helps to find and prevent bugs • Refactoring helps you program faster XP 2004 - Test Driven Refactoring

  6. When should I refacor • Refactor when you need to fix a bug • Refactor as you do a code review • Refactor when you try to understand other people‘s code XP 2004 - Test Driven Refactoring

  7. When should‘nt I refactor • When starting from the beginning would be easier than refactoring • When evaluation is close to a deadline XP 2004 - Test Driven Refactoring

  8. Risks (1) • „Never touch a running system“ XP 2004 - Test Driven Refactoring

  9. Risks (2) • Editing code without adding new functionality increases the risk of infiltrating new bugs • Refactoring code may remove functionality other developers rely on • .... XP 2004 - Test Driven Refactoring

  10. Risk (3) • So what can I to minimize the Risk? • Make small steps ! • Write extensive test-suites !! • Use them after each step !!! XP 2004 - Test Driven Refactoring

  11. Add Parameter Change Bidirectional Association to Unidirectional Change Reference to Value Change Unidirectional Association to Bidirectional Change Value to Reference Collapse Hierarchy Consolidate Conditional Expression Consolidate Duplicate Conditional Fragments Convert Dynamic to Static Construction Convert Static to Dynamic Construction Decompose Conditional Duplicate Observed Data Eliminate Inter-Entity Bean Communication Catalog of refactorings (1) • Introduce Business Delegate • Introduce Explaining Variable • Introduce Foreign Method • Introduce Local Extension • Introduce Null Object • Introduce Parameter Object • Introduce Synchronizer Token • Localize Disparate Logic • Merge Session Beans • Move Business Logic to Session • Move Class Davison • Move Field • Move Method • Parameterize Method • Preserve Whole Object • Pull Up Constructor Body • Pull Up Field • Pull Up Method • Push Down Field • Encapsulate Collection • Encapsulate Downcast • Encapsulate Field • Extract Class • Extract Interface • Extract Method • Extract Package • Extract Subclass • Extract Superclass • Form Template Method • Hide Delegate • Hide Method • Hide presentation tier-specific details from the business tier • Inline Class • Inline Method • Inline Temp • Introduce A Controller Introduce Assertion XP 2004 - Test Driven Refactoring

  12. Push Down Method Reduce Scope of Variable Refactor Architecture Remove Assignments to Parameters Remove Control Flag Remove Double Negative Remove Middle Man Remove Parameter Remove Setting Method Rename Method Replace Array with Object Replace Assignment with Initialization Replace Conditional with Polymorphism Replace Conditional with Visitor Catalog of refactorings (2) • Replace Record with Data Class • Replace Recursion with Iteration • Replace Static Variable with Parameter • Replace Subclass with Fields • Replace Temp with Query • Replace Type Code with Class • Replace Type Code with State/Strategy • Replace Type Code with Subclasses • Reverse Conditional • Self Encapsulate Field • Separate Data Access Code Separate Query from Modifier • Split Loop • Split Temporary Variable • Substitute Algorithm • Use a Connection Pool Wrap entities with session • Replace Constructor with Factory Method • Replace Data Value with Object • Replace Delegation with Inheritance • Replace Error Code with Exception • Replace Exception with Test • Replace Inheritance with Delegation • Replace Iteration with Recursion • Replace Magic Number with Symbolic Constant • Replace Method with Method Object • Replace Nested Conditional with Guard Clauses • Replace Parameter with Explicit Methods • Replace Parameter with Method XP 2004 - Test Driven Refactoring

  13. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  14. What are „Bad Smells“ • anything in your code, where a refactoring seems to be overdue • perhaps detectable using certain metrics (?) XP 2004 - Test Driven Refactoring

  15. Bad smells (1) • Duplicated Code • Long Method • Large Class • Long Parameter List • Divergent Change • Shotgun Surgery XP 2004 - Test Driven Refactoring

  16. Bad smells (2) • Switch Statements • Lazy Class • Speculative Generality • Alternative Class with Different Interfaces • Data Class • Refused Bequest • Long comments XP 2004 - Test Driven Refactoring

  17. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  18. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  19. Validating correctness • Because a refactoring don‘t change the observable behaviour, all unit tests will run afterwards • But only, when the refactoring don‘t manipulate the interface • Most refactorings do so! XP 2004 - Test Driven Refactoring

  20. Types of refactoring (1) • Compatible • e.g. split temporary variable • no need to update tests • Backwards compatible • e.g. pull up field • add aditional tests XP 2004 - Test Driven Refactoring

  21. Types of refactoring (2) • Refactorings that can be made backwards compatible • e.g. rename method • mark the old interface as deprecated • add aditional tests • Incompatible refactorings • e.g. hide method XP 2004 - Test Driven Refactoring

  22. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  23. Bad smells in Unit Test • Same as the production code, unit tests are java code also • Most of bad smells will fit here too • Aditional to this there are few more smells with their own refactorings XP 2004 - Test Driven Refactoring

  24. Smell 1: Mystery Guest • A test using external recources like a testfile is no longer self contained • Introduces hidden depencies • This makes it hard to use the test as an aditional documentation XP 2004 - Test Driven Refactoring

  25. Mystery Guest: Solution • Inline Resource:Set up a fixture in the test code that holds the same contents as the resource XP 2004 - Test Driven Refactoring

  26. Smell 2: Recource Optimism • Test code make optimistic assumptions about the existence of external resources • May introduce non-deterministic behavior XP 2004 - Test Driven Refactoring

  27. Recource Optimism: Solution • Setup external resources:Make sure the test that uses external resources creates or allocates them before testing. XP 2004 - Test Driven Refactoring

  28. Smell 3: Test Run War • A test uses special recources making it unable to be run by more than one programmer a time • Introduces non-deterministic behaviour XP 2004 - Test Driven Refactoring

  29. Test Run War: Solution • Make Resources Unique:Use unique identifiers for all resources that are allocated, for example by including a time-stamp XP 2004 - Test Driven Refactoring

  30. Smell 4: General Fixture • The setUp()-method becomes too general • Hard to understand • Tests may slow down XP 2004 - Test Driven Refactoring

  31. General Fixture: Solution • Use Extract Method XP 2004 - Test Driven Refactoring

  32. Smell 5: Eager Test • One test method checks several methods of the object to be tested • Makes test more dependent on each other XP 2004 - Test Driven Refactoring

  33. Eger Test: Solution • Use Extract Method XP 2004 - Test Driven Refactoring

  34. Smell 6: Lazy Test • Several test methods check one method of the object to be tested • Only all tests execued together have meaning XP 2004 - Test Driven Refactoring

  35. Lazy Test: Solution • Use Inline Method XP 2004 - Test Driven Refactoring

  36. Smell 7: Assertion Roulette • Test methods without explanation XP 2004 - Test Driven Refactoring

  37. Assertion Roulette: Solution • Add Comments ! XP 2004 - Test Driven Refactoring

  38. Smell 8: Indirect Testing • A test class no longer tests only its counterpart in the production code XP 2004 - Test Driven Refactoring

  39. Indirect Testing: Solution • Problem might be caused in the production code: not enough data hiding! • Otherwise: Extract Method / Move Method XP 2004 - Test Driven Refactoring

  40. Smell 9: For Testers Only • A production class contains methods that are only used by test methods XP 2004 - Test Driven Refactoring

  41. For Testers Only: Solution • Problem caused in the production code! • Remove these methods or if they are needed to set up the tests use Extract Method / Move Method XP 2004 - Test Driven Refactoring

  42. Smell 10: Sensitive Equality • Comparing by simply using the .toString() method depends on many irrelevant details such as spaces and tabs XP 2004 - Test Driven Refactoring

  43. Sensitive Equality: Solution • Introduce Equality MethodDon‘t use the .toString() method but introduce a method testing the values itselve. XP 2004 - Test Driven Refactoring

  44. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  45. Bad Smells in Tests – Review • Most of bad smells and refactorings will fit for unit tests also • There are several special bad smells and refactorings for unit tests • Bad smells in unit tests can indicate problems in the production code XP 2004 - Test Driven Refactoring

  46. Overview • Refactoring • Bad Smells • Unit Tests • Unit Tests and Refactoring • Special Smells & Refactorings • Review • Testing Unit Tests XP 2004 - Test Driven Refactoring

  47. Final Question: • Can you also test unit tests? XP 2004 - Test Driven Refactoring

  48. Code Coverage (1) • Report during test which parts of the production code are not executed • With this information you can easily find out which parts of the production code are still untested XP 2004 - Test Driven Refactoring

  49. Code Coverage (2) • CC4J - Code Coverage für Java Applikationen • 30 days limited version available • http://www.scoop-gmbh.de/scoop/downloads.htm XP 2004 - Test Driven Refactoring

  50. Jester – A JUnit Tester (1) • Free available tester for JUnit tests • Modifies the production code and reexecutes the tests suites • now they should fail, otherwise there are untested functions in production code XP 2004 - Test Driven Refactoring

More Related