Cornell: record & replay mock server
When your application integrates with multiple web based services, end-to-end testing is crucial before deploying to production. Mocking is often a tedious task, it becomes even more tiresome when working with multiple APIs from multiple vendors.
vcrpy is an awesome library that records and replays HTTP interactions for unit tests. Its output is saved to reusable "cassette" files.
By wrapping vcrpy with Flask, Cornell provides a lightweight record and replay server that can be easily used during distributed system testing and simulate all HTTP traffic needed for your tests.
Basic Use Case
When you're working with distributed systems, the test client entry point triggers a cascade of events that eventually send HTTP requests to an external server
With Cornell server started, it will act as a proxy (record mode) between the outgoing HTTP requests and the external server and will record all relevant interactions. Once interactions are recorded, Cornell can be work in replay mode and replace the external server entirely, short circuting the calls and instead, replying back instantly with the previously recorded response.
To install from PyPI, all you need to do is this:
pip install cornell
Usage: cornell_server.py [OPTIONS] Usage Examples: Record mode: `cornell --forward_uri="https://remote_server/api" --record -cd custom_cassette_dir` Replay mode: `cornell -cd custom_cassette_dir Options: -p, --port INTEGER -ff, --forward_uri TEXT Must be provided in case of recording mode -, --record-once / --record-all Record each scenario only once, ignore the rest -r, --record Start server in record mode -fp, --fixed-path Fixed cassettes path. If enabled, Cornell will support only one server for recording -cd, --cassettes-dir TEXT Cassettes parent directory, If not specified, Cornell parent dir will be used --help Show this message and exit.
Demo - Full Example
Staring Cornell in record mode:
cornell -ff https://api.github.com/ --record -cd cassettes
This will start the server in record-proxy mode on port
9000, and will forward all requests to
When cornell is in record mode, it will forward all request to the specified forwarding url, for example:
or you can browse to the url using your browser
Cornell will forward the request to the specified url and will record both the request and the response.
The yaml cassettes will be recorded in dedicated dictory (
cassettes in the root dir, by default)
By default, `cassettes` directory will be created in cornell's root dir and will contain the cassette by destination hierarchy. Use `-cd` to specify custom directory for your cassettes. Mind that `-cd <custom_dir> should match for both record and replay modes
Once all the necessary interactions were recorded, stop cornell server using ctrl+c. Once stopped, all interactions will be mapped via an auto-generated
In case the `index.yaml` was already present, it will be updated with new interactions, otherwise new file will be created.
In this specific example, we can see that the 2 requests are mapped to the saved cassettes:
In addition to the vcrpy matchers, cornell provides the following custom request matchers:
Since Cornell is a testing server it's executed by default with
FLASK_ENV=local. You can modify this as described in flask configuration
Can be found in the documentation
Yes please! contributions are more than welcome!
Add tests when you're adding new functionality and make sure all the existing tests are happy and green :)
To set up development environment:
python -m venv venv source venv/bin/activate make configure
To run tests, run the following command
python -m venv venv source venv/bin/activate make test