learn test driven development in java

Post on 27-Jan-2015

136 Views

Category:

Technology

11 Downloads

Preview:

Click to see full reader

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

Test Driven Developmentin Java

Wednesday, 14 November 12

About me!

Matthew Todd matthew.todd@fluentsoftware.co.uk

@matthew_todd

Working with developers, continuously improving agile practice

Wednesday, 14 November 12

What is TDD?

Wednesday, 14 November 12

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

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

Wednesday, 14 November 12

Test spectrum

Single function test

Full system test

Automated integration/acceptance

Unit test

Testing in concert

Component test

Wednesday, 14 November 12

1. Write test

Wednesday, 14 November 12

2. Test fails!

1. Write test

Wednesday, 14 November 12

2. Test fails!

1. Write test

3. Write code

Wednesday, 14 November 12

2. Test fails!

1. Write test

3. Write code

4. Test passes!

Wednesday, 14 November 12

2. Test fails!

1. Write test

3. Write code

4. Test passes!

5. Refactor

Wednesday, 14 November 12

2. Test fails!

1. Write test

3. Write code

4. Test passes!

5. Refactor

Wednesday, 14 November 12

Why TDD?

Wednesday, 14 November 12

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

Unit test Live system

Time

Cost

Relative cost of change

Wednesday, 14 November 12

RequirementsDrive out requirements issues early

Wednesday, 14 November 12

Rapid feedbackMany small changes VS One Big Change™

Wednesday, 14 November 12

CollaborationEnables developers to work together

Wednesday, 14 November 12

Values refactoringRefactor often to lower impact and risk

Wednesday, 14 November 12

Design to testTesting driving good design practice

Wednesday, 14 November 12

Tests as informationDocumenting decisions and assumptions

Wednesday, 14 November 12

Sounds great!So show me

Wednesday, 14 November 12

So, let’s get started

Wednesday, 14 November 12

Reverse polish calculator3 4 +

Wednesday, 14 November 12

Calculator walkthrough

Wednesday, 14 November 12

Reverse polish calculatorDeveloped using a test driven approach

Wednesday, 14 November 12

“sounds simple, but what about real applications?”

Wednesday, 14 November 12

“sounds simple, but what about real applications?”

Wednesday, 14 November 12

“sounds simple, but what about real applications?”

Wednesday, 14 November 12

SOLID

Wednesday, 14 November 12

Single responsibilityOLID

Wednesday, 14 November 12

Wednesday, 14 November 12

Wednesday, 14 November 12

SOpen/ClosedLID

Wednesday, 14 November 12

Wednesday, 14 November 12

Wednesday, 14 November 12

SOLiskov SubstitutionID

Wednesday, 14 November 12

Wednesday, 14 November 12

SOLInterface segregationD

Wednesday, 14 November 12

Wednesday, 14 November 12

Wednesday, 14 November 12

SOLIDependency inversion

Wednesday, 14 November 12

Wednesday, 14 November 12

Wednesday, 14 November 12

Isolating dependencies

Test target

Dependency

Test double

x

Test

Wednesday, 14 November 12

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

Providing state-based verificationStubs

Wednesday, 14 November 12

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

FakesProviding simplified replacements

Wednesday, 14 November 12

Test DoublesFakes MocksStubs

Wednesday, 14 November 12

MocksProviding behaviour based verification

Wednesday, 14 November 12

Stubs Assertions made directly in test methodFakes

Mocks Assertions made by mock object

Wednesday, 14 November 12

Test double demonstration

Wednesday, 14 November 12

Mock frameworks

Wednesday, 14 November 12

Wednesday, 14 November 12

Wednesday, 14 November 12

Test balanceConsider mock frameworks where appropriate

Wednesday, 14 November 12

Dealing with the legacy

Wednesday, 14 November 12

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

Code we cannot change

Wednesday, 14 November 12

So, now we can test it!

Wednesday, 14 November 12

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

Wednesday, 14 November 12

Test principles

Wednesday, 14 November 12

FIRST

Wednesday, 14 November 12

FastIRST

Wednesday, 14 November 12

FIndependentRST

Wednesday, 14 November 12

FIRepeatableST

Wednesday, 14 November 12

FIRSelf-validatingT

Wednesday, 14 November 12

FIRSTimely

Wednesday, 14 November 12

TDD Anti-patterns

Wednesday, 14 November 12

Anti-pattern: the singleton

Wednesday, 14 November 12

Anti-pattern: the singleton

Who uses this singleton?

Who owns this singleton?

What behaviours does it provide?

Wednesday, 14 November 12

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

Anti-pattern: create the world

Test burden increases over time

Test complexity increases

Often a sign of application complexity

Wednesday, 14 November 12

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

Test boundariesClass(es) under test Out of test scope

Wednesday, 14 November 12

Anti-pattern: exceptional test

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

Wednesday, 14 November 12

Anti-pattern: exceptional test

Good coverage, but poor validation

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

Wednesday, 14 November 12

Anti-pattern: usually passes

com.example.UncertainTest

com.example.UncertainTest

com.example.UncertainTest

com.example.UncertainTest

com.example.UncertainTest

Wednesday, 14 November 12

Anti-pattern: usually passes

We need to be able to trust our tests

Control threading and access to resources

Wednesday, 14 November 12

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

Anti-pattern: one big test

testEverything

testUserCreation

testCreatingDuplicateUser

testDroppingUser

Wednesday, 14 November 12

Anti-pattern: the slow test

Wednesday, 14 November 12

Anti-pattern: the slow test

Should be quick to pass

Should be quick to fail

Run frequently

Wednesday, 14 November 12

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

Applying TDD

Wednesday, 14 November 12

When not to use TDD!

Wednesday, 14 November 12

TDD

BDDIntegration testing

Design

Continuous delivery

Manual testing

User stories

Wednesday, 14 November 12

Practice practice practice

Wednesday, 14 November 12

TDD Kata

Wednesday, 14 November 12

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

Roman numerals

2 - convert in the other direction too

Wednesday, 14 November 12

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

TDD Kata roman calculatorcalculator only accepting roman numerals as

input and output

I + III = IV

Wednesday, 14 November 12

TDD Kata tennisimplement simple tennis game

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

Wednesday, 14 November 12

Thank you!

Wednesday, 14 November 12

top related