Refactoring For Testability

20
Refactoring for Testability (or how I learned to stop worrying and love failing tests) Presented by Aaron Evans <[email protected]>

description

(or how I learned to stop worrying and love failing tests)

Transcript of Refactoring For Testability

Page 1: Refactoring For Testability

Refactoring for Testability

(or how I learned to stop worrying and love failing tests)

Presented by Aaron Evans <[email protected]>

Page 2: Refactoring For Testability

Refactoring for Testability

What is refactoring?

What is testability?

How do we do it?

Page 3: Refactoring For Testability

Refactoring for Testability

Why refactor?

My code is good

Page 4: Refactoring For Testability

Refactoring for Testability

Why refactor?

The only constant is change

Page 5: Refactoring For Testability

Refactoring for Testability

User Interface Code

Separate business logic from display logic

Encapsulate implementation details

Don’t tie your code to vendor

Don’t hard code configurationHandle errors

gracefully

Use meaningful variable names

Don’t expose other layers

Page 6: Refactoring For Testability

Refactoring for Testability

Refactoring the UI

Yes, Virginia, there really is display logic

ID tags

Individually testable components

Maintainable UI tests

Page 7: Refactoring For Testability

Refactoring for Testability

Push testing down the stack

Reduce brittle UI tests

Run tests faster

Isolate the system under test

Think about code as individual components

Page 8: Refactoring For Testability

Refactoring for Testability

SOLID

Single Responsibility PrincipleOpen / Closed Principle

Liskov Substitution Principle

Interface Segregation Principle

Dependency Inversion Principle

Liskov Substitution Principle

Page 9: Refactoring For Testability

Refactoring for Testability

Refactoring Strategies

http://www.refactoring.com/catalog/

Extract

Change

Encapsulate

Hide

Push down

Move

Consolidate

Expose

Substitute

Pull up

Page 10: Refactoring For Testability

Refactoring for Testability

This…Becomes…

Implementation

Page 11: Refactoring For Testability

Refactoring for Testability

Adding Layers of Abstraction

Composition over Inheritance

Indirection

Reusability

Database Abstraction LayerORM

Domain ModelBusiness Logic

Page 12: Refactoring For Testability

Refactoring for Testability

Simplifying Interfaces

Exposing Functionality

Page 13: Refactoring For Testability

Refactoring for Testability

Decoupling

Presentation and Business Logic

Persistence and Domain Objects

Interface from Implementation

Page 14: Refactoring For Testability

Refactoring for Testability

Dependency Injection

No news is good news

No framework is necessary

Factory pattern

Constructors / Setters / Builders

Loose Coupling

Page 15: Refactoring For Testability

Refactoring for Testability

Extract Interface

Inject Dependency

Page 16: Refactoring For Testability

Refactoring for Testability

Use Mocks

Single Responsibility

Page 17: Refactoring For Testability

Refactoring for Testability

Page 18: Refactoring For Testability

Refactoring for Testability

Reduce Dependencies

Page 19: Refactoring For Testability

Refactoring for Testability

Coding in business terms

Common domain language

Acceptance criteria

BDD frameworks – RSPEC, Specflow, JBehave

Page 20: Refactoring For Testability

Thanks...

Questions?

Aaron Evans <[email protected]>