Skip to main content

Snapshot Testing utils for Python

Project description

PySnap travis pypi

Note: This project is just a fork of the package snapshottest which lives [here](https://github.com/syrusakbary/snapshottest). It had been mostly abandoned, so I kicked the wheels and got it back in working order. Contributions are welcome!

Snapshot testing is a way to test your APIs without writing actual test cases.pip install doc8

  1. A snapshot is a single state of your API, saved in a file.

  2. You have a set of snapshots for your API endpoints.

  3. Once you add a new feature, you can generate automatically new snapshots for the updated API.

<p align="center">
</p>

Installation

$ pip install pysnap

Usage with unittest/nose

from pysnap 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.

Usage with pytest

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.

Usage with django

Add to your settings:

TEST_RUNNER = 'pysnap.django.TestRunner'

To create your pysnap:

from pysnap.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.

Contributing

After cloning this repo, ensure dependencies are installed by running:

pip install -e ".[test]"

After developing, the full test suite can be evaluated by running:

py.test

Notes

This package is heavily insipired in jest snapshot testing.

Reasons for use this package

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.

Snapshot Testing with PySnap

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.

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pysnap-1.0.tar.gz (11.7 kB view details)

Uploaded Source

Built Distribution

pysnap-1.0-py2.py3-none-any.whl (15.9 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file pysnap-1.0.tar.gz.

File metadata

  • Download URL: pysnap-1.0.tar.gz
  • Upload date:
  • Size: 11.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3

File hashes

Hashes for pysnap-1.0.tar.gz
Algorithm Hash digest
SHA256 0926f505ecff36594194bfa04226945e2ca980d0337e02e7bb8245c55495896c
MD5 4abf023470e5cde1f13f9d0b07677b1a
BLAKE2b-256 48a221d364751f3cdf4ba12e25368157ca249feefaec9cb955c15aa44f85ff25

See more details on using hashes here.

File details

Details for the file pysnap-1.0-py2.py3-none-any.whl.

File metadata

  • Download URL: pysnap-1.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 15.9 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.3

File hashes

Hashes for pysnap-1.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 51f87e6e0ce1031a929a903a42406027c207eee7b96fe037a36cbca1e7a8bf5f
MD5 c9f2c8ad2979c8ef3c84e1a1ef694d34
BLAKE2b-256 bb0f749a3ca43491c06f72900c788d98fa43bf1c3b1379eccdc02646bc81609a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page