Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

iOS Unit Testing Like a Boss


Published on

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.

Published in: Technology
  • Be the first to comment

iOS Unit Testing Like a Boss

  1. 1. iOS Unit Testing Like a Boss Matt Darnall, Salesforce @mdarnall
  2. 2. Safe harbor Safe 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, 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 products, and utilization and selling to larger enterprise customers. Further information on potential factors that could affect the financial results of, 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., inc. assumes no obligation and does not intend to update these forward-looking statements.
  3. 3. Who Is this Guy?
  4. 4. 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 Thompson
  5. 5. “.. 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 Solano Nocilla Project
  6. 6. Testing doesn’t have to be an afterthought
  7. 7. Stand On The Shoulders Of Giants
  8. 8. Use tools that support developer efficiency and happiness
  9. 9. My Testing Tools ✓ Specta / Expecta ✓ OCMock ✓ OHHTTPStubs ✓ AppCode ✓ XCTool
  10. 10. Specta ✓ Fluent style similar to RSpec, Mocha, etc. ✓ Lightweight and easy to setup ✓ Asynchronous Testing
  11. 11. Expecta ✓ Similar to RSpec Matchers ✓ Easy to read ✓ Framework agnostic
  12. 12. OCMoc k ✓ ✓ ✓ ✓ Stubs Mocks Partial Mocks Protocol Mocks
  13. 13. AppCod e ✓ Refactorings ✓ Code analysis ✓ Better navigation of projects
  14. 14. XCTool ✓ Tool for builds and tests at the command line ✓ Better support for Continuous Integration
  15. 15. Find the tools that help you be productive and efficient
  16. 16. The Magic Tricks of Testing Sandi Metz Programmer, Author, Speaker
  17. 17. Good Tests Are ✓ Thorou gh ✓ Stable ✓ Fast
  18. 18. Focus on messages Incoming Object Under Test Sent To Self Outgoing
  19. 19. Message Types Queries: Return something, change nothing Commands: Return nothing, change something
  20. 20. Rule #1 Test incoming query messages by making assertions about what they send back
  21. 21. Rule #2 Test incoming command messages by making assertions about direct public side effects
  22. 22. Rule #3 Do not test private methods Do not make assertions about their result Do not expect to send them
  23. 23. Rule #4 Do not test outgoing query messages Do not make assertions about their result Do not expect to send them
  24. 24. Rule #5 Expect to send outgoing command messages
  25. 25. GitHub Trending Repositories
  26. 26. Magic Tricks Applied to iOS
  27. 27. Incoming Query Message numberOfRowsInSection: UITableViewDataSource cellForRowAtIndexPath: Incoming Queries make assertions about what is sent back
  28. 28. Incoming Command Message ViewController view Incoming Command make assertions about direct public side effects
  29. 29. Testing Outlets & 1 Actions 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.
  30. 30. Incoming Command & Outgoing Query viewWillAppear Incoming Command ViewController GithubSearchClient getTrendingRepositories Outgoing Query Incoming Query Do not test outgoing query messages Do not make assertions about their result Do not expect to send them
  31. 31. Stub the outgoing query message ViewController getTrendingRepositories Test Double Outgoing Query Stubs provide “canned” answers to calls made during the test
  32. 32. Dependency Injection initWithSearchClient ViewController ✓ Pass dependencies to initializer (aka Constructor Injection) ✓ Set dependencies with properties (aka Setter injection)
  33. 33. Outgoing Commands Model postNotification Outgoing Command Expect to send outgoing command messages NSNotificationCenter
  34. 34. Outgoing Commands ViewController addObserver Outgoing Command Expect to send outgoing command messages NSNotificationCenter
  35. 35. More! ✓ Follow on Chatter ✓ http://http://bit.ly // ✓ http:// ✓ Get Involved!
  36. 36. ✓ Thanks! Sandi Metz ✓ The maintainers of these awesome projects
  37. 37. Matt Darnall @mdarnall