learn test driven development in java

96
Test Driven Development in Java Wednesday, 14 November 12

Upload: fluentsoftware

Post on 27-Jan-2015

136 views

Category:

Technology


11 download

DESCRIPTION

This course provides everything you need to know to get started with test driven development in Java. NEW! Discount codes for the online course! If you like the look of these slides and would like to take the online course on Udemy, use discount code TDDSLIDES for a massive discount - https://www.udemy.com/learn-test-driven-development-in-java/?couponCode=TDDSLIDES This course covers test driven development from scratch, through video lectures, demonstrations of practising a test driven approach, and through exercises for you to complete, allowing you to gain valuable experience in using TDD. For more information on the course, please see http://www.udemy.com/learn-test-driven-development-in-java/ or http://www.fluentsoftware.co.uk/Courses

TRANSCRIPT

Page 1: Learn Test Driven Development in Java

Test Driven Developmentin Java

Wednesday, 14 November 12

Page 2: Learn Test Driven Development in Java

About me!

Matthew Todd [email protected]

@matthew_todd

Working with developers, continuously improving agile practice

Wednesday, 14 November 12

Page 3: Learn Test Driven Development in Java

What is TDD?

Wednesday, 14 November 12

Page 4: Learn Test Driven Development in Java

Testing timeline

1989: First tests on punchcards

1994: Kent Beck creates SUnit test framework

1995: TDD Demo

1999: Extreme programming explained published

2000: JUnit.org launched

Wednesday, 14 November 12

Page 5: Learn Test Driven Development in Java

Manifesto for Agile Software DevelopmentWe are uncovering better ways of developingsoftware by doing it and helping others do it.Through this work we have come to value:

Individuals and interactions over processes and tools

Working software over comprehensive documentationCustomer collaboration over contract negotiation

Responding to change over following a planThat is, while there is value in the items on

the right, we value the items on the left more

Wednesday, 14 November 12

Page 6: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 7: Learn Test Driven Development in Java

Test spectrum

Single function test

Full system test

Automated integration/acceptance

Unit test

Testing in concert

Component test

Wednesday, 14 November 12

Page 8: Learn Test Driven Development in Java

1. Write test

Wednesday, 14 November 12

Page 9: Learn Test Driven Development in Java

2. Test fails!

1. Write test

Wednesday, 14 November 12

Page 10: Learn Test Driven Development in Java

2. Test fails!

1. Write test

3. Write code

Wednesday, 14 November 12

Page 11: Learn Test Driven Development in Java

2. Test fails!

1. Write test

3. Write code

4. Test passes!

Wednesday, 14 November 12

Page 12: Learn Test Driven Development in Java

2. Test fails!

1. Write test

3. Write code

4. Test passes!

5. Refactor

Wednesday, 14 November 12

Page 13: Learn Test Driven Development in Java

2. Test fails!

1. Write test

3. Write code

4. Test passes!

5. Refactor

Wednesday, 14 November 12

Page 14: Learn Test Driven Development in Java

Why TDD?

Wednesday, 14 November 12

Page 15: Learn Test Driven Development in Java

Proactive VS Reactive

Seek out problems early on

Validate requirements

Validate code

Test late

Only respond to defects

Focused on debugging

Wednesday, 14 November 12

Page 16: Learn Test Driven Development in Java

Unit test Live system

Time

Cost

Relative cost of change

Wednesday, 14 November 12

Page 17: Learn Test Driven Development in Java

RequirementsDrive out requirements issues early

Wednesday, 14 November 12

Page 18: Learn Test Driven Development in Java

Rapid feedbackMany small changes VS One Big Change™

Wednesday, 14 November 12

Page 19: Learn Test Driven Development in Java

CollaborationEnables developers to work together

Wednesday, 14 November 12

Page 20: Learn Test Driven Development in Java

Values refactoringRefactor often to lower impact and risk

Wednesday, 14 November 12

Page 21: Learn Test Driven Development in Java

Design to testTesting driving good design practice

Wednesday, 14 November 12

Page 22: Learn Test Driven Development in Java

Tests as informationDocumenting decisions and assumptions

Wednesday, 14 November 12

Page 23: Learn Test Driven Development in Java

Sounds great!So show me

Wednesday, 14 November 12

Page 24: Learn Test Driven Development in Java

So, let’s get started

Wednesday, 14 November 12

Page 25: Learn Test Driven Development in Java

Reverse polish calculator3 4 +

Wednesday, 14 November 12

Page 26: Learn Test Driven Development in Java

Calculator walkthrough

Wednesday, 14 November 12

Page 27: Learn Test Driven Development in Java

