44
iOS Unit Testing Like a Boss Matt Darnall, Salesforce @mdarnall

iOS Unit Testing Like a Boss

Embed Size (px)

DESCRIPTION

Make testing easier and more productive by applying test-driven development strategies to the world of iOS and Objective-C. Join us to learn about the tools that are available, and hear strategies for writing more testable code and robust tests. You'll be ready to take the next step and integrate these strategies into your daily workflow.

Citation preview

Page 1: iOS Unit Testing Like a Boss

iOS Unit Testing Like a Boss

Matt Darnall, Salesforce@mdarnall

Page 2: iOS Unit Testing Like a Boss

Safe harborSafe harbor statement under the Private Securities Litigation Reform Act of 1995: This presentation may contain forward-looking statements that involve risks, uncertainties, and assumptions. If any such uncertainties materialize or if any of the assumptions proves incorrect, the results of salesforce.com, inc. could differ materially from the results expressed or implied by the forward-looking statements we make. All statements other than statements of historical fact could be deemed forward-looking, including any projections of product or service availability, subscriber growth, earnings, revenues, or other financial items and any statements regarding strategies or plans of management for future operations, statements of belief, any statements concerning new, planned, or upgraded services or technology developments and customer contracts or use of our services. The risks and uncertainties referred to above include – but are not limited to – risks associated with developing and delivering new functionality for our service, new products and services, our new business model, our past operating losses, possible fluctuations in our operating results and rate of growth, interruptions or delays in our Web hosting, breach of our security measures, the outcome of any litigation, risks associated with completed and any possible mergers and acquisitions, the immature market in which we operate, our relatively limited operating history, our ability to expand, retain, and motivate our employees and manage our growth, new releases of our service and successful customer deployment, our limited history reselling non-salesforce.com products, and utilization and selling to larger enterprise customers. Further information on potential factors that could affect the financial results of salesforce.com, inc. is included in our annual report on Form 10-K for the most recent fiscal year and in our quarterly report on Form 10-Q for the most recent fiscal quarter. These documents and others containing important disclosures are available on the SEC Filings section of the Investor Information section of our Web site. Any unreleased services or features referenced in this or other presentations, press releases or public statements are not currently available and may not be delivered on time or at all. Customers who purchase our services should make the purchase decisions based upon features that are currently available. Salesforce.com, inc. assumes no obligation and does not intend to update these forward-looking statements.

Page 3: iOS Unit Testing Like a Boss

Who Is this Guy?

Page 4: iOS Unit Testing Like a Boss

Objective-C developers have, for the most part, remained relatively apathetic to Unit Testing ("There's that SenTest thing, but who uses that, really?").

-Matt ThompsonNSHipster.com

Page 5: iOS Unit Testing Like a Boss

“.. I don't think we have a problem with tools. We have a cultural problem that we need to fix, and that's something only we (you and me) can do something about. Go and spread the word”

-Luis SolanoNocilla Project

Page 6: iOS Unit Testing Like a Boss

Testing doesn’t have to be an afterthought

Page 7: iOS Unit Testing Like a Boss

Stand On TheShoulders Of

Giants

Page 8: iOS Unit Testing Like a Boss

Use tools that support developer efficiency

and happiness

Page 9: iOS Unit Testing Like a Boss

My Testing Tools

✓ Specta / Expecta

✓ OCMock✓ OHHTTPStubs✓ AppCode ✓ XCTool

Page 10: iOS Unit Testing Like a Boss

Specta ✓ Fluent style similar to RSpec, Mocha, etc.

✓ Lightweight and easy to setup

✓ Asynchronous Testing

Page 11: iOS Unit Testing Like a Boss

Expecta ✓ Similar to RSpec Matchers

✓ Easy to read✓ Framework

agnostic✓ Supports

custom matchers

Page 12: iOS Unit Testing Like a Boss

OCMock

✓ Stubs✓ Mocks✓ Partial Mocks✓ Protocol

Mocks

Page 13: iOS Unit Testing Like a Boss

