Skip to main content

Assertive

Assertive is a lightweight Python assertion library for writing declarative, composable test expectations.

Install

pip install assertive

Basic usage

Criteria are objects that implement a match operation. You compare a subject to criteria with ==.

from assertive import is_eq, is_gt, is_odd

assert 5 == is_eq(5)
assert 5 == is_gt(4)
assert 5 == is_odd()

Composition

from assertive import is_gt, is_lt, is_even

assert 8 == is_gt(0) & is_lt(10)
assert 8 == is_even() | is_lt(0)
assert 8 == ~is_lt(0)

Nested Criteria

You can nest criteria inside other criteria. This is especially useful for dicts and lists.

Dict values can be criteria

from assertive import has_key_values, is_gt, starts_with

user = {"name": "Ada", "age": 37, "team": "platform"}

assert user == has_key_values({
    "name": starts_with("A"),
    "age": is_gt(18),
})

List positions can be criteria

Use contains_exactly when position/order matters. You can place criteria in specific slots.

from assertive import contains_exactly, is_gt, starts_with

record = ["user_123", 42, "active"]

assert record == contains_exactly(
    starts_with("user_"),  # first item
    is_gt(40),             # second item
    "active",              # third item
)

Asserting Mock Calls

You can assert on Mock and AsyncMock interactions with the same criteria style.

from unittest.mock import Mock
from assertive import was_called, was_called_once, was_called_once_with, was_called_with

gateway = Mock()
gateway.charge(customer_id="cus_123", amount=2500, currency="USD")

assert gateway.charge == was_called().once()
assert gateway.charge == was_called_once()
assert gateway.charge == was_called_with(customer_id="cus_123", amount=2500, currency="USD").once()
assert gateway.charge == was_called_once_with(amount=2500, currency="USD")

Advanced example 1: rich argument matching with call-count constraints

from unittest.mock import Mock
from assertive import is_gt, starts_with, was_called_with

gateway = Mock()
gateway.charge("cus_001", amount=1200, currency="USD", retry_count=1)
gateway.charge("cus_002", amount=2600, currency="USD", retry_count=2)

assert gateway.charge == was_called_with(
    starts_with("cus_"),
    amount=is_gt(1000),
    currency="USD",
    retry_count=is_gt(0),
).twice()

Advanced example 2: async await assertions with nested criteria

import asyncio
from unittest.mock import AsyncMock
from assertive import has_key_values, is_gt, was_awaited_once_with

publisher = AsyncMock()

async def publish():
    await publisher.send(
        "/events",
        payload={"type": "purchase", "amount": 4999, "meta": {"source": "checkout"}},
    )

asyncio.run(publish())

assert publisher.send == was_awaited_once_with(
    "/events",
    payload=has_key_values({"type": "purchase", "amount": is_gt(0)}),
)

Documentation

Metadata

Release files for assertive 1.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for assertive 1.8.0
File Size Uploaded
assertive-1.8.0.tar.gz 19.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for assertive 1.8.0
File Interpreter ABI Platform
assertive-1.8.0-py3-none-any.whl Python 3 none any Details

Total release size: 44.5 kB

Release files / assertive-1.8.0.tar.gz

Download URL assertive-1.8.0.tar.gz
Size 19.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a2c6a2dacc75a3def6008607b6dbc985baf1b15c1749b7873f84456c1f87b606
BLAKE2b-256 checksum
How to use checksums
44a2109ae5d138628f159cbe5bd5832e2ce5f134a9bf92a8cd630c23ec692b2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / assertive-1.8.0-py3-none-any.whl

Download URL assertive-1.8.0-py3-none-any.whl
Size 25.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
0b9e416cc5c7997ec7c5e76f2d38ac8c97974655649a9532ee0f746979ccab2e
BLAKE2b-256 checksum
How to use checksums
6a6b9c38951a61b56a3d34fd7cd7e866c2db79fbb387a4db9bdbad0ea20c263d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.1 {"installer":{"name":"uv","version":"0.12.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

1.8.0 This release

2 release files

1.7.0

2 release files

1.6.1

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

0.0.3

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page