Reverse polish calculatorDeveloped using a test driven approach

Wednesday, 14 November 12

Page 28: Learn Test Driven Development in Java

“sounds simple, but what about real applications?”

Wednesday, 14 November 12

Page 29: Learn Test Driven Development in Java

“sounds simple, but what about real applications?”

Wednesday, 14 November 12

Page 30: Learn Test Driven Development in Java

“sounds simple, but what about real applications?”

Wednesday, 14 November 12

Page 31: Learn Test Driven Development in Java

SOLID

Wednesday, 14 November 12

Page 32: Learn Test Driven Development in Java

Single responsibilityOLID

Wednesday, 14 November 12

Page 33: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 34: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 35: Learn Test Driven Development in Java

SOpen/ClosedLID

Wednesday, 14 November 12

Page 36: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 37: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 38: Learn Test Driven Development in Java

SOLiskov SubstitutionID

Wednesday, 14 November 12

Page 39: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 40: Learn Test Driven Development in Java

SOLInterface segregationD

Wednesday, 14 November 12

Page 41: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 42: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 43: Learn Test Driven Development in Java

SOLIDependency inversion

Wednesday, 14 November 12

Page 44: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 45: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 46: Learn Test Driven Development in Java

Isolating dependencies

Test target

Dependency

Test double

x

Test

Wednesday, 14 November 12

Page 47: Learn Test Driven Development in Java

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

Page 48: Learn Test Driven Development in Java

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

Page 49: Learn Test Driven Development in Java

Providing state-based verificationStubs

Wednesday, 14 November 12

Page 50: Learn Test Driven Development in Java

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

Page 51: Learn Test Driven Development in Java

FakesProviding simplified replacements

Wednesday, 14 November 12

Page 52: Learn Test Driven Development in Java

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

Page 53: Learn Test Driven Development in Java

MocksProviding behaviour based verification

Wednesday, 14 November 12

Page 54: Learn Test Driven Development in Java

Stubs Assertions made directly in test methodFakes

Mocks Assertions made by mock object

Wednesday, 14 November 12

Page 55: Learn Test Driven Development in Java

Test double demonstration

Wednesday, 14 November 12

Page 56: Learn Test Driven Development in Java

Mock frameworks

Wednesday, 14 November 12

Page 57: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 58: Learn Test Driven Development in Java

Wednesday, 14 November 12

Page 59: Learn Test Driven Development in Java

Test balanceConsider mock frameworks where appropriate

Wednesday, 14 November 12

Page 60: Learn Test Driven Development in Java

Dealing with the legacy

Wednesday, 14 November 12

Page 61: Learn Test Driven Development in Java

Dealing with the legacySomeone else’s code? No interfaces?

Code we cannot change

Wednesday, 14 November 12

Page 62: Learn Test Driven Development in Java

So, now we can test it!

Wednesday, 14 November 12

Page 63: Learn Test Driven Development in Java

So, now we can test it!What makes a good test?

Wednesday, 14 November 12

Page 64: Learn Test Driven Development in Java

Test principles

Wednesday, 14 November 12

Page 65: Learn Test Driven Development in Java

FIRST

Wednesday, 14 November 12

Page 66: Learn Test Driven Development in Java

FastIRST

Wednesday, 14 November 12

Page 67: Learn Test Driven Development in Java

FIndependentRST

Wednesday, 14 November 12

Page 68: Learn Test Driven Development in Java

FIRepeatableST

Wednesday, 14 November 12

Page 69: Learn Test Driven Development in Java

FIRSelf-validatingT

Wednesday, 14 November 12

Page 70: Learn Test Driven Development in Java

FIRSTimely

Wednesday, 14 November 12

Page 71: Learn Test Driven Development in Java

TDD Anti-patterns

Wednesday, 14 November 12

Page 72: Learn Test Driven Development in Java

Anti-pattern: the singleton

Wednesday, 14 November 12

Page 73: Learn Test Driven Development in Java

Anti-pattern: the singleton

Who uses this singleton?

Who owns this singleton?

What behaviours does it provide?

Wednesday, 14 November 12

Page 74: Learn Test Driven Development in Java

Anti-pattern: create the world

