+ All Categories
Home > Documents > Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13...

Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13...

Date post: 16-Oct-2020
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
48
Testing in iOS Paweł Dudek 1 Thursday, July 4, 13
Transcript
Page 1: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Testing in iOSPaweł Dudek

1

Thursday, July 4, 13

Page 2: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Why do we want to write tests?

2

Thursday, July 4, 13

Page 3: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Reasons for testing

• Striving for better software

• Faster development cycles

• Being “confident” about your code

• Leads to better, more modularized codebase

• Less code to write

3

Thursday, July 4, 13

Page 4: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Common misconceptions

4

Thursday, July 4, 13

Page 5: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Common misconceptions

• “It will take longer to write code” or “Time spent writing/refactoring tests is time lost”

• “It will take more time to modify existing system”

5

Thursday, July 4, 13

Page 6: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Reasons for testing

• Striving for better software

• Faster development cycles

• Being “confident” about your code

• Leads to better, more modularized codebase

• Less code to write

6

Thursday, July 4, 13

Page 7: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Am I going to write poor software if I don’t

do tests?

7

Thursday, July 4, 13

Page 8: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Are unit tests an invaluable tool for writing great software? Heck yes. Am I going to produce a poor product if I can’t unit test? Hell no.

Jonathan Rasmusson

8

Thursday, July 4, 13

Page 9: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Now that we know that writing tests is a

good idea...

9

Thursday, July 4, 13

Page 10: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

How can we do it?

10

Thursday, July 4, 13

Page 11: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

• You will feel confused

• You won’t know how to start

• You will need help

• Conclusion: it’s not easy to start

11

Warning

Thursday, July 4, 13

Page 12: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Tips

• Never think of tests as tests

• Think of a scenario, behavior, example

• Grab a mature project from github with tests included

• Find someone experienced and ask questions

12

Thursday, July 4, 13

Page 13: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Get on with it!How can we test?

13

Thursday, July 4, 13

Page 14: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

TDD

• Test Driven Development

• Red, Green, Refactor

• Write failing test first

• Fix it

• Refactor

14

Thursday, July 4, 13

Page 15: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

BDDBehavior Driven Development

15

Thursday, July 4, 13

Page 16: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

How does BDD differ from TDD?

16

Thursday, July 4, 13

Page 17: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

BDD builds upon TDD by formalising the good habits of the best TDD practitioners.

Matt Wynne,XP Evangelist

17

Thursday, July 4, 13

Page 18: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Good habits

18

• Work outside-in

• Use examples

• Use ubiquitous language

Thursday, July 4, 13

Page 19: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

A little bit of terminology...

19

Thursday, July 4, 13

Page 20: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Terminology

20

• Mocking (mocks & stubs)

• Expecting

• Matching

• Faking

Thursday, July 4, 13

Page 21: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Testing in iOS

21

Thursday, July 4, 13

Page 22: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Unit Tests

22

Thursday, July 4, 13

Page 23: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

OCUnit

23

• Oldest Mac testing framework - officially supported by Apple since 2005

• Integrated with XCode

• Built-in assertion macros

Thursday, July 4, 13

Page 24: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

OCUnit Syntax

• All test classes inherit from SenTestCase

• All tests begin with test

• Setup and teardown method

• Everything else is ignored by testing framework

• Means you can use as additional setup methods!

24

Thursday, July 4, 13

Page 25: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

-(void)testFullName { Person *person = [Person person]; person.firstName = @"Mariusz"; person.secondName = @"Testowniczek"; NSString *fullName = [person fullName]; NSString *expectedName = @"Mariusz Testowniczek"; STAssertTrue([fullName isEqualToString:expectedName], @"");}

25

OCUnit

Thursday, July 4, 13

Page 26: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Behavior “Tests”

26

Thursday, July 4, 13

Page 27: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Kiwi and Cedar

27

• Nearly the same syntax

• Built-in stubs/mocks

• Built-in matchers

Thursday, July 4, 13

Page 28: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

28

SPEC_BEGIN(PersonSpec)

