tdd iphone for dummies

82

Post on 19-Oct-2014

4.275 views

Category:

Technology


1 download

DESCRIPTION

Everything you must know to start develop iPhone Applications in safe and fun way!

TRANSCRIPT

Page 1: Tdd iPhone For Dummies
Page 2: Tdd iPhone For Dummies

Does it work?

Page 3: Tdd iPhone For Dummies
Page 4: Tdd iPhone For Dummies

I’m not here to convince you

Page 5: Tdd iPhone For Dummies

Dry and easy to maintain

Page 6: Tdd iPhone For Dummies

Better form of documentation

Page 7: Tdd iPhone For Dummies

Protect

Page 8: Tdd iPhone For Dummies

Tdd?

Page 9: Tdd iPhone For Dummies

Test-driven development (TDD) is a software development technique that relies on the repetition of a very short development cycle

Tdd?

http://en.wikipedia.org/wiki/Test-driven_development

Page 10: Tdd iPhone For Dummies

first the developer writes a failing automated test case that defines a desired improvement or new function

Tdd?

http://en.wikipedia.org/wiki/Test-driven_development

Page 11: Tdd iPhone For Dummies

then produces code to pass that test

Tdd?

http://en.wikipedia.org/wiki/Test-driven_development

Page 12: Tdd iPhone For Dummies

and finally refactors the new code to acceptable standard

Tdd?

http://en.wikipedia.org/wiki/Test-driven_development

Page 13: Tdd iPhone For Dummies

Unit Tests?

A test is not a unit test if:

Michael Feathers

Page 14: Tdd iPhone For Dummies

Unit Tests?

It talks to a database

Michael Feathers

Page 15: Tdd iPhone For Dummies

Unit Tests?

It communicates across the network

Michael Feathers

Page 16: Tdd iPhone For Dummies

Unit Tests?

It touches the file system

Michael Feathers

Page 17: Tdd iPhone For Dummies

Unit Tests?

You have to do things to your environment to run it (eg, change config files)

Michael Feathers

Page 18: Tdd iPhone For Dummies

Unit Tests?

Tests that do this are integration tests

Michael Feathers

Page 19: Tdd iPhone For Dummies

Steps

Fixture Setup

Automatic Testing Lifecycle

Page 20: Tdd iPhone For Dummies

Steps

Fixture Setup

Exercise SUT

Automatic Testing Lifecycle

SUT

Page 21: Tdd iPhone For Dummies

Steps

Fixture Setup

Exercise SUT

Verify Result

Automatic Testing Lifecycle

SUT

Page 22: Tdd iPhone For Dummies

Steps

Fixture Setup

Exercise SUT

Verify Result

Fixture TearDown

Automatic Testing Lifecycle

Page 23: Tdd iPhone For Dummies

What about iPhone Dev?

Page 24: Tdd iPhone For Dummies

Unit Testing for iPhone

Page 25: Tdd iPhone For Dummies

OCUnit

Former SenTestingKit

Page 26: Tdd iPhone For Dummies

#import <SenTestingKit/SenTestingKit.h>#import "RpnCalculator.h"

@interface RpnCalculatorTestCase : SenTestCase {! RpnCalculator* rpnCalculator;}

@end

TestCase definition

Page 27: Tdd iPhone For Dummies

#import <SenTestingKit/SenTestingKit.h>#import "RpnCalculator.h"

@interface RpnCalculatorTestCase : SenTestCase {! RpnCalculator* rpnCalculator;}

@end

TestCase definition

Page 28: Tdd iPhone For Dummies

@implementation RpnCalculatorTestCase

-(void)setUp{! rpnCalculator = [[RpnCalculator alloc]init];}

-(void)testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{! [rpnCalculator put:@"1"];! [rpnCalculator put:@"enter"];! [rpnCalculator put:@"2"];!!! STAssertEqualObjects(@"1\n2",rpnCalculator.display,nil);}

-(void)tearDown{ [rpnCalculator release];}

TestCase Implementation

Page 29: Tdd iPhone For Dummies

@implementation RpnCalculatorTestCase

-(void)setUp{! rpnCalculator = [[RpnCalculator alloc]init];}

