test driven refactoring by andreas thies. xp 2004 - test driven refactoring2 overview refactoring...

Post on 30-Mar-2015

217 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Test Driven Refactoring

by Andreas Thies

XP 2004 - Test Driven Refactoring

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

Catalog of refactorings (1) 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

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

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

XP 2004 - Test Driven Refactoring

12

Catalog of refactorings (2) 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

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

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

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

51

Jester – A JUnit Tester (2) Changes made by Jester:

modifying literal numbers changing true to false / false to true

changing if( to if(true || changing if( to if(false &&

XP 2004 - Test Driven Refactoring

52

Jester – A JUnit Tester (3) Advantages:

more powerfull than simple code coverage

Disadvantages: very slow – recompiling after each

change made needed

XP 2004 - Test Driven Refactoring

53

Now: demonstration Jester

top related