In the previous article, we explored how pytest-verify makes snapshot testing effortless for structured data — JSON, YAML, XML, DataFrames, and more.
But what if your tests are asynchronous?
Modern Python apps rely heavily on async I/O — think of:
Async web frameworks like FastAPI, aiohttp, or Quart
Async database drivers (asyncpg, motor)
Message brokers and streaming systems
Until now, testing async functions meant juggling plugins and decorators.
Not anymore 🚀
Introducing Native Async Support
Starting from pytest-verify v1.2.0, you can snapshot async test functions directly — no wrappers, no extra ceremony.
Whether your test is async or simply returns a coroutine, @verify_snapshot now handles both seamlessly:
⚙️ Setup
1.Install the async extras:
pip install pytest-verify[async]
2.Enable async mode in your pytest configuration (either in pytest.ini or pyproject.toml):
pyproject.toml:
[tool.pytest.ini_options]
asyncio_mode = "auto"
pytest.ini:
[pytest]
asyncio_mode = auto
Example 1 — Async REST API Snapshot
Let’s simulate a lightweight async API call:
import asyncio
from pytest_verify import verify_snapshot
async def get_user():
await asyncio.sleep(0.1)
return {"id": 123, "name": "Mohamed", "country": "France"}
@verify_snapshot()
async def test_async_user_snapshot():
"""Ensure async API output stays stable."""
user = await get_user()
return user
✅ On first run → baseline snapshot created.
✅ On next runs → automatic comparison with full diff view if anything changes.
Example 2 — Async Data Transformation
You can also snapshot results from async pipelines or background tasks:
from pytest_verify import verify_snapshot
async def compute_metrics():
return {"accuracy": 99.94, "loss": 0.102}
@verify_snapshot(abs_tol=0.1)
async def test_async_data_pipeline():
"""Verify numeric tolerance in async output."""
return await compute_metrics()
✅ pytest-verify waits for the coroutine, serializes the returned dict, and applies your configured tolerances automatically — no extra setup.
Example 3 — Async Ignore Fields and Tolerances
You can combine async support with all snapshot options:
from pytest_verify import verify_snapshot
import asyncio, random
@verify_snapshot(
ignore_fields=["$.meta.timestamp"],
abs_tol_fields={"$.metrics.latency": 1.0}
)
async def test_async_snapshot_with_ignores():
await asyncio.sleep(0.05)
return {
"meta": {"timestamp": "2025-10-26T09:00:00Z"},
"metrics": {"latency": random.uniform(99, 101)},
}
✅ This test ignores the volatile timestamp field
✅ Allows ±1.0 drift for latency values
✅ Works perfectly under async execution
Wrapping Up — Async Testing Made Effortless
In modern Python, async is everywhere — your tests shouldn’t lag behind.
With pytest-verify >= v1.2.0, you can now:
Snapshot async APIs and coroutine results directly.
Use all features — ignore fields, tolerances, diff viewer — in async mode.
Keep your test suite consistent and declarative.
No extra plugins. No decorator juggling. Just pure, powerful snapshot testing.
💡 Final Thought
If your tests look like this 👇:
await some_async_func()
assert ...
assert ...
assert ...
assert ...
You can now replace them with:
@verify_snapshot()
async def test_async_output():
return await some_async_func()
Cleaner, safer, and instantly snapshot-aware.
If you find this new async support useful, give pytest-verify a ⭐ on GitHub and
share your feedback!
Top comments (0)