Skip to main content

Trestle: doctest for ReST(ful services)

Project description

Trestle: doctest for REST(ful services)
---------------------------------------

About
~~~~~

Trestle is a nose plugin that enables you to write testable documentation for
web apps (or shell commands, but more on that later).

To use trestle, write a reStructured Text document (like this one) using a
set of special directives to indicate the **fixtures** to be used for testing
(including the http or mock http client), each **request** to be sent via the
client, and the **expected response** from the application under test.

A simple trestle test document might look like this::

Frog: A web service for doing things with frogs
-----------------------------------------------

.. fixtures :: frog_fixtures

Frog is a web service for doing things with frogs.

You can list the available frogs.

.. request :: List available frogs

GET /frogs
..

The response is in a plain-text format.

.. response ::

bullfrog
poison dart
treefrog
...
..

You can find out if something is a frog.

.. request :: Get bullfrog details

GET /frogs/bullfrog
..

If the requested term is a frog, details about the frog will be returned.

.. response ::

Bullfrogs are really big frogs.
..

Otherwise, a 404 response is returned.

.. request :: Get details for a non-frog

GET /frogs/toad
..

.. response ::

404 ...
...

"toad" is not a frog.
..

You can create frogs.

.. request :: Create a frog

POST /frogs/pouched+frog
A pouched frog camouflages itself to look like dead leaves.
..

.. response ::

201 Created
...

...
..

Trestle directives
^^^^^^^^^^^^^^^^^^

Fixtures for a trestle test file are set like so::

.. fixtures:: about

A fixtures directive is required in every document to be tested. The
directive must name a python module. The module must include the
following attribute:

client
A client application to be called with methods .get(), .post(),
.put(), etc. Each method must accept at least the arguments url and
data, and may accept others but may not require
them. paste.fixtures.TestApp is such a client, though it natively
supports only .get() and .post().

And may include the following functions:

setup_all(cls)
Setup fixture run before the first request.

teardown_all(cls)
Teardown fixture run after the last request.

setup_each(inst)
Setup fixture run before each request.

teardown_each(inst)
Teardown fixture run after each request.

Tests in a trestle document consist of a ``.. request`` directive, followed by
one or more ``.. response`` directives. The ``.. request`` directive defines
the request to be sent to the web app under test, using the client defined in
the fixtures module.

A simple request directive looks like this::

.. request:: A simple get

GET /foo/bar
..

If the request is a POST or PUT that includes data to be sent, include
that data in the body of the request, after the request line::

.. request:: A post

POST /foo/bar
a=1&b=2
..

The response expected to be returned to the client is defined using a
response block::

.. response::

Ponies!!1!
..


.. note:: Conclude each block with ``..`` alone on a line to avoid rst parsing
errors that can result in text following a block being thrown away.

The testing process is simple: each request is executed using the
client defined in the fixtures module, and each expected response
following that request in the text is compared against the actual
response. If all responses match, the test passes. Otherwise, it
fails.

.. raw:: html

<p>Passing examples are given a <span class="pass">pleasing green
background</span>, failures a <span class="fail">sinister red</span>.
Details of the failed match are included following the
failed example.</p>


Fixture commands
^^^^^^^^^^^^^^^^

At times it may be necessary to execute a unique fixture before executing a
request. While it's usually better to make the test depend only on public apis
and not internal details or externalities, sometimes (e.g. when testing
time-dependent operations) that isn't possible or reasonable. For those times,
use the **:setup:** argument to the request. The body of the exec argument
will be evaluated in the context of the fixture module before running the
request. Naturally, there is also a **:teardown:** argument, which will be
executed after the request is run and the response processed. Here's an
example::

.. request:: Get something special
:setup: client.set_special(true)
:teardown: client.set_special(false)

GET /special
..


Shell examples
^^^^^^^^^^^^^^

Trestle also supports shell examples. When a shell example is executed, the
shell command given is executed, and the stdout produced by the command is
compared to the body of the ``..shell`` example using the normal doctest
output checker. A simple shell example looks like this::

.. shell :: echo "Hello"

Hello
..

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

trestle-0.1.tar.gz (31.6 kB view details)

Uploaded Source

File details

Details for the file trestle-0.1.tar.gz.

File metadata

  • Download URL: trestle-0.1.tar.gz
  • Upload date:
  • Size: 31.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for trestle-0.1.tar.gz
Algorithm Hash digest
SHA256 477c715c397938849827ac21aa73a9c666dd2e3c047093111059f01f18994d8e
MD5 8e0cf5f0d9ad436de623c2a024ac4e3a
BLAKE2b-256 e1c82607a7f5da832639864b0387c93ae281d97779883aba2521b33e2014438e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page