@Before public void initialiseTests() { loadBalancer = createMockLoadBalancingService(); server1 = createMockServer(); server2 = createMockServer(); loadBalancer.addServer(server1); loadBalancer.addServer(server2); dbEngine = new DBEngine(); dbEngine.addTable("users"); dbEngine.addTable("profiles"); dbEngine.addTable("posts"); userProfileService = new Mock<UserProfileServer>(); adminUser = new User("admin",true); user1 = new User("alice",false); user2 = new User("bob",false); userProfileService.register(user1); userProfileService.register(user2); user1.connectWith(user2); ...

Wednesday, 14 November 12

Page 75: Learn Test Driven Development in Java

Anti-pattern: create the world

Test burden increases over time

Test complexity increases

Often a sign of application complexity

Wednesday, 14 November 12

Page 76: Learn Test Driven Development in Java

Anti-pattern: completely mocked

@Test public void testingNothing() { MockServiceFactory factory = new MockServiceFactory(); Mock<UserService> userService = new Mock<UserService>(); factory.add(userService); User user = new User("bob"); userService.add(user); assertEquals("bob",userService.getUsers()[0].name()); }

Wednesday, 14 November 12

Page 77: Learn Test Driven Development in Java

Test boundariesClass(es) under test Out of test scope

Wednesday, 14 November 12

Page 78: Learn Test Driven Development in Java

Anti-pattern: exceptional test

@Test public void testUserCreation() { userService.createUser("bob"); }

Wednesday, 14 November 12

Page 79: Learn Test Driven Development in Java

Anti-pattern: exceptional test

Good coverage, but poor validation

@Test public void testUserCreation() { userService.createUser("bob"); }

Wednesday, 14 November 12

Page 80: Learn Test Driven Development in Java

Anti-pattern: usually passes

com.example.UncertainTest

com.example.UncertainTest

com.example.UncertainTest

com.example.UncertainTest

com.example.UncertainTest

Wednesday, 14 November 12

Page 81: Learn Test Driven Development in Java

Anti-pattern: usually passes

We need to be able to trust our tests

Control threading and access to resources

Wednesday, 14 November 12

Page 82: Learn Test Driven Development in Java

Anti-pattern: one big test

@Test public void testEverything() { userService.createUser("alice"); assertEquals(1,userService.getUserCount()); userService.createUser("alice"); assertEquals(1,userService.getUserCount()); userService.createUser("bob"); assertEquals(2,userService.getUserCount()); userService.dropUser("alice"); assertEquals(1,userService.getUserCount()); User bob = userService.getUser("bob"); assertNotNull(bob); ...

Wednesday, 14 November 12

Page 83: Learn Test Driven Development in Java

Anti-pattern: one big test

testEverything

testUserCreation

testCreatingDuplicateUser

testDroppingUser

Wednesday, 14 November 12

Page 84: Learn Test Driven Development in Java

Anti-pattern: the slow test

Wednesday, 14 November 12

Page 85: Learn Test Driven Development in Java

Anti-pattern: the slow test

Should be quick to pass

Should be quick to fail

Run frequently

Wednesday, 14 November 12

Page 86: Learn Test Driven Development in Java

Anti-pattern: second-class test

@Test public void whoKnowsWhatThisTests() { createTestObjects(); testUser.setName("alice"); setupTestDependencies(); User user2 = new User("user2"); setupUser(user2); testManager.add(testUser); ... test(user2); }

Wednesday, 14 November 12

Page 87: Learn Test Driven Development in Java

Applying TDD

Wednesday, 14 November 12

Page 88: Learn Test Driven Development in Java

When not to use TDD!

Wednesday, 14 November 12

Page 89: Learn Test Driven Development in Java

TDD

BDDIntegration testing

Design

Continuous delivery

Manual testing

User stories

Wednesday, 14 November 12

Page 90: Learn Test Driven Development in Java

Practice practice practice

Wednesday, 14 November 12

Page 91: Learn Test Driven Development in Java

TDD Kata

Wednesday, 14 November 12

Page 92: Learn Test Driven Development in Java

TDD Kata roman numerals1 - convert text from normal numerals ->

Roman numerals

2 - convert in the other direction too

Wednesday, 14 November 12

Page 93: Learn Test Driven Development in Java

TDD Kata FizzBuzz

printing numbers from 1 to 100

..but multiples of 3 should print Fizzmultiples of 5 should print Buzzmultiples of 3 and 5 print FizzBuzz

1 2 Fizz 4 Buzz Fizz 7 ...

Wednesday, 14 November 12

Page 94: Learn Test Driven Development in Java

TDD Kata roman calculatorcalculator only accepting roman numerals as

input and output

I + III = IV

Wednesday, 14 November 12

Page 95: Learn Test Driven Development in Java

TDD Kata tennisimplement simple tennis game

http://en.wikipedia.org/wiki/Tennis#Scoring

Wednesday, 14 November 12

Page 96: Learn Test Driven Development in Java

Thank you!

Wednesday, 14 November 12