Skip to main content

grpcvcr

CI codecov PyPI version Python versions

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.aio async 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)

Source distribution for grpcvcr 0.1.1
File Size Uploaded
grpcvcr-0.1.1.tar.gz 18.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for grpcvcr 0.1.1
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.1 This release

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