A pytest plugin that allows to record network interactions via VCR.py
Project description
A pytest plugin that allows to record network interactions via VCR.py.
Features
Straightforward pytest.mark.vcr, that reflects VCR.use_cassettes API;
Combining multiple VCR cassettes;
Network access blocking.
Usage
import pytest
import requests
@pytest.mark.vcr("/path/to/ip.yaml", "/path/to/get.yaml")
def test_multiple():
assert requests.get("http://httpbin.org/get").text == "GET CONTENT"
assert requests.get("http://httpbin.org/ip").text == "IP CONTENT"
# cassettes/{module_name}/test_single.yaml will be used
def test_single():
assert requests.get("http://httpbin.org/get").text == "GET CONTENT"
Configuration
The recording configuration could be provided with vcr_config fixture, which could be any scope - session, package, module or function. It should return a dictionary that will be passed directly to VCR.use_cassettes under the hood.
import pytest
@pytest.fixture(scope="module")
def vcr_config():
return {"filter_headers": ["authorization"]}
For more granular control you need to pass these keyword arguments to individual pytest.mark.vcr marks, and in this case all arguments will be merged into a single dictionary with the following priority (low -> high):
vcr_config fixture
all marks from the most broad scope (“session”) to the most narrow one (“function”)
Example:
import pytest
pytestmark = [pytest.mark.vcr(ignore_localhost=True)]
@pytest.fixture(scope="module")
def vcr_config():
return {"filter_headers": ["authorization"]}
@pytest.mark.vcr(filter_headers=[])
def test_one():
...
@pytest.mark.vcr(filter_query_parameters=["api_key"])
def test_two():
...
Resulting VCR configs for each test:
test_one - {"ignore_localhost": True, "filter_headers": []}
test_two - {"ignore_localhost": True, "filter_headers": ["authorization"], "filter_query_parameters": ["api_key"]}
Blocking network access
To have more confidence that your tests will not go over the wire, you can block it with pytest.mark.block_network mark:
import pytest
import requests
@pytest.mark.block_network
def test_multiple():
assert requests.get("http://httpbin.org/get").text == "GET CONTENT"
...
# in case of access
RuntimeError: Network is disabled
Besides marks, the network access could be blocked globally with --block-network command-line option.
However, if VCR.py recording is enabled then, the network is not blocked for tests, that have pytest.mark.vcr.
Example:
import pytest
import requests
@pytest.mark.vcr
def test_multiple():
assert requests.get("http://httpbin.org/get").text == "GET CONTENT"
Run pytest:
$ pytest --record-mode=all --block-network tests/
The network blocking feature supports socket-based transports and pycurl.
Python support
Pytest-recording supports:
CPython 2.7, 3.5, 3.6, 3.7 and 3.8.
PyPy 7 (2.7 & 3.6)
License
The code in this project is licensed under MIT license. By contributing to pytest-recording, you agree that your contributions will be licensed under its MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for pytest_recording-0.3.1-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 96c8260486875552c5d59b434f09eecbb7c5c0141e205873231bf609bfde7626 |
|
MD5 | a93415b6cd46e0c276ed911d5f5cd206 |
|
BLAKE2b-256 | 8a999e9a4f98fcc0a32b152f3caba76857488d263c3689db7a2e0296a6a2bfa7 |