vcrpy for web related tests
Couple of weeks ago, Jen pointed me to vcrpy. This is a Python implementation of Ruby’s library with same name.
What is vcrpy?
It is a Python module which helps to write faster and simple tests involving HTTP requests. It records all the HTTP interactions in plain text files (by default in a YAML file). This helps to write deterministic tests, and also to run them in offline.
It works well with the following Python modules.
- requests
- aiohttp
- urllib3
- tornado
- urllib2
- boto3
Usage example
Let us take a very simple test case.
import unittest
import requests
class TestExample(unittest.TestCase):
def test_httpget(self):
r = requests.get("https://httpbin.org/get?name=vcrpy&lang=Python")
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertEqual(data["args"]["name"], "vcrpy")
self.assertEqual(data["args"]["lang"], "Python")
if __name__ == "__main__":
unittest.main()
In the above code, we are making a HTTP GET request to the https://httpbin.org site and examining the returned JSON data. Running the test takes around 1.75 seconds in my computer.
$ python test_all.py
.
------------------------------------------------------------------
Ran 1 test in 1.752s
OK
Now, we can add vcrpy to this project.
import unittest
import vcr
import requests
class TestExample(unittest.TestCase):
@vcr.use_cassette("test-httpget.yml")
def test_httpget(self):
r = requests.get("https://httpbin.org/get?name=vcrpy&lang=Python")
self.assertEqual(r.status_code, 200)
data = r.json()
self.assertEqual(data["args"]["name"], "vcrpy")
self.assertEqual(data["args"]["lang"], "Python")
if __name__ == "__main__":
unittest.main()
We imported vcr
module, and added a decorator
vcr.use_cassette to our
test function. Now, when we will execute the test again, vcrpy will record the
HTTP call details in the mentioned YAML file, and use the same for the future
test runs.
$ python test_all.py
.
------------------------------------------------------------------
Ran 1 test in 0.016s
OK
You all can also notice the time taken to run the test, around 0.2 second.
Read the project documentation for all the available options.