DEV Community

Oscar Antonio Duran Grillo
Oscar Antonio Duran Grillo

Posted on • Updated on

An intro to Snapshot testing ๐Ÿ“ธ

So, Iโ€™m in the way of making a new app and I would love to share all my learnings while Iโ€™m in the progress so I can keep my self-motivated and share some knowledge that hopefully, you can use for your owns apps.

๐ŸŽจ Why to test the UI?

You want to make sure that every time you touch any of your UI elements everything stays as they way they were meant to be, also this kind of integration test help you achieve the pixel perfect views and make your designers happy by having design reference images that they can see even in your pull requests.


So you want to achieve pixel-perfect while making some nice tests?

โšก๏ธ How does it work?

I'll try to describe how to use this method using my latest lib Snap.swift.

It works by generating a reference image that gets stored in your repository and then comparing each new test case with the reference image to check if there are any differences. If test found any differences it will add an attachment into your test case and you'll be able to check what changed

Project attachment

๐Ÿ›  Configuration

In order to configure the snapshot test folder, we need to add a new environment variable to the project with name SNAP_REFERENCE_IMAGE_PATH and value $(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ so Snap.swift can find the folder to store the reference images. If the configuration was correctly set the project should look like this:

Project attachment

๐ŸŽฏ Installation

Snap.swift is available through CocoaPods. To install
it, simply add the following line to your Podfile:

pod 'Snap.swift'
Enter fullscreen mode Exit fullscreen mode

โœ… Creating our first test

1) We first need to record our reference images, in order to do so we have to first go into our test class and set the isRecording variable to be true so the library knows that we are in record mode and can extract the reference images

import XCTest
import Snap_swift

class SnapTests: XCTestCase {

  override func setUp() {
    super.setUp()
    isRecording = true
  }

  func test_box_with_text_aligned_to_center() {
    let view = BoxWithTextAlignedToCenterView()

    expect(view).toMatchSnapshot()
  }
}
Enter fullscreen mode Exit fullscreen mode

After executing out test suite if everything was ok we should see that all of our tests failed with a warning similar to

โš ๏ธ Test ran in record mode, reference image has been saved to $SNAP_REFERENCE_IMAGE_PATH/testcase.png, now remove `isRecording` in order to perform the snapshot comparison.

Enter fullscreen mode Exit fullscreen mode

This is ok, it just means that our reference images were saved, we can inspect them in our reference image directory, we should normally add these into git so we can compare against them.

โš ๏ธ Warning

Remember to remove the isRecording flag after generating your reference images or you won't be able to do the image comparison

๐Ÿ“ Notes

As today, you can make assertions on UIView and CALayer classes.

The project is highly inspired on Facebook FBSnapshotTestCase library, it seems that they had archived the library so I started this one to continue envolving the project and continue with mobile snapshot-testing

There are other ways to test UI elements by using libs like KIF or EarlGrey by Google but I think this kind of snapshot test are more easy to maintain and one of the Snap.tests could be equal to many of the other frameworks.
If you have any doubts or questions you can reach me via Twitter and Iโ€™ll try to help you out.

Thanks you all and happy Snapshot testing ๐Ÿ“ธ

Discussion (0)