Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Snapshot testing with FBSnapshotTestCase

Snapshot testing with FBSnapshotTestCase

Brief introduction to FBSnapshotTestCase. How to use it properly. And why you should do it. Talk for Cocoaheads Kyiv 2016/12/10

Ahmed Sulaiman

December 10, 2016
Tweet

More Decks by Ahmed Sulaiman

Other Decks in Programming

Transcript

  1. iPhone 6 – iOS 10.1 (23E233) FLAWLESS APP Real-time comparison

    of expected and implemented design. Built into iOS simulator.
  2. @ahmed_sulajman WHY Why you should use snapshot tests How to

    write snapshot tests Ques8ons and answers HOW Q&A
  3. @ahmed_sulajman WHY How to write snapshot tests HOW Q&A Why

    you should use snapshot tests Ques8ons and answers
  4. @ahmed_sulajman WHY How to write snapshot tests HOW Q&A Why

    you should use snapshot tests Ques8ons and answers
  5. @ahmed_sulajman HOW: CREATE SNAPSHOT TEST WRITE THE TEST Init View

    with needed condi5ons and verify it func testLoginButton() { let loginButton = LoginButton() loginButton.setTitle("Sign in", for: .normal) FBSnapshotVerifyView(view: loginButton) }
  6. @ahmed_sulajman HOW: CREATE SNAPSHOT TEST RECORD REFERENCES override func setUp()

    { super.setUp() recordMode = true } Record reference images of testable views
  7. @ahmed_sulajman HOW: CREATE SNAPSHOT TEST COMPARE RESULT Compare the difference

    between reference image and real view Reference Real Diff
  8. @ahmed_sulajman WHY How to write snapshot tests HOW Q&A Why

    you should use snapshot tests Ques8ons and answers
  9. @ahmed_sulajman Q&A: HOW TO DEAL WITH ANIMATION DRAW LAST STATE

    This method is smart enough to render the view’s final state UIView func drawHierarchy(in rect: CGRect, afterScreenUpdates afterUpdates: Bool) -> Bool
  10. @ahmed_sulajman Q&A: HOW TO DEAL WITH ANIMATIONS TURN OFF ANIMATION

    Rewrite components to have an ability to turn off anima:on at any :me UISwitch func setOn(_ on: Bool, animated: Bool)
  11. @ahmed_sulajman Q&A: HOW LONG IMAGE COMPARISON MAY TAKE AVERAGE =

    0.008s On a Macbook Air 2012 int memcmp(const void *ptr1, const void *ptr2, size_t num);
  12. @ahmed_sulajman SUMMARY – DISADVANTAGES ASYNC STANDARD UI Hard to test

    async code Apple could change style of standard UI
  13. @ahmed_sulajman SUMMARY – DISADVANTAGES ASYNC STANDARD UI DISK SPACE Hard

    to test async code Apple could change style of standard UI Every reference image is a .png file
  14. @ahmed_sulajman SUMMARY – ADVANTAGES EDGE CASES CONCURRENT Detect possible UI

    elements edge cases Snapshot tests runs at the same :me as other tests
  15. @ahmed_sulajman SUMMARY – ADVANTAGES EDGE CASES CONCURRENT SEPARATION Detect possible

    UI elements edge cases Snapshot tests runs at the same :me as other tests Separate logical and visual changes 10010 11001 11100 01100 10001
  16. @ahmed_sulajman SUMMARY – ADVANTAGES EDGE CASES DESIGN REVIEW CONCURRENT SEPARATION

    Detect possible UI elements edge cases Involve designer in code review process Snapshot tests runs at the same <me as other tests Separate logical and visual changes 10010 11001 11100 01100 10001
  17. @ahmed_sulajman SUMMARY – ADVANTAGES EDGE CASES DESIGN REVIEW SPEED CONCURRENT

    SEPARATION Detect possible UI elements edge cases Involve designer in code review process Snapshot tests are fast enough Snapshot tests runs at the same =me as other tests Separate logical and visual changes 10010 11001 11100 01100 10001