controlling dependencies 16-9 - quality coding• the art of unit testing by roy osherove resources...

47
Jon Reid Test Driven Development …by Controlling Dependencies http://www.flickr.com/photos/stefan-w/3337072853

Upload: others

Post on 11-Apr-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Jon Reid

Test Driven Development

…by Controlling Dependencies

http://www.flickr.com/photos/stefan-w/3337072853

Page 2: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Write a failing test

Make the test pass

Refactor

Page 3: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

UI?Networking?

Page 4: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

UI!Networking!

Page 5: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

http://www.flickr.com/photos/jsmoorman/2298671281

3 Types ofUnit Tests:

Return Value Test

State Test

Interaction Test

Page 6: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Return Value Test

Arrange: Set up object

Act: Call method that returns a value

Assert: Compare against expected value

call method

Test SUTvalueSystemUnderTest

Page 7: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

State Test

Arrange: Set up object

Act: Call method

Assert: Query object in some way

Test SUT

call method

result

query

Page 8: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Interaction Test

Test SUT SomethingElse!

? ?

Page 9: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Interaction Test

Table

GetDishes

Waiter Cook

ProcessOrder

Page 10: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Interaction Test

Table

GetDishes

Waiter Cook

ProcessOrderFakeCook

Page 11: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

DependencyInjection

Table

GetDishes

Waiter Cook

ProcessOrderFakeCook

Page 12: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Dependency Injection

• Extract and Override

• Method Injection

• Property Injection

• Constructor Injection

http://www.flickr.com/photos/8499561@N02/2755481069

Page 13: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM
Page 14: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Seams

http://www.flickr.com/photos/gileslane/2262575575

Page 15: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Extract and Override

Page 16: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Extract and Override

Page 17: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Method Injection

Page 18: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Method Injection

Page 19: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Property Injection

Page 20: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Property Injection

Page 21: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Property Injection

Page 22: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Constructor Injection

Page 23: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Dependency Injection

• Extract and Override

• Method Injection

• Property Injection

• Constructor Injection

• Ambient Context

http://www.flickr.com/photos/8499561@N02/2755481069

Page 24: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Dependency Injection

M A N N I N G

Mark SeemannFOREWORD BY GLENN BLOCK

in .NET

Page 25: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Interaction Test

SUTRealThing

SUT FakeThing

Production

Testing?

Page 26: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Types of Fakes

M A N N I N G

the art of

with examples in C#

FOREWORDS BY

Michael FeathersRobert C. Martin

SECOND EDITION

ROY OSHEROVE

Page 27: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Stub

Test

SUT Stubcommunicate

assert

(Fake)

Page 28: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Mock

Test

SUT Mockcommunicate

assert

(Fake)

Page 29: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

“That’s great, Jon. …But how do I use this for networking?”

Page 30: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Networking Call

Inject dependency

Page 31: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Networking Call

Record number of calls

Page 32: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Networking Call

Fake return value

Page 33: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Networking Call

Capture arguments

Page 34: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Make a Fake:1. Stub the method

Page 35: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Make a Fake:2. Record number of calls

Page 36: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Make a Fake:3. Fake return value

Page 37: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Make a Fake:4. Capture arguments

Page 38: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Write a Test (1):Does it call GET exactly once?

1. Arrange

2. Act

3. Assert

Page 39: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Write a Test (2):Simulate a JSON Response!

1. Arrange

2. Act

3. Assert

Page 40: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Refactor Test Code:Spot Duplication

Page 41: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Refactor Test Code:Move Variables into Test Fixture

Page 42: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Refactor Test Code:Use Test Fixture

Page 43: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Refactor Test Code:Extract Helper Method

Refactor test code to express the scenario

Page 44: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Let’s Make a Fake

• Stub the method

• Record number of calls

• Fake return value

• Capture arguments

FakeCook

Page 45: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

Dependency Injection

• Extract and Override

• Method Injection

• Property Injection

• Constructor Injection

http://www.flickr.com/photos/8499561@N02/2755481069

Page 46: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

http://www.flickr.com/photos/jsmoorman/2298671281

3 Types ofUnit Tests:

Return Value Test

State Test

Interaction Test

Page 47: Controlling Dependencies 16-9 - Quality Coding• The Art of Unit Testing by Roy Osherove Resources Title Controlling Dependencies 16-9 Created Date 1/17/2016 3:17:06 AM

QualityCoding.org @qcoding

• Working Effectively with Legacy Code by Michael Feathers

• Dependency Injection in .NET by Mark Seemann

• The Art of Unit Testing by Roy Osherove

Resources