Skip to main content

rsttst makes your reStructuredText testable

Project description

https://img.shields.io/badge/rsttst-testable-brightgreen.svg https://travis-ci.org/willemt/rsttst.png https://pypip.in/version/rsttst/badge.svg https://pypip.in/download/rsttst/badge.svg

rsttst makes your reStructuredText documentation testable.

In fact, this README file is testable and is used to test rsttst.

If your tests document how your system works, why not formally combine your tests and documentation into one?

Below is an example:

2 + 2 = 4

The title “2 + 2 = 4” becomes the test name after being converted to a Python friendly identifier (ie. 2_plus_2_equals_4).

The bash code in the below code block will be run…

echo '2 + 2' | bc

…and the resulting stdout will be compared to the following code block:

4

The test fails if stdout doesn’t match the block above.

Dotted notation

Sometimes you want to be flexible with the output you accept.

You can use “.” and the “:class: dotted” rst directive option to support this.

echo Date: $(date)
echo '\ok'

The below code block uses the “:class: dotted” option.

Date: ............................
\ok

Three dots match in a similiar way to what you’d expect for a regex pattern of “.+” to work:

echo '<NZ>'
echo $(date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S")

The below code block uses the “:class: dotted” option.

<...>
DATE: ... TIME: ...

Generating tests

Under the hood rsttst generates Python code which is executable with py.test. Here’s how we generate the Python test code:

rsttst README.rst
cat test_readme.py | head -n 28

The resulting test code looks like the following:

# -*- coding: utf-8 -*-
from rsttst.core import run, Dotted

def test_2_plus_2_equals_4():
    output = run(u"""echo '2 + 2' | bc""")
    assert output == u"""4"""

def test_dotted_notation():
    output = run(u"""echo Date: $(date)
echo '\\ok'""")
    expected = Dotted(u"""Date: ............................
\\ok""")
    cmp(output, expected)
    expected = u"{0}".format(expected)
    assert output == expected

def test_dotted_notation__2():
    output = run(u"""echo '<NZ>'
echo $(date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S")""")
    expected = Dotted(u"""<...>
DATE: ... TIME: ...""")
    cmp(output, expected)
    expected = u"{0}".format(expected)
    assert output == expected

def test_generating_tests():
    output = run(u"""rsttst README.rst
cat test_readme.py | head -n 28""")

Windows new lines

^M characters are automatically removed.

printf 'supports\012\015windows new lines'
supports
windows new lines

Ignore code-blocks

Sometimes you want to use a code-block without it being tested by rsttst.

You can use the “:class: ignore” directive to ignore this code-block:

.. code-block:: bash
   :class: ignore

Running the tests

You could probably use another test runner, but pytest works quite well:

py.test -k 'not test_running_the_tests' | grep -v seconds

Note: we had to exclude ‘test_running_the_tests’, otherwise it’s turtles all the way down.

============================= test session starts ==============================
platform ...
collected 6 items

test_readme.py .....

============= 1 tests deselected by '-knot test_running_the_tests' =============

Functionality

Right now rsttst only supports bash testing.

FAQ

Why does pytest throw an “IndexError: list index out of range” exception for my JSON tests?

Please upgrade to the latest version of pytest

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

rsttst-0.3.0.tar.gz (7.6 kB view details)

Uploaded Source

Built Distribution

rsttst-0.3.0-py2.py3-none-any.whl (11.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file rsttst-0.3.0.tar.gz.

File metadata

  • Download URL: rsttst-0.3.0.tar.gz
  • Upload date:
  • Size: 7.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for rsttst-0.3.0.tar.gz
Algorithm Hash digest
SHA256 d4acb2a4999bf9ed0b6f32dab3c24c2b8ac9750a9632d9eef477fbfb5bb1f94a
MD5 825af886e036353813975e6a694e53c4
BLAKE2b-256 b5d9fed43b27554822d8dd227f290707ae06eabf223a79522a27a1e1469994f3

See more details on using hashes here.

File details

Details for the file rsttst-0.3.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for rsttst-0.3.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 2f09053580d2a8362646c81830bd9066f81b19ae23ae8c3b62fc3ffab84e61ee
MD5 27a7cb0b056c8fadf088fa3509204cc6
BLAKE2b-256 a9e3b24da4071897d9bf9a3fec1cdfba0da2b0d85d8c66b932c542d71b97890e

See more details on using hashes here.

Supported by

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