A powerful and intuitive snapshot testing tool for pytest based on the Jest API.
Project description
Snappylapy
Welcome to Snappylapy, a powerful and intuitive snapshot testing tool for Python's pytest framework. Snappylapy simplifies the process of capturing and verifying snapshots of your data, ensuring your code behaves as expected across different runs. With Snappylapy, you can save snapshots in a human-readable format and deserialize them for robust integration testing, providing a clear separation layer to help isolate errors and maintain code integrity.
Key Features
Legend:
- ✅ Implemented
- ❌ Not implemented yet
The features are in development:
- Human-Readable Snapshots✅: Save snapshots in a format that's easy to read and understand, making it simpler to review changes and debug issues.
- Serialization and Deserialization❌: Snapshots can be serialized and deserialized, allowing for flexible and reusable test cases.
- Integration Testing❌: Use snapshots for integration testing with a clear separation layer, preventing interdependencies between code components and making it easier to isolate and identify errors.
- Easy to Use✅: Seamlessly integrates with pytest, allowing you to start capturing and verifying snapshots with minimal setup. For a good developer experience the package is fully typed, with docstrings to provide good editor code completion.
- Customizable Output✅: Store snapshots in a location of your choice, enabling you to organize and manage your test data effectively.
- Diff Report Generation❌: Generate a diff report in html format for easy comparison between test results and snapshots.
- Provides a wide set of assertions❌: The package provides a wide set of assertions to make it easy to compare different types of data, for do fuzzy matching or ignore certain parts of the data that are variable.
Benefits of Snapshot Testing
Snapshot testing is a powerful technique for verifying the output of your code by comparing it to a stored snapshot. This approach offers several benefits, including:
- Immutability Verification: Quickly detect unintended changes or regressions by comparing current output to stored snapshots.
- Faster Test Creation: Simplify the process of writing and maintaining tests by capturing snapshots once and letting the framework handle comparisons.
- Documentation: Use snapshots as a form of documentation, providing a clear record of expected output and behavior.
- Version Control Integration: Include snapshots in your version control system to aid in code reviews and track changes over time.
- Pull Request Reviews: Enhance PR reviews by showing exactly how changes affect the application's output, ensuring thorough and effective evaluations.
Why Snappylapy?
When working on a test suite for a project, it’s important to ensure tests are independent. This is to avoid situations where changes in one part of the code cause failures in tests for other unrelated areas, making it challenging to isolate and fix errors. Snappylapy addresses this by providing a mechanism to capture snapshots of your data and use them in your later tests, ensuring that each component can be tested independently. While also making sure that they are dependent enought to test the integration between them. It provides serialization and deserialization of the snapshots, making it easy to reuse them in different test cases. This is aimed at function working with large and complex data structures (dataframes or large nested dictionaries.)
Example
from snappylapy import Expect
from mypackage import my_function
def test_snapshot_dict(expect: Expect):
"""Test snapshot with dictionary data."""
data: dict = my_function()
expect.dict(data).to_match_snapshot()
Allows users full control to select output location for snapshots so they can be stored together with testcases.
import pytest
import pathlib
from snappylapy import Expect
@pytest.mark.parametrize('case_dir', list(Path('test_cases').iterdir()))
def test_my_function(case_dir: pathlib.Path, expect: Expect):
snapshot.snapshot_dir = case_dir / "__snapshots__"
snapshot.test_results_dir = case_dir / "__test_results__"
result = my_function(case_dir)
expect.dict(result).to_match_snapshot()
In this example, snappylapy captures the output of my_function and compares it against a stored snapshot. If the output changes unexpectedly, pytest will flag the test, allowing you to review the differences and ensure your code behaves as expected.
Getting Started
To get started with Snappylapy, install the package via pip:
pip install snappylapy
Add Snappylapy to your pytest configuration and start writing tests that capture and verify snapshots effortlessly.
The output structure
The results is split into two folders, for ease of comparison, and for handling stochastic/variable outputs (timestamps, generated ids, llm outputs, third party api responses etc).
- test_results: Updated every time the tests is ran. Compare with snapshots when doing snapshot style assertions. Add this to your .gitignore file.
- snapshots: Updated only when --snapshot-update flag is used when running the test suite. Commit this to your version control system.
Usage
Update snapshots with:
pytest --snapshot-update
A diff report in html can be generated with (not implemented yet ❌):
pytest --snappylapy-html=report.html
Fixtures and roadmap
Registers fixtures:
- expect ✅
Supported data types
- .txt ✅
- .json ✅
- .csv ❌
- .yaml ❌
- .jsonl ❌
Planned data types:
| Python Type | Default Output file type | Implementation Status |
|---|---|---|
| bytes | .txt | ✅ |
| pd.DataFrame | .csv | ❌ |
| pd.Series | .csv | ❌ |
| np.ndarray | .csv | ❌ |
| dict | .json | ✅ |
| list | .json | ✅ |
| tuple | .json | ❌ |
| set | .json | ❌ |
| str | .txt | ✅ |
| int | .txt | ❌ |
| float | .txt | ❌ |
| bool | .txt | ❌ |
| datetime.datetime | .txt | ❌ |
| datetime.date | .txt | ❌ |
| datetime.time | .txt | ❌ |
| pathlib.Path | .txt | ❌ |
| decimal.Decimal | .txt | ❌ |
| uuid.UUID | .txt | ❌ |
Snappylapy is your go-to tool for efficient and reliable snapshot testing in Python. By maintaining clear boundaries between different parts of your code, Snappylapy helps you isolate errors, streamline debugging, and ensure your code remains robust and maintainable.
Contributing
We welcome contributions to Snappylapy! If you have ideas for new features, improvements, or bug fixes, please open an issue or submit a pull request on our GitHub repository. We appreciate your feedback and support in making Snappylapy even better for the community.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file snappylapy-0.0.2.tar.gz.
File metadata
- Download URL: snappylapy-0.0.2.tar.gz
- Upload date:
- Size: 17.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d5d91403abf8ac24012556feea1210f22d881c30d1823b8f013530f08d1e472a
|
|
| MD5 |
c98853aeaddc4daf00877517c3b24498
|
|
| BLAKE2b-256 |
ea79f81ae06244bd193b0669ae873ce1215831c7a3ad3e021bfeffa6f4c33134
|
Provenance
The following attestation bundles were made for snappylapy-0.0.2.tar.gz:
Publisher:
release.yaml on martinmoldrup/snappylapy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
snappylapy-0.0.2.tar.gz -
Subject digest:
d5d91403abf8ac24012556feea1210f22d881c30d1823b8f013530f08d1e472a - Sigstore transparency entry: 160235211
- Sigstore integration time:
-
Permalink:
martinmoldrup/snappylapy@1a582b132a143b681d450aa320b6a2f2ada42550 -
Branch / Tag:
refs/tags/0.0.2 - Owner: https://github.com/martinmoldrup
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@1a582b132a143b681d450aa320b6a2f2ada42550 -
Trigger Event:
push
-
Statement type:
File details
Details for the file snappylapy-0.0.2-py3-none-any.whl.
File metadata
- Download URL: snappylapy-0.0.2-py3-none-any.whl
- Upload date:
- Size: 19.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.0.1 CPython/3.12.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a3495bf10a4f379a1bdf92c5670f3779babed312fab2e37762f6c1c0ae52be69
|
|
| MD5 |
f8f365d6680c93bae2a0bfdb69ca85a3
|
|
| BLAKE2b-256 |
2ba40e3fe4038d0fbb84634674afdcbc33dd0f2d3e09652f6fc7298536b6130c
|
Provenance
The following attestation bundles were made for snappylapy-0.0.2-py3-none-any.whl:
Publisher:
release.yaml on martinmoldrup/snappylapy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
snappylapy-0.0.2-py3-none-any.whl -
Subject digest:
a3495bf10a4f379a1bdf92c5670f3779babed312fab2e37762f6c1c0ae52be69 - Sigstore transparency entry: 160235212
- Sigstore integration time:
-
Permalink:
martinmoldrup/snappylapy@1a582b132a143b681d450aa320b6a2f2ada42550 -
Branch / Tag:
refs/tags/0.0.2 - Owner: https://github.com/martinmoldrup
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yaml@1a582b132a143b681d450aa320b6a2f2ada42550 -
Trigger Event:
push
-
Statement type: