1
0
mirror of https://github.com/kevin1024/vcrpy.git synced 2025-12-09 17:15:35 +00:00
Kevin McCarthy 1a73334b50 update tests
2013-08-11 15:05:41 -10:00
2013-08-11 15:05:41 -10:00
2013-08-11 15:05:41 -10:00
2013-08-11 15:05:40 -10:00
2013-08-11 15:05:40 -10:00
2013-08-05 19:41:46 -10:00

#VCR.py

This is a start at a Python version of Ruby's VCR library.

Build Status

##What it is supposed to do Simplify testing by recording all HTTP interactions and saving them to "cassette" files, which are just yaml files. Then when you run your tests again, they all just hit the text files instead of the internet. This speeds up your tests and lets you work offline.

##Compatibility Notes This should work with Python 2.6 and 2.7. It also seems to work with pypy.

Currently I've only tested this with urllib2, urllib3, and requests. It's known to NOT WORK with urllib.

##How to use it

import vcr
import urllib2

with vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml'):
    response = urllib2.urlopen('http://www.iana.org/domains/reserved').read()
    assert 'Example Domains' in response

Run this test once, and VCR.py will record the http request to fixtures/vcr_cassettes/synopsis.yml. Run it again, and VCR.py will replay the response from iana.org when the http request is made. This test is now fast (no real HTTP requests are made anymore), deterministic (the test will continue to pass, even if you are offline, or iana.org goes down for maintenance) and accurate (the response will contain the same headers and body you get from a real request).

Advanced Features

If you want, VCR.py can return information about the cassette it is using to record your requests and responses. This will let you record your requests and responses and make assertions on them, to make sure that your code under test is generating the expected requests and responses. This feature is not present in Ruby's VCR, but I think it is a nice addition. Here's an example:

import vcr
import urllib2

with vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml') as cass:
    response = urllib2.urlopen('http://www.zombo.com/').read()
    # cass should have 1 request inside it
    assert len(cass) == 1 
    # the request host should be zombo.com
    assert cass.requests.keys()[0].host == 'zombo.com'

##Installation

I finally uploaded VCR.py to pypi! So you can just pip install vcrpy (first you may need to brew install libyaml [Homebrew])

##Ruby VCR compatibility I'm not trying to match the format of the YAML files. Cassettes generated by Ruby's VCR are not compatible with VCR.py. The API is similar but VCR.py doesn't have nearly as many features.

##Known Issues This library is a work in progress, so the API might change on you. There are probably some bugs floating around too.

##Changelog

  • 0.1.0: backwards incompatible release - delete your old cassette files: This release adds the ability to access the cassette to make assertions on it, as well as a major code refactor thanks to @dlecocq
  • 0.0.4: If you have libyaml installed, vcrpy will use the c bindings instead. Speed up your tests! Thanks @dlecocq
  • 0.0.3: Add support for requests 1.2.3. Support for older versions of requests dropped (thanks @vitormazzi and @bryanhelmig)
  • 0.0.2: Add support for requests / urllib3
  • 0.0.1: Initial Release

##Similar libraries in Python Neither of these really implement the API I want, but I have cribbed some code from them.

These were created after I created VCR.py but do something similar:

#License This library uses the MIT license

Description
Automatically mock your HTTP interactions to simplify and speed up testing
Readme 6.3 MiB
Languages
Python 99.9%