Practical Testing Tips - iOS Con London, May 2016

Practical Testing Tips - iOS Con London, May 2016

The London 2016 Edition of my smorgasboard of unit and UI testing tips. Links to sample code at the end of the presentation.

C4861b1dfdf3bbb21faec4a1acdf183d?s=128

Ellen Shapiro

May 26, 2016
Tweet

Transcript

  1. 1.

    PRACTICAL TESTING TIPS by Ellen Shapiro | ios con London

    2016 spothero.com | justhum.com | designatednerd.com | @designatednerd
  2. 18.
  3. 19.

    Core Data Demo Recap » When you see something that

    can cause a key piece of your app to break, test it. » When testing core data, test the NSInMemoryStoreType so you always have a clean database. » Version your databases!
  4. 29.

    Objective-C Mock Demo Recap » Make a fake thing »

    Tell it what to do » Pass it to the thing you want to test » Make sure the tested thing reacted properly
  5. 31.

    Swift Inline Class Verification func testThingDoesStuff() { class MockThing :

    Thing { var methodUnderTestWasCalled = false override func methodUnderTest() { //Don't call super! methodUnderTestWasCalled = true } } let testThing = MockThing() testThing.doSomethingThatShouldCallMethodUnderTest() XCTAssertTrue(testThing.methodUnderTestWasCalled) }
  6. 32.

    Swift Inline Class Stubs/Spies func testThingDoesStuff() { class StubbedThing :

    Thing { override func methodBeingStubbed() -> String { //Don't call super! return "A Known String!" } } let stub = StubbedThing() let tested = ObjectUnderTest() objectUnderTest.thing = stubbed let result = tested.doSomethingThatEventuallyCallsMethodBeingStubbed() XCTAssertTrue(result == "A Known String!") }
  7. 36.
  8. 37.

    HTTP/1.1 200 OK Server: nginx/1.4.6 (Ubuntu) Date: Wed, 12 Nov

    2014 22:10:40 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Vary: Accept X-Frame-Options: SAMEORIGIN Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS { "default": true, "expiration_month": "10", "expiration_year": "2018", "last_4": "1234", "card_type": "MasterCard", "id": 2 }
  9. 39.

    #import "VOKMockURLProtocol.h" @implementation CLTAPIClient (MockData) - (void)setShouldUseMockData:(BOOL)shouldUseMockData { Class mockURLProtocol

    = [VOKMockUrlProtocol class]; NSMutableArray *currentProtocolClasses = [self.sessionConfiguration.protocolClasses mutableCopy]; if (shouldUseMockData) { [currentProtocolClasses insertObject:mockURLProtocol atIndex:0]; } else { [currentProtocolClasses removeObject:mockURLProtocol]; } self.sessionConfiguration.protocolClasses = currentProtocolClasses; } @end
  10. 53.
  11. 54.
  12. 55.
  13. 56.
  14. 59.

    The most useless test I ever inherited: [Note: class prefixes

    have been changed to protect the guilty]
  15. 78.
  16. 81.

    BDD Demo Recap: » Use very descriptive test names. »

    Test the end result, not necessarily how you got there. » Use the XCTest methods you already know. » Use comments if you need the structure of given/ when/then.
  17. 84.

    KIF

  18. 86.

    Kif Pros » Write your UI tests in Objective C!

    » Uses Accessibility, so you make your app accessible in the bargain » Get to the bit you need to test » The most widely used library » Very backwards compatible
  19. 87.

    Kif Cons » Slow (can be sped up now!) »

    Can be flaky on CI servers » Some folks have had issues with lookup changing the view hierarchy » Very backwards compatible
  20. 90.
  21. 91.

    !

  22. 92.
  23. 93.
  24. 94.

    UI Testing Recap » If you're swapping out your app

    delegate for tests, make sure you put it back for UI tests » Centralize your localized strings in a convenience class to make strings easier to test » UI and non-UI tests should be separate targets » Add -AppleLanguages "\(en\)" arguments to the test bit of your application's scheme » Duplicate your scheme and update for every language you support
  25. 102.

    Official Summary Slide™ » Testing lets you refactor confidently »

    Testing helps you find out immediately when you broke something so it's easier to fix. » Test as much as you can, however much that is. » Find the testing ideology that works best for you. » UI Testing can give you a great opportunity to see how all the pieces of your app work together. » Have both humans and robots test your app.
  26. 103.
  27. 104.

    Things from me or my former employer! #humblebrag » https://github.com/designatednerd/

    TestingPlayground » https://github.com/designatednerd/FlickrSearcher » https://github.com/designatednerd/ DNSiOSLocalizationTestHelpers » https://github.com/vokal/VOKMockUrlProtocol » https://github.com/vokal/Mocktrofit
  28. 105.

    Mocking tools! » http://ocmock.org/ » https://github.com/jonreid/OCMockito UI Testing Tools! »

    https://github.com/kif-framework/KIF » https://github.com/Raizlabs/FRY
  29. 106.
  30. 107.

    BDD Tools! » https://github.com/specta/specta » https://github.com/kiwi-bdd/Kiwi » https://github.com/pivotal/cedar Other Things

    I Mentioned! » http://ntoll.org/article/tdd-cargo-cult » http://qualitycoding.org/app-delegate-for-tests/
  31. 108.

    Photo Credits » Angry mob by Robert Course-Baker: https:// www.flickr.com/photos/29233640@N07/3645211083

    » Robot by Logan Ingalls: https://www.flickr.com/ photos/plutor/847695350 » Lock ("Hodgepodged") by David Goehring https:// www.flickr.com/photos/carbonnyc/4740626368/ » All images of Kif from Futurama used without permission. Sorry, Fox.