Snapshot testing for pytest, unittest, Django, and Nose
Snapshot testing is a way to test your APIs without writing actual test cases.
$ pip install snapshottest
from snapshottest import TestCase
class APITestCase(TestCase):
def test_api_me(self):
"""Testing the API for /me"""
my_api_response = api.client.get('/me')
self.assertMatchSnapshot(my_api_response)
# Set custom snapshot name: `gpg_response`
my_gpg_response = api.client.get('/me?gpg_key')
self.assertMatchSnapshot(my_gpg_response, 'gpg_response')
If you want to update the snapshots automatically you can use the nosetests --snapshot-update
.
Check the Unittest example.
def test_mything(snapshot):
"""Testing the API for /me"""
my_api_response = api.client.get('/me')
snapshot.assert_match(my_api_response)
# Set custom snapshot name: `gpg_response`
my_gpg_response = api.client.get('/me?gpg_key')
snapshot.assert_match(my_gpg_response, 'gpg_response')
If you want to update the snapshots automatically you can use the --snapshot-update
config.
Check the Pytest example.
Add to your settings:
TEST_RUNNER = 'snapshottest.django.TestRunner'
To create your snapshottest:
from snapshottest.django import TestCase
class APITestCase(TestCase):
def test_api_me(self):
"""Testing the API for /me"""
my_api_response = api.client.get('/me')
self.assertMatchSnapshot(my_api_response)
If you want to update the snapshots automatically you can use the python manage.py test --snapshot-update
.
Check the Django example.
Set the environment variable ANSI_COLORS_DISABLED
(to any value), e.g.
ANSI_COLORS_DISABLED=1 pytest
After cloning this repo and configuring a virtualenv for snapshottest (optional, but highly recommended), ensure dependencies are installed by running:
make install
After developing, the full test suite can be evaluated by running:
make lint
# and
make test
This package is heavily inspired in jest snapshot testing.
Most of this content is taken from the Jest snapshot blogpost.
We want to make it as frictionless as possible to write good tests that are useful. We observed that when engineers are provided with ready-to-use tools, they end up writing more tests, which in turn results in stable and healthy code bases.
However engineers frequently spend more time writing a test than the component itself. As a result many people stopped writing tests altogether which eventually led to instabilities.
A typical snapshot test case for a mobile app renders a UI component, takes a screenshot, then compares it to a reference image stored alongside the test. The test will fail if the two images do not match: either the change is unexpected, or the screenshot needs to be updated to the new version of the UI component.
A similar approach can be taken when it comes to testing your APIs. Instead of rendering the graphical UI, which would require building the entire app, you can use a test renderer to quickly generate a serializable value for your API response.