Skip to main content

Pytest plugin for automatic JSON Schema generation and validation from examples

Project description

🔍 Pytest JsonSchema SnapShot (JSSS)

logo.png

Plugin for pytest that automatically / manually generates JSON Schemas tests with validates data.

Tests Coverage Python PyPI - Package Version License BlackCode Imports: isort mypy Discord Telegram

⭐ Star us on GitHub | 📚 Read the Docs | 🐛 Report Bug

✨ Features

image

  • Automatic JSON Schema generation from data examples (using the genschema library).
  • Format detection: Automatic detection and validation of string formats (email, UUID, date, date-time, URI, IPv4).
  • Enum inference: Short low-cardinality string fields are narrowed to enum automatically.
  • Schema post-processing: Repeated structures are extracted into $defs/$ref to keep generated schemas smaller and easier to review.
  • Schema storage and management.
  • Validation of data against saved schemas.
  • Schema update via --schema-update (create new schemas, remove unused ones, update existing).
  • Support for both async and synchronous functions.
  • Support for Union types and optional fields.
  • Built-in diff comparison of changes via jsonschema-diff.

🚀 Quick Start

Installation

pip install pytest-jsonschema-snapshot

Usage

  1. Use the schemashot fixture in your tests
import pytest

from you_lib import API
from pytest_jsonschema_snapshot import SchemaShot

@pytest.mark.asyncio
async def test_something(schemashot: SchemaShot):
    data = await API.get_data()
    # There are data - need to validate through the schema
    schemashot.assert_json_match(
        data, # data for validation / convert to schema
        "test_name"       # name of the schema
    )

    schema = await API.get_schema()
    # There is a schema (data is optional) - validate by what is
    schemashot.assert_schema_match(
        schema,
        (API.get_schema, "test_name", 1), # == `API.get_schema.test_name.1` filename
        data=data # data for validation (optional)
    )
  1. On first run, generate schemas with the --schema-update or --schema-reset (what is the difference? see the documentation) flag

    pytest --schema-update --save-original
    

    --save-original: save the original data on which the validation was performed. Saving occurs when --schema-update or --schema-reset, if you run the schema update without this attribute, the old original data will be deleted without saving new ones. --jsss-ci-cd: CI mode is intended for automatic PR generation; it saves updates (like --schema-update) to __snapshots__/ci.cd/ (--save-original is compatible).

  2. On subsequent runs, tests will validate data against saved schemas

    pytest
    

Generated schemas are refined by genschema before they are written: format detection, enum inference for short low-cardinality strings, and post-processing that extracts repeated fragments into $defs/$ref.

👀 Key Capabilities

  • Union Types: support multiple possible types for fields

  • Optional Fields: automatic detection of required and optional fields

  • Enum Narrowing: generated schemas can automatically emit enum for short string fields with a small set of observed values

  • Reference Extraction: repeated object/array shapes can be factored into $defs and reused via $ref

  • Format Detection: automatic detection of string formats including:

    Format Example JSON Schema
    Email user@example.com {"format": "email"}
    UUID 550e8400-e29b-41d4-a716-446655440000 {"format": "uuid"}
    Date 2023-01-15 {"format": "date"}
    Date-Time 2023-01-01T12:00:00Z {"format": "date-time"}
    URI https://example.com {"format": "uri"}
    IPv4 192.168.1.1 {"format": "ipv4"}
  • Cleanup: automatic removal of unused schemas when running in update mode

  • Schema Summary: colored terminal output showing created, updated, deleted and unused schemas

Advanced Usage? Check the docs!

Best Practices

  1. Commit schemas to version control: Schemas should be part of your repository
  2. Review schema changes: When schemas change, review the diffs carefully without --schema-update resets.
  3. Clean up regularly: Use --schema-update periodically to remove unused schemas
  4. Descriptive names: Use clear, descriptive names for your schemas

🤝 Contributing

We welcome contributions!

Quick Contribution Setup

# Fork the repo, then:
git clone https://github.com/Miskler/pytest-jsonschema-snapshot.git
cd jsonschema-diff
# Install
make reinstall
# Ensure everything works
make test
make lint
make type-check
# After code editing
make format

📄 License

MIT License - see LICENSE file for details.

Made with ❤️ for developers working with evolving JSON schemas

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

pytest_jsonschema_snapshot-0.2.9.tar.gz (202.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_jsonschema_snapshot-0.2.9-py3-none-any.whl (17.8 kB view details)

Uploaded Python 3

File details

Details for the file pytest_jsonschema_snapshot-0.2.9.tar.gz.

File metadata

File hashes

Hashes for pytest_jsonschema_snapshot-0.2.9.tar.gz
Algorithm Hash digest
SHA256 5f57480489baa9ec5eb1708d7b6847470a0136a918b0cac58256b994defedd75
MD5 5eee53a7839f4dcfc9edf2ef2dedc29a
BLAKE2b-256 cad568d18dfb82b3af7e4af327d57f5e560318778c1c083cad97dad5d93d4fb7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_jsonschema_snapshot-0.2.9.tar.gz:

Publisher: release.yml on Miskler/pytest-jsonschema-snapshot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pytest_jsonschema_snapshot-0.2.9-py3-none-any.whl.

File metadata

File hashes

Hashes for pytest_jsonschema_snapshot-0.2.9-py3-none-any.whl
Algorithm Hash digest
SHA256 2e00e34ea758fa2245dc8a65438b94c9208907a8e7f8bb2fd9e7fdf89d2fcb4a
MD5 28309d1735c6cac3ef5b5c32fcd1b12c
BLAKE2b-256 d9126bdff6a7d38f75fd9a667cc506ceb32a8f06f268597426978724686a7c9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pytest_jsonschema_snapshot-0.2.9-py3-none-any.whl:

Publisher: release.yml on Miskler/pytest-jsonschema-snapshot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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