{"library":"pytest-recording","title":"pytest-recording","description":"pytest-recording is a pytest plugin that integrates VCR.py to record and replay HTTP traffic during tests. It aims to make testing code that interacts with external services faster and more reliable by preventing unnecessary network requests. The library uses VCR.py's 'none' recording mode by default to avoid unintentional live network calls. The current version is 0.13.4, and it maintains an active release cadence.","language":"python","status":"active","last_verified":"Thu May 14","install":{"commands":["pip install pytest-recording"],"cli":null},"imports":["import pytest\n# Use as decorator: @pytest.mark.vcr","import pytest\n@pytest.fixture(scope='module')\ndef vcr_config():\n    return {'filter_headers': ['Authorization']}"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import pytest\nimport requests\nimport os\n\n# Define a vcr_config fixture in conftest.py or test file scope\n@pytest.fixture(scope=\"module\")\ndef vcr_config():\n    \"\"\"\n    Global VCR.py configuration for all tests in this module/session.\n    Filters out sensitive Authorization headers to prevent them from being written to cassettes.\n    \"\"\"\n    return {\"filter_headers\": [\"Authorization\"], \"ignore_localhost\": True}\n\n@pytest.mark.vcr\ndef test_http_get_request():\n    \"\"\"\n    Records a simple HTTP GET request to httpbin.org.\n    The cassette will be saved in a default location, e.g., cassettes/{module_name}/test_http_get_request.yaml.\n    \"\"\"\n    response = requests.get(\"http://httpbin.org/get\")\n    assert response.status_code == 200\n    assert response.json()[\"url\"] == \"http://httpbin.org/get\"\n\n@pytest.mark.vcr\ndef test_authenticated_api_call():\n    \"\"\"\n    Demonstrates recording an API call with an Authorization header.\n    The header is filtered by the vcr_config fixture defined above.\n    \"\"\"\n    # Simulate retrieving an API key from environment variables\n    api_key = os.environ.get('PYTEST_TEST_API_KEY', 'fake_api_key_123')\n    headers = {\"Authorization\": f\"Bearer {api_key}\"}\n    response = requests.get(\"http://httpbin.org/headers\", headers=headers)\n    assert response.status_code == 200\n    # Verify that the Authorization header is not in the recorded response (due to filtering)\n    assert \"Authorization\" not in response.json().get(\"headers\", {})\n    assert \"fake_api_key_123\" not in str(response.json()) # Ensure actual key content not present\n","lang":"python","description":"This quickstart demonstrates setting up `pytest-recording` to record and replay HTTP requests using the `@pytest.mark.vcr` decorator. It includes a `vcr_config` fixture, typically placed in a `conftest.py` file or at the top of a test module, to apply global VCR.py configurations like filtering sensitive headers. To run these tests and record the network interactions, use `pytest --record-mode=once your_test_file.py`. The `--record-mode=once` argument is crucial for the initial recording, as `pytest-recording` defaults to `none` mode to prevent accidental network requests. Subsequent runs without this flag will replay from the cassette.","tag":null,"tag_description":null,"last_tested":"2026-04-25","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-14","installed_version":"0.13.4","pypi_latest":"0.13.4","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.6,"avg_import_s":0.61,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.42,"mem_mb":12.2,"disk_size":"33.9M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.5,"mem_mb":12.2,"disk_size":"33.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.3,"import_time_s":0.29,"mem_mb":12.2,"disk_size":"35M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.81,"mem_mb":12.2,"disk_size":"35M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.59,"mem_mb":12.9,"disk_size":"37.1M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.7,"mem_mb":12.9,"disk_size":"37.1M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3,"import_time_s":0.48,"mem_mb":12.9,"disk_size":"38M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":1.71,"mem_mb":12.9,"disk_size":"38M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.5,"mem_mb":12.8,"disk_size":"28.7M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.6,"mem_mb":12.8,"disk_size":"28.7M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.9,"import_time_s":0.5,"mem_mb":12.8,"disk_size":"30M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.62,"mem_mb":12.8,"disk_size":"30M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.44,"mem_mb":11.8,"disk_size":"28.5M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.47,"mem_mb":11.8,"disk_size":"28.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.8,"import_time_s":0.42,"mem_mb":11.8,"disk_size":"30M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.51,"mem_mb":11.8,"disk_size":"30M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.36,"mem_mb":11.2,"disk_size":"37.0M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.47,"mem_mb":11.2,"disk_size":"37.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":5.8,"import_time_s":0.31,"mem_mb":11.2,"disk_size":"39M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pytest-recording","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.41,"mem_mb":11.2,"disk_size":"39M"}]}}