grpcvcr
Record and replay gRPC interactions for testing - like VCR.py but for gRPC.
Installation
pip install grpcvcr
Quick Start
from grpcvcr import recorded_channel, RecordMode
# Record on first run, replay on subsequent runs
with recorded_channel("tests/cassettes/my_test.yaml", "localhost:50051") as channel:
stub = MyServiceStub(channel)
response = stub.GetUser(GetUserRequest(id=1))
assert response.name == "Alice"
Features
- Record & Replay: Automatically record gRPC interactions and replay them in tests
- All RPC Types: Supports unary, server streaming, client streaming, and bidirectional streaming
- Async Support: Full support for
grpc.aioasync clients - pytest Integration: Built-in fixtures and markers for easy test integration
- Flexible Matching: Match requests by method, metadata, body, or custom logic
- Multiple Formats: Store cassettes as YAML or JSON
Recording Modes
| Mode | Description |
|---|---|
NEW_EPISODES |
Play existing, record new (default) |
NONE |
Playback only - fail if no match |
ALL |
Always record, overwrite existing |
ONCE |
Record if cassette missing, then playback |
Async Support
from grpcvcr import AsyncRecordingChannel, Cassette, RecordMode
cassette = Cassette("test.yaml", record_mode=RecordMode.ALL)
async with AsyncRecordingChannel(cassette, "localhost:50051") as recording:
stub = MyServiceStub(recording.channel)
response = await stub.GetUser(GetUserRequest(id=1))
pytest Integration
import pytest
from grpcvcr import RecordMode
@pytest.mark.grpcvcr(cassette="user_test.yaml", record_mode=RecordMode.NONE)
def test_get_user(grpcvcr_cassette):
from grpcvcr import RecordingChannel
with RecordingChannel(grpcvcr_cassette, "localhost:50051") as rc:
stub = MyServiceStub(rc.channel)
response = stub.GetUser(GetUserRequest(id=1))
assert response.name == "Alice"
Run in record mode:
pytest --grpcvcr-record=new_episodes
Run in strict playback mode (CI):
pytest --grpcvcr-record=none
Request Matching
from grpcvcr import recorded_channel, MethodMatcher, RequestMatcher, MetadataMatcher
# Match on method + request body
matcher = MethodMatcher() & RequestMatcher()
with recorded_channel("test.yaml", "localhost:50051", match_on=matcher) as channel:
...
# Ignore certain metadata keys
matcher = MethodMatcher() & MetadataMatcher(ignore_keys=["x-request-id"])
License
MIT
Metadata
Release files for grpcvcr 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| grpcvcr-0.1.1.tar.gz | 18.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| grpcvcr-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.3 kB
Release files / grpcvcr-0.1.1.tar.gz
| Download URL | grpcvcr-0.1.1.tar.gz |
|---|---|
| Size | 18.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
497b4df603a6da059f15155a791868c4304cc7a929dbb98f0bfd131a193a723e
|
|
BLAKE2b-256 checksum How to use checksums |
0734edcd7e12171c7cf8df3f7a0b9dcc60a10281b5b9f43d2ef3d399a7c77637
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Jan 28, 2026.
Transparency logRelease files / grpcvcr-0.1.1-py3-none-any.whl
| Download URL | grpcvcr-0.1.1-py3-none-any.whl |
|---|---|
| Size | 24.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f31ee97f5cb4ef76ad9d1da1c88e3722308eebfaeeff856591e7865d33da315b
|
|
BLAKE2b-256 checksum How to use checksums |
f856038dd09592ab290ac45cfd933b488080343162a8e1943b6afec8e947999a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Jan 28, 2026.
Transparency log