AppCode

✓ Refactorings✓ Code analysis✓ Better

navigation of projects

Page 14: iOS Unit Testing Like a Boss

XCTool ✓ Tool for builds and tests at the command line

✓ Better support for Continuous Integration

Page 15: iOS Unit Testing Like a Boss

Find the tools thathelp you

be productive and efficient

Page 16: iOS Unit Testing Like a Boss

The Magic Tricks of TestingSandi Metz

Programmer, Author, Speaker

Page 17: iOS Unit Testing Like a Boss

Good Tests Are

✓ Thorou

gh

✓ Stable

✓ Fast

✓ Few

Page 18: iOS Unit Testing Like a Boss

Focus on messages

Object Under Test OutgoingIncoming

Sent To Self

Page 19: iOS Unit Testing Like a Boss

Message TypesQueries: Return something, change

nothing

Commands: Return nothing, change

something

Page 20: iOS Unit Testing Like a Boss
Page 21: iOS Unit Testing Like a Boss

Rule #1Test incoming query messages

by making assertions about what they send back

Page 22: iOS Unit Testing Like a Boss
Page 23: iOS Unit Testing Like a Boss

Rule #2Test incoming command

messagesby making assertions

about direct public side effects

Page 24: iOS Unit Testing Like a Boss
Page 25: iOS Unit Testing Like a Boss

Rule #3Do not test private methods

Do not make assertions about their result

Do not expect to send them

Page 26: iOS Unit Testing Like a Boss
Page 27: iOS Unit Testing Like a Boss

Rule #4Do not test outgoing query messagesDo not make assertions about their

resultDo not expect to send them

Page 28: iOS Unit Testing Like a Boss
Page 29: iOS Unit Testing Like a Boss

Rule #5Expect to send

outgoing command messages

Page 30: iOS Unit Testing Like a Boss
Page 31: iOS Unit Testing Like a Boss

GitHub Trending Repositories

Page 32: iOS Unit Testing Like a Boss

Magic Tricks Applied to iOS

Page 33: iOS Unit Testing Like a Boss

Incoming Query Message

make assertions about what is sent back

UITableViewDataSource

cellForRowAtIndexPath:

Incoming Queries

numberOfRowsInSection:

Page 34: iOS Unit Testing Like a Boss

Incoming Command Message

make assertions about direct public side

effects

ViewControllerview

Incoming Command

Page 35: iOS Unit Testing Like a Boss

Testing Outlets & Actions1 Test that outlets exist

2 Test that outlets contain actions back to

methods on the controller

3 Send the action command to the

ViewController and assert any public side

effects.

Page 36: iOS Unit Testing Like a Boss

Incoming Command & Outgoing Query

viewWillAppearViewController

getTrendingRepositoriesGithubSearchClient

Outgoing Query

Incoming Query

Do not test outgoing query messagesDo not make assertions about their result

Do not expect to send them

Incoming Command

Page 37: iOS Unit Testing Like a Boss

Stub the outgoing query message

ViewControllergetTrendingRepositories

Test Double

Stubs provide “canned” answers to calls made during the test

Outgoing Query

Page 38: iOS Unit Testing Like a Boss

Dependency Injection

ViewController

✓ Pass dependencies to initializer (aka Constructor

Injection)

✓ Set dependencies with properties (aka Setter

injection)

initWithSearchClient

Page 39: iOS Unit Testing Like a Boss

Outgoing Commands

Model postNotification NSNotificationCenter

Expect to send

outgoing command

messages

Outgoing Command

Page 40: iOS Unit Testing Like a Boss

Outgoing Commands

ViewController addObserver NSNotificationCenter

Expect to send

outgoing command

messages

Outgoing Command

Page 42: iOS Unit Testing Like a Boss

Thanks!✓ Sandi Metz

✓ The maintainers of these

awesome projects

Page 43: iOS Unit Testing Like a Boss

Matt Darnall@mdarnall

mdarnall.com

Page 44: iOS Unit Testing Like a Boss