-(void)testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{! [rpnCalculator put:@"1"];! [rpnCalculator put:@"enter"];! [rpnCalculator put:@"2"];!!! STAssertEqualObjects(@"1\n2",rpnCalculator.display,nil);}

-(void)tearDown{ [rpnCalculator release];}

Fixture Setup

Page 30: Tdd iPhone For Dummies

@implementation RpnCalculatorTestCase

-(void)setUp{! rpnCalculator = [[RpnCalculator alloc]init];}

-(void)testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{! [rpnCalculator put:@"1"];! [rpnCalculator put:@"enter"];! [rpnCalculator put:@"2"];!!! STAssertEqualObjects(@"1\n2",rpnCalculator.display,nil);}

-(void)tearDown{ [rpnCalculator release];}

Exercise SUT

Page 31: Tdd iPhone For Dummies

@implementation RpnCalculatorTestCase

-(void)setUp{! rpnCalculator = [[RpnCalculator alloc]init];}

-(void)testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{! [rpnCalculator put:@"1"];! [rpnCalculator put:@"enter"];! [rpnCalculator put:@"2"];!!! STAssertEqualObjects(@"1\n2",rpnCalculator.display,nil);}

-(void)tearDown{ [rpnCalculator release];}

Verify Result

Page 32: Tdd iPhone For Dummies

@implementation RpnCalculatorTestCase

-(void)setUp{! rpnCalculator = [[RpnCalculator alloc]init];}

-(void)testShouldDisplayTwoNumbersWhenNumbersAreSeparatedByEnter{! [rpnCalculator put:@"1"];! [rpnCalculator put:@"enter"];! [rpnCalculator put:@"2"];!!! STAssertEqualObjects(@"1\n2",rpnCalculator.display,nil);}

-(void)tearDown{ [rpnCalculator release];}

Fixture Teardown

Page 33: Tdd iPhone For Dummies

#define STAssertNil(a1, description, ...)#define STAssertNotNil(a1, description, ...)#define STAssertTrue(expression, description, ...)#define STAssertFalse(expression, description, ...)#define STAssertEqualObjects(a1, a2, description, ...)#define STAssertEquals(a1, a2, description, ...)#define STFail(description, ...)#define STAssertTrueNoThrow(expression, description, ...)#define STAssertFalseNoThrow(expression, description, ...)

//....

Assertions

Page 34: Tdd iPhone For Dummies

Xcode integration

Page 35: Tdd iPhone For Dummies

Xcode integration

Page 36: Tdd iPhone For Dummies

Presentation separate from logic

Page 37: Tdd iPhone For Dummies

Presentation separate from logic

Page 38: Tdd iPhone For Dummies

Presentation

Page 39: Tdd iPhone For Dummies

Logic

Page 40: Tdd iPhone For Dummies

Test

Page 41: Tdd iPhone For Dummies

Xcode integration

Page 42: Tdd iPhone For Dummies

Xcode integration

Page 43: Tdd iPhone For Dummies

What if I have to access network...

Page 44: Tdd iPhone For Dummies

Or I have correlated components..

Page 45: Tdd iPhone For Dummies

Mock it!

Page 46: Tdd iPhone For Dummies

Mock it!

[ . . . ] mock objects are simulated objects that mimic the behavior of real objects in controlled ways

Page 47: Tdd iPhone For Dummies

OCMock

http://www.mulle-kybernetik.com/software/OCMock/

Page 48: Tdd iPhone For Dummies

Stubs vs Mocks

Stubs

Mocks

Page 49: Tdd iPhone For Dummies

- (void)testReturnsStubbedReturnValue{! mock = [OCMockObject mockForClass:[NSString class]];

[[[mock stub] andReturn:@"megamock"] lowercaseString]; id returnValue = [mock lowercaseString];! STAssertEqualObjects(@"megamock", returnValue, nil); }

Stub

Page 50: Tdd iPhone For Dummies

SOAPMessage

XMLString

SOAPChannel

post

SOAPClient

send

Collaboration

Page 51: Tdd iPhone For Dummies

SOAPMessage

XMLString

SOAPChannel

post

SOAPClient

send

Collaboration

Page 52: Tdd iPhone For Dummies