describe(@"Person", ^{ __block Person *person;

beforeEach(^{ person = [[Person alloc] init]; person.firstName = @"Mariusz"; person.lastName = @"Fixture Last Name"; });

describe(@"full name", ^{

__block NSString *fullName;

beforeEach(^{ fullName = [person fullName]; });

it(@"should return the full name", ^{ expect(fullName).to(equal(@"Mariusz Testowniczek")); }); });});

SPEC_END

Kiwi and Cedar Syntax

Thursday, July 4, 13

Page 29: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

29

SPEC_BEGIN(PersonSpec)

describe(@"Person", ^{ __block Person *person;

beforeEach(^{ person = [[Person alloc] init]; person.firstName = @"Mariusz"; person.lastName = @"Fixture Last Name"; });

describe(@"full name", ^{

__block NSString *fullName;

beforeEach(^{ fullName = [person fullName]; });

it(@"should return the full name", ^{ expect(fullName).to(equal(@"Mariusz Testowniczek")); }); });});

SPEC_ENDThursday, July 4, 13

Page 30: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Example

30

Thursday, July 4, 13

Page 31: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

CedarTaptera Additions

31

Thursday, July 4, 13

Page 32: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

The action block

32

Thursday, July 4, 13

Page 33: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

The action block

33

• Syntax addition to previous blocks

• Executed after all beforeEach’s for given example are run

• Really useful when chaining behavior tests

Thursday, July 4, 13

Page 34: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

34

Describe

Describe

beforeEach

action

Describe

beforeEach

action

beforeEach

action

it

Thursday, July 4, 13

Page 35: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Example

35

Thursday, July 4, 13

Page 36: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Helper libraries

36

Thursday, July 4, 13

Page 37: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Helper libraries

37

• Mocking: OCMock, OCMockito, LRMockey

• Expecting: Expecta

• Matching: OCHamcrest

Thursday, July 4, 13

Page 38: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Most the presented libraries offer similar

functionalityIt all depends on syntax.

38

Thursday, July 4, 13

Page 39: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

iOS Testing Tips

39

Thursday, July 4, 13

Page 40: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Testing UI Layout

40

• Hard to maintain (as can change rapidly when GD goes on a rampage)

• Gives little value (quickly noticed by QA if something is off)

Thursday, July 4, 13

Page 41: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

System Singletons

41

• Makes hard to test if accessed directly

• Nice candidate for putting in a property

[UIDevice currentDevice][UIScreen mainScreen]

Thursday, July 4, 13

Page 42: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

UIViewController transitions

42

• Pushing new view controllers on nav controller stack or using transitions API

• Use helper class

• Tests - check if a given method was called on the helper class

Thursday, July 4, 13

Page 43: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Testing UIView animations

43

• Easiest way is to use the block-based API

• Helper class similar to transitions

• Tests - use fake to immediately call the animation block

Thursday, July 4, 13

Page 44: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Common caveats

44

• Don’t set mocks on [UIViewController view]

• Avoid using categories to override system properties or existing behavior

• Keychain and most of system objects are unavailable when tests are run from command line w/o simulator

• iOS 5.x Simulator is broken for NSProxy subclasses in weak properties

Thursday, July 4, 13

Page 45: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Things worth talking about but cut due to time limitations

45

• Frank / KIF - Application Tests

• Specta - yet another BDD style testing framework

• Dependency injection

Thursday, July 4, 13

Page 46: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Summary

46

Thursday, July 4, 13

Page 47: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Summary

• Testing is a great way to help developers

• Better codebase, faster iterations

• Invaluable for larger projects

47

Thursday, July 4, 13

Page 48: Testing in iOSmobile-warsaw.pl/files/dudek_tdd.pdfTesting in iOS Paweł Dudek 1 Thursday, July 4, 13 Why do we want to write tests? 2 Thursday, July 4, 13 Reasons for testing • Striving

Resources & Contact

@eldudi

github.com/paweldudek

[email protected]

Code Examples

Contact

48

Thursday, July 4, 13


Recommended