Learn Test Driven Development in Java
-
Upload
fluentsoftware -
Category
Technology
-
view
133 -
download
11
description
Transcript of Learn Test Driven Development in Java
Test Driven Developmentin Java
Wednesday, 14 November 12
About me!
Matthew Todd [email protected]
@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