Skip to main content

pytest-pvcr

PyPI version Python versions License

A pytest plugin that records and replays commands executed with subprocess.run(), inspired by VCR.py.

Installation

pip install pytest-pvcr

Usage

Mark your tests with @pytest.mark.pvcr() and run them:

import subprocess
import pytest


@pytest.mark.pvcr()
def test_ls():
    ret = subprocess.run(["ls", "/tmp"])
    assert ret.returncode == 0


@pytest.mark.pvcr(wait=False)
def test_slow_command():
    # On replay, pvcr won't sleep for the original command duration
    ret = subprocess.run(["sleep", "10"])
    assert ret.returncode == 0
pytest --pvcr-record-mode=new test_commands.py

Recordings are stored as YAML files in recordings/<module>/<test_name>.yaml.

Record modes

# Only record new commands not previously recorded (default)
pytest --pvcr-record-mode=new

# Replay only, never record
pytest --pvcr-record-mode=none

# Re-record all commands, even previously recorded ones
pytest --pvcr-record-mode=all

# Record on first run, then replay only and block unrecorded commands
pytest --pvcr-record-mode=once

The once mode is useful in CI: it records everything on the first run (when no recording file exists), then on subsequent runs it replays and raises PVCRBlockedRunException if an unrecorded command is encountered.

Block execution

Block all unrecorded subprocess calls, useful to protect test environments:

pytest --pvcr-block-run

Fuzzy matching

Fuzzy matching replaces variable parts of commands so recordings stay portable.

Via CLI (global, applies to all tests):

# Ignore `--dry-run` arguments when matching commands
pytest --pvcr-fuzzy-matcher='--dry-run'

# Keep only the filename from a path
pytest --pvcr-fuzzy-matcher='^.+\/(kubeconfig)$'

# Automatically ignore the parent directory of the test file
pytest --pvcr-auto-fuzzy-match

Via marker (per-test):

@pytest.mark.pvcr()
@pytest.mark.pvcr_fuzzy_matcher(r"^.+\/(config\.yml)$")
def test_with_fuzzy():
    subprocess.run(["cat", "/some/path/config.yml"])

If a regex has no capture groups, the matched string is replaced with a placeholder. If a regex has capture groups, the captured parts are kept and the rest is replaced.

Python support

Python >= 3.12

Authors

Metadata

Release files for pytest-pvcr 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pytest-pvcr 0.2.0
File Size Uploaded Provenance
pytest_pvcr-0.2.0.tar.gz 9.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pytest-pvcr 0.2.0
File Interpreter ABI Platform
pytest_pvcr-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 21.3 kB

Release files / pytest_pvcr-0.2.0.tar.gz

Download URL pytest_pvcr-0.2.0.tar.gz
Size 9.7 kB
Tags Source
SHA-256 checksum
How to use checksums
762ba702de443345d307f2049171e2e2868d6e1721883454bbcb6053cc000e37
BLAKE2b-256 checksum
How to use checksums
cf070c028dc1a534b15d7da8b56c399418a36709a2a3149c248b9e04371414f8
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 Jul 30, 2026.

Transparency log

Release files / pytest_pvcr-0.2.0-py3-none-any.whl

Download URL pytest_pvcr-0.2.0-py3-none-any.whl
Size 11.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
236ba04fc3c4ae77f20a02ecc6cc29f464c5c61c9f9f2ebf2ddf0485c304c17d
BLAKE2b-256 checksum
How to use checksums
af3a3b9e4e68fb0d70e6774e05314b698f83e8bec47046f0acfd0206c9430387
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 Jul 30, 2026.

Transparency log

Security for pytest-pvcr 0.2.0

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.

Select from 2 files

Attestation for pytest_pvcr-0.2.0.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 Jul 30, 2026.

Transparency log

A 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.

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