pytest-adbc-replay
[ Docs ]
Record/replay testing for ADBC database queries, as a pytest plugin.
What / Why
Works like VCR.py and pytest-recording: the first run records live queries to cassette
files on disk, subsequent runs replay from those cassettes. CI tests pass with no live warehouse
connection, and query changes are visible as plain diffs in pull requests (.sql files are
human-readable and committed to version control).
Installation
pip install pytest-adbc-replay
Quick Start
For this example we'll use the DuckDB ADBC driver (no credentials needed):
pip install adbc-driver-duckdb
Mocking is flexible enough to use with any ADBC driver.
pyproject.toml — tell the plugin which drivers to intercept:
[tool.pytest.ini_options]
adbc_auto_patch = ["adbc_driver_duckdb.dbapi"]
The value is the Python module path where connect() lives — for all standard ADBC drivers this is adbc_driver_<name>.dbapi.
test_example.py — mark each test and call connect() normally:
import adbc_driver_duckdb.dbapi as duckdb
import pytest
@pytest.mark.adbc_cassette("my_query")
def test_my_query():
conn = duckdb.connect()
with conn.cursor() as cur:
cur.execute("SELECT 42 AS answer")
assert cur.fetchone() == (42,)
No conftest.py needed. The plugin intercepts duckdb.connect() automatically for tests decorated with @pytest.mark.adbc_cassette.
Record cassettes on the first run:
pytest --adbc-record=once
Replay from cassettes (default — no flag needed):
pytest
Cassette Layout
tests/cassettes/
└── my_query/
└── adbc_driver_duckdb.dbapi/
├── 000.sql # human-readable normalised SQL
├── 000.arrow # Arrow IPC result with schema metadata
└── 000.json # parameters and driver options (null when absent)
Commit the cassettes to version control — any changes appear as diffs in pull requests.
Configuration Reference
| Setting | Type | Default | Description |
|---|---|---|---|
--adbc-record |
CLI flag | none |
Record mode for this run |
adbc_cassette_dir |
ini key | tests/cassettes |
Directory to read/write cassettes |
adbc_record_mode |
ini key | none |
Persistent record mode (overridden by CLI flag) |
adbc_dialect |
ini key (linelist) | [] |
SQL dialect for normalisation. Bare value = global fallback, driver: dialect = per-driver. Empty = auto-detect. |
adbc_auto_patch |
ini key (linelist) | [] |
ADBC driver module names to auto-intercept |
adbc_scrub_keys |
ini key (linelist) | [] |
Parameter key names to redact from cassette .json files |
Minimal pyproject.toml snippet:
[tool.pytest.ini_options]
adbc_cassette_dir = "tests/cassettes"
adbc_record_mode = "none"
adbc_dialect = [] # e.g. ["adbc_driver_snowflake.dbapi: snowflake", "adbc_driver_duckdb.dbapi: duckdb"]
adbc_auto_patch = [] # e.g. ["adbc_driver_duckdb.dbapi", "adbc_driver_snowflake.dbapi"]
adbc_scrub_keys = [] # e.g. ["token password", "adbc_driver_snowflake: account_id"]
Record Modes
| Mode | Behaviour |
|---|---|
none |
Replay only. Raises CassetteMissError if cassette is absent (default). |
once |
Record if cassette absent, replay if cassette present. |
new_episodes |
Replay existing interactions, record new ones. |
all |
Re-record everything on every run. |
Scrubbing Sensitive Values
To keep credentials out of cassette files, list parameter key names in adbc_scrub_keys:
[tool.pytest.ini_options]
adbc_scrub_keys = ["token password api_key"]
Matched values become REDACTED in the .json cassette file. Per-driver form:
adbc_scrub_keys = [
"token",
"adbc_driver_snowflake: account_id warehouse",
]
For custom scrubbing logic, override the adbc_scrubber fixture in your conftest.py:
import pytest
@pytest.fixture(scope="session")
def adbc_scrubber():
def scrub(params: dict | None, driver_name: str) -> dict | None:
if not isinstance(params, dict):
return params
return {k: "REDACTED" if k.endswith("_key") else v for k, v in params.items()}
return scrub
Config scrubbing runs first; the fixture callable receives the already-config-scrubbed params.
Advanced
adbc_param_serialisers is a session-scoped fixture for registering custom parameter serialisers
for types not handled by default.
Full reference documentation: https://s-layer.github.io/pytest-adbc-replay
License
Metadata
Release files for pytest-adbc-replay 1.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pytest_adbc_replay-1.1.2.tar.gz | 27.4 kB | With provenance | Details for pytest_adbc_replay-1.1.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| pytest_adbc_replay-1.1.2-py3-none-any.whl | Python 3 | none | any | Details for pytest_adbc_replay-1.1.2-py3-none-any.whl |
Total release size: 58.4 kB
Release files / pytest_adbc_replay-1.1.2.tar.gz
| Download URL | pytest_adbc_replay-1.1.2.tar.gz |
|---|---|
| Size | 27.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ed048755c0c283a69c08a33c01e4549dde6ee7cbb72510b0f19d3f8cf322b55b
|
|
BLAKE2b-256 checksum How to use checksums |
d8df38a36ea3549955b6da269afc35483a231f8507ed3691a191877171d70718
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logRelease files / pytest_adbc_replay-1.1.2-py3-none-any.whl
| Download URL | pytest_adbc_replay-1.1.2-py3-none-any.whl |
|---|---|
| Size | 31.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
213a505a9c3427495ac816426b2c8fcf3c1b60fd7cb8a49590d05f2207f2d4aa
|
|
BLAKE2b-256 checksum How to use checksums |
78f838af28830bd7f9d3e8c3fe90fccc062101db6d5a0b02349b2fee0e0c557c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logSecurity for pytest-adbc-replay 1.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for pytest_adbc_replay-1.1.2.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.