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
- Docs site: https://peter-daly.github.io/assertive/
- Getting started page: https://peter-daly.github.io/assertive/getting-started/
- Criteria overview: https://peter-daly.github.io/assertive/criteria/
- Built-in criteria: https://peter-daly.github.io/assertive/criteria/built-ins/
- Composition guide: https://peter-daly.github.io/assertive/criteria/composition/
- Writing custom criteria: https://peter-daly.github.io/assertive/criteria/writing-custom-criteria/
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)
| File | Size | Uploaded | |
|---|---|---|---|
| assertive-1.8.0.tar.gz | 19.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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}
|