SOAPMessage

XMLString

SOAPChannel

post

SOAPClient

send

Collaboration

Page 53: Tdd iPhone For Dummies

static const NSString * RawSOAPMessage = @"<ENV:evn xmlns:ENV="http://www.w3.org/....

- (void)testClientShouldSendMessage{! id msgMock = [OCMockObject mockForClass:[SOAPMessage class]];! [[[msgMock expect] andReturn:RawSOAPMessage] XMLString];

! id channelMock = [OCMockObject mockForClass:[SOAPChannel class]];! [[[channelMock expect] andReturn:TRUE] send];

! SOAPClient *client = [SOAPClient initWith:channelMock];!! [client sendMessage:msgMock];

! [msgMock verify];! [channelMock verify];}

Mock

Page 54: Tdd iPhone For Dummies

static const NSString * RawSOAPMessage = @"<ENV:evn xmlns:ENV="http://www.w3.org/....

- (void)testClientShouldSendMessage{! id msgMock = [OCMockObject mockForClass:[SOAPMessage class]];! [[[msgMock expect] andReturn:RawSOAPMessage] XMLString];

! id channelMock = [OCMockObject mockForClass:[SOAPChannel class]];! [[[channelMock expect] andReturn:TRUE] send];

! SOAPClient *client = [SOAPClient initWith:channelMock];!! [client sendMessage:msgMock];

! [msgMock verify];! [channelMock verify];}

Mockery

Page 55: Tdd iPhone For Dummies

static const NSString * RawSOAPMessage = @"<ENV:evn xmlns:ENV="http://www.w3.org/....

- (void)testClientShouldSendMessage{! id msgMock = [OCMockObject mockForClass:[SOAPMessage class]];! [[[msgMock expect] andReturn:RawSOAPMessage] XMLString];

! id channelMock = [OCMockObject mockForClass:[SOAPChannel class]];! [[[channelMock expect] andReturn:TRUE] send];

! SOAPClient *client = [SOAPClient initWith:channelMock];!! [client sendMessage:msgMock];

! [msgMock verify];! [channelMock verify];}

Exercise SUT

Page 56: Tdd iPhone For Dummies

static const NSString * RawSOAPMessage = @"<ENV:evn xmlns:ENV="http://www.w3.org/....

- (void)testClientShouldSendMessage{! id msgMock = [OCMockObject mockForClass:[SOAPMessage class]];! [[[msgMock expect] andReturn:RawSOAPMessage] XMLString];

! id channelMock = [OCMockObject mockForClass:[SOAPChannel class]];! [[[channelMock expect] andReturn:TRUE] send];

! SOAPClient *client = [SOAPClient initWith:channelMock];!! [client sendMessage:msgMock];

! [msgMock verify];! [channelMock verify];}

Verify

Page 57: Tdd iPhone For Dummies

What’s wrong with Unit Testing?

Page 58: Tdd iPhone For Dummies

TEST

Page 59: Tdd iPhone For Dummies

Tdd isn’t about tests, but about behaviors and specifications

Page 60: Tdd iPhone For Dummies

A spoonful of syntactic sugar...

Page 61: Tdd iPhone For Dummies

A spoonful of syntactic sugar...

Behavior Driven Development

Page 62: Tdd iPhone For Dummies

should insted of testmatchers instead of Assert

Page 63: Tdd iPhone For Dummies

Bdd framework for iPhone Dev...

Page 64: Tdd iPhone For Dummies

Bdd framework for iPhone Dev...

Page 65: Tdd iPhone For Dummies

-(void)before {! [SpecHelper loginAsAdmin];}

