19
Magnus Härlin [email protected] @MagnusHarlin

Magnus Härlin [email protected] @MagnusHarlin

Embed Size (px)

Citation preview

Page 1: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Magnus Hä[email protected]@MagnusHarlin

Page 2: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

What is testability?Repeatable - You should be able to expect the

outcome for known inputsEasy to writeEasy to understandFast

Page 3: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Value of automated testingReduce the time coding + debugging +

testingGives you better maintainabilityQuick feedback mechanismTests as documentation

Page 4: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Comparison

the ease of developing in one code base compared to another

Page 5: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Separation of ConcernsReadabilityLess complexityHigher cohesionLower coupling

Page 6: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Isolate the ugly stuff (infrastructure)    Db-access    Active Directory    Web services    Configuration files

Page 7: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Not isolated

Page 8: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

InterfaceRefers to a set of named operations that can be

invoked by clients

Page 9: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin
Page 10: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

public class OrderManager{

public void ProcessOrder(Order order){

OrderRepository orderRepository = new OrderRepository();orderRepository.ProcessOrder(order);

}}

public class OrderManager{

public void ProcessOrder(Order order){

IOrderRepository orderRepository = new OrderRepository();orderRepository.ProcessOrder(order);

}}

Page 11: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

public void ProcessOrderAgainstService(Order order){

IOrderRepository orderRepository = new OrderService();orderRepository.ProcessOrder(order);

}

public void ProcessOrder(Order order){

IOrderRepository orderRepository = new OrderRepository();orderRepository.ProcessOrder(order);

}

Page 12: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Dependency Injection (DI)

Instead of a class creating its own dependencies,

its dependencies are inserted into it.

Page 13: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin
Page 14: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Business LayerData Layer Interface

Data Layer

Service Layer

Page 15: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

MockingUse mock object as placeholders for classes

that don’t yet existDon’t mock chatty interfacesFake objects with return and pre-canned

values

Page 16: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Small Tests Before Big TestsSmall focused test will tell you where

something is wrongFast and accurate feedback loopsBoth big (end to end) and small test are

important

Page 17: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

The Gateway PatternEncapsulate access to external services by

encapsulating the implementation with interfaces

Object that encapsulates external system

Page 18: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

Questions

Page 19: Magnus Härlin magnus.harlin@iptor.com @MagnusHarlin

The big picture - ConclusionTestable system will change your design. There are times when a design decision is

made only to enable testingTestability goes hand in hand with classical

definition of good design - high cohesion, low coupling and separation of concerns

Design for testability gives you maintainability