In this example, we’ll take a look at writing unit tests that use HoverPy. Please note that doing so means that you, as a developer, can be entirely sure that you are testing your code against known data. This makes you hermetic to issues with third party APIs. Let’s begin by importing hoverpy.

>>> from hoverpy import testing

Instead of inheriting off unittest.TestCase let’s inherit off hoverpy.testing.TestCase

>>> class TestRTD(testing.TestCase):

In our test, we’ll once again download a load of readthedocs pages

>>>     def test_rtd_links(self):
>>>         import requests
>>>         limit = 50
>>>         sites = requests.get(
>>>             "http://readthedocs.org/api/v1/project/?"
>>>             "limit=%d&offset=0&format=json" % limit)
>>>         objects = sites.json()['objects']
>>>         links = ["http://readthedocs.org" + x['resource_uri'] for x in objects]
>>>         self.assertTrue(len(links) == limit)
>>>         for link in links:
>>>             response = requests.get(link)
>>>             print(link, response)
>>>             self.assertTrue(response.status_code == 200)

Let’s run our hoverpy testcase if the script is invoked directly

>>> if __name__ == '__main__':
>>>     import unittest
>>>     unittest.main()

Now the correct way of launching this script the first time is:

$ env HOVERPY_CAPTURE=true python examples/unittesting/unittesting.py

which sets HoverPy in capture mode, and creates our all important requests.db. This process may take around 10 seconds depending on your internet speed. Now when we rerun our unit tests, we’re always running against the data we captured in requests.db.

$ python examples/unittesting/unittesting.py

This time we are done in around 100ms! Not to mention: no more unnecessary breakages.