-(void)itShouldAddAUser {! [app.navigationButton touch];! [[app.textField.with placeholder:@"First Name"] setText:@"Brian"];! [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"];! [[app.textField.with placeholder:@"Email"] setText:@"[email protected]"];! [[app.textField placeholder:@"Username"] setText:@"bkuser"];! [[app.textField placeholder:@"Password"] setText:@"test"];! [[app.textField placeholder:@"Confirm"] setText:@"test"];! [[app.navigationButton.label text:@"Save"] touch];

! [app timeout:1].alertView.should.not.exist;! [[app.tableView.label text:@"Brian Knorr"] should].exist;}

-(void)after {! [SpecHelper logout];}

Spec Example

Page 66: Tdd iPhone For Dummies

-(void)before {! [SpecHelper loginAsAdmin];}

-(void)itShouldAddAUser {! [app.navigationButton touch];! [[app.textField.with placeholder:@"First Name"] setText:@"Brian"];! [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"];! [[app.textField.with placeholder:@"Email"] setText:@"[email protected]"];! [[app.textField placeholder:@"Username"] setText:@"bkuser"];! [[app.textField placeholder:@"Password"] setText:@"test"];! [[app.textField placeholder:@"Confirm"] setText:@"test"];! [[app.navigationButton.label text:@"Save"] touch];

! [app timeout:1].alertView.should.not.exist;! [[app.tableView.label text:@"Brian Knorr"] should].exist;}

-(void)after {! [SpecHelper logout];}

Fixture Setup

Page 67: Tdd iPhone For Dummies

-(void)before {! [SpecHelper loginAsAdmin];}

-(void)itShouldAddAUser {! [app.navigationButton touch];! [[app.textField.with placeholder:@"First Name"] setText:@"Brian"];! [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"];! [[app.textField.with placeholder:@"Email"] setText:@"[email protected]"];! [[app.textField placeholder:@"Username"] setText:@"bkuser"];! [[app.textField placeholder:@"Password"] setText:@"test"];! [[app.textField placeholder:@"Confirm"] setText:@"test"];! [[app.navigationButton.label text:@"Save"] touch];

! [app timeout:1].alertView.should.not.exist;! [[app.tableView.label text:@"Brian Knorr"] should].exist;}

-(void)after {! [SpecHelper logout];}

Exercise SUT

Page 68: Tdd iPhone For Dummies

-(void)before {! [SpecHelper loginAsAdmin];}

-(void)itShouldAddAUser {! [app.navigationButton touch];! [[app.textField.with placeholder:@"First Name"] setText:@"Brian"];! [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"];! [[app.textField.with placeholder:@"Email"] setText:@"[email protected]"];! [[app.textField placeholder:@"Username"] setText:@"bkuser"];! [[app.textField placeholder:@"Password"] setText:@"test"];! [[app.textField placeholder:@"Confirm"] setText:@"test"];! [[app.navigationButton.label text:@"Save"] touch];

! [app timeout:1].alertView.should.not.exist;! [[app.tableView.label text:@"Brian Knorr"] should].exist;}

-(void)after {! [SpecHelper logout];}

Verify Result

Page 69: Tdd iPhone For Dummies

-(void)before {! [SpecHelper loginAsAdmin];}

-(void)itShouldAddAUser {! [app.navigationButton touch];! [[app.textField.with placeholder:@"First Name"] setText:@"Brian"];! [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"];! [[app.textField.with placeholder:@"Email"] setText:@"[email protected]"];! [[app.textField placeholder:@"Username"] setText:@"bkuser"];! [[app.textField placeholder:@"Password"] setText:@"test"];! [[app.textField placeholder:@"Confirm"] setText:@"test"];! [[app.navigationButton.label text:@"Save"] touch];

! [app timeout:1].alertView.should.not.exist;! [[app.tableView.label text:@"Brian Knorr"] should].exist;}

-(void)after {! [SpecHelper logout];}

Fixture Teardown

Page 70: Tdd iPhone For Dummies

Run On Simulator

Page 71: Tdd iPhone For Dummies

No XCode Integration Yet

Page 72: Tdd iPhone For Dummies

Conclusions

Page 73: Tdd iPhone For Dummies

The Market Asks For Apps

Page 74: Tdd iPhone For Dummies

More Apps...

Page 75: Tdd iPhone For Dummies

More Apps...

Page 76: Tdd iPhone For Dummies

More Apps!

Page 77: Tdd iPhone For Dummies

Lot to Improve

Page 78: Tdd iPhone For Dummies

Be Good Kids:

Page 79: Tdd iPhone For Dummies

Test First!

Page 80: Tdd iPhone For Dummies
Page 82: Tdd iPhone For Dummies

Questions?