.. _getting_started: Getting Started =============== The first step is to make sure Betamax is right for you. Let's start by answering the following questions - Are you using `Requests`_? If you're not using Requests, Betamax is not for you. You should checkout `VCRpy`_. - Are you using Sessions or are you using the functional API (e.g., ``requests.get``)? If you're using the functional API, and aren't willing to use Sessions, Betamax is not *yet* for you. So if you're using Requests and you're using Sessions, you're in the right place. Betamax officially supports `py.test`_ and `unittest`_ but it should integrate well with nose as well. Installation ------------ .. code-block:: bash $ pip install betamax Configuration ------------- When starting with Betamax, you need to tell it where to store the cassettes that it creates. There's two ways to do this: 1. If you're using :class:`~betamax.recorder.Betamax` or :class:`~betamax.decorator.use_cassette` you can pass the ``cassette_library_dir`` option. For example, .. code-block:: python import betamax import requests session = requests.Session() recorder = betamax.Betamax(session, cassette_library_dir='cassettes') with recorder.use_cassette('introduction'): # ... 2. You can do it once, globally, for your test suite. .. code-block:: python import betamax with betamax.Betamax.configure() as config: config.cassette_library_dir = 'cassettes' .. note:: If you don't set a cassette directory, Betamax won't save cassettes to disk There are other configuration options that *can* be provided, but this is the only one that is *required*. Recording Your First Cassette ----------------------------- Let's make a file named ``our_first_recorded_session.py``. Let's add the following to our file: .. literalinclude:: ../examples/our_first_recorded_session.py :language: python If we then run our script, we'll see that a new file is created in our specified cassette directory. It should look something like: .. literalinclude:: ../examples/cassettes/our-first-recorded-session.json :language: javascript Now, each subsequent time that we run that script, we will use the recorded interaction instead of talking to the internet over and over again. Recording More Complex Cassettes -------------------------------- Most times we cannot isolate our tests to a single request at a time, so we'll have cassettes that make multiple requests. Betamax can handle these with ease, let's take a look at an example. .. literalinclude:: ../examples/more_complicated_cassettes.py :language: python Before we run this example, we have to install a new package: ``betamax-serializers``, e.g., ``pip install betamax-serializers``. If we now run our new example, we'll see a new file appear in our :file:`examples/cassettes/` directory named :file:`more-complicated-cassettes.json`. This cassette will be much larger as a result of making 3 requests and receiving 3 responses. You'll also notice that we imported :mod:`betamax_serializers.pretty_json` and called :meth:`~betamax.Betamax.register_serializer` with :class:`~betamax_serializers.pretty_json.PrettyJSONSerializer`. Then we added a keyword argument to our invocation of :meth:`~betamax.Betamax.use_cassette`, ``serialize_with='prettyjson'``. :class:`~betamax_serializers.pretty_json.PrettyJSONSerializer` is a class provided by the ``betamax-serializers`` package on PyPI that can serialize and deserialize cassette data into JSON while allowing it to be easily human readable and pretty. Let's see the results: .. literalinclude:: ../examples/cassettes/more-complicated-cassettes.json :language: javascript This makes the cassette easy to read and helps us recognize that requests and responses are paired together. We'll explore cassettes more a bit later. .. links .. _Requests: http://docs.python-requests.org/ .. _VCRpy: https://github.com/kevin1024/vcrpy .. _py.test: http://pytest.org/ .. _unittest: https://docs.python.org/3/library/unittest.html