Doctest
   HOME

TheInfoList



OR:

doctest is a module included in the
Python Python may refer to: Snakes * Pythonidae, a family of nonvenomous snakes found in Africa, Asia, and Australia ** ''Python'' (genus), a genus of Pythonidae found in Africa and Asia * Python (mythology), a mythical serpent Computing * Python (pro ...
programming language's standard library that allows the easy generation of tests based on output from the standard Python interpreter shell, cut and pasted into
docstring In programming, a docstring is a string literal specified in source code that is used, like a comment, to document a specific segment of code. Unlike conventional source code comments, or even specifically formatted comments like docblocks, docst ...
s.


Implementation specifics

Doctest makes innovative use of the following Python capabilities:docstring-driven testing
/ref> *
docstring In programming, a docstring is a string literal specified in source code that is used, like a comment, to document a specific segment of code. Unlike conventional source code comments, or even specifically formatted comments like docblocks, docst ...
s * The Python interactive shell (both command line and the included idle application) * Python introspection When using the Python shell, the primary prompt: >>> , is followed by new commands. The secondary prompt: ... , is used when continuing commands on multiple lines; and the result of executing the command is expected on following lines. A blank line, or another line starting with the primary prompt is seen as the end of the output from the command. The doctest module looks for such sequences of prompts in a docstring, re-executes the extracted command and checks the output against the output of the command given in the docstrings test example. The default action when running doctests is for no output to be shown when tests pass. This can be modified by options to the doctest runner. In addition, doctest has been integrated with the Python unit test module allowing doctests to be run as standard unittest testcases. Unittest testcase runners allow more options when running tests such as the reporting of test statistics such as tests passed, and failed.


Literate programming Literate programming is a programming paradigm introduced in 1984 by Donald Knuth in which a computer program is given as an explanation of its logic in a natural language, such as English, interspersed (embedded) with snippets of macros and t ...
and doctests

Although doctest does not allow a Python program to be embedded in narrative text, it does allow for verifiable examples to be embedded in docstrings, where the docstrings can contain other text. Docstrings can in turn be extracted from program files to generate documentation in other formats such as HTML or PDF. A program file can be made to contain the documentation, tests, as well as the code and the tests easily verified against the code. This allows code, tests, and documentation to evolve together.


Documenting libraries by example

Doctests are well suited to provide an introduction to a library by demonstrating how the API is used. On the basis of the output of Python's interactive interpreter, text can be mixed with tests that exercise the library, showing expected results.


Examples

Example one shows how narrative text can be interspersed with testable examples in a docstring. In the second example, more features of doctest are shown, together with their explanation. Example three is set up to run all doctests in a file when the file is run, but when imported as a module, the tests will not be run.


Example 1: A doctest embedded in the docstring of a function

def list_to_0_index(lst): """A solution to the problem given in: https://rgrig.blogspot.com/2005/11/writing-readable-code.html 'Given a list, lst, say for each element the 0-index where it appears for the first time. So the list x = , 1, 4, 2, 4, 1, 0, 2is transformed into y = , 1, 2, 3, 2, 1, 0, 3 Notice that for all i we have x [i_=_x[i.html" ;"title=".html" ;"title="[i">[i = x[i">.html" ;"title="[i">[i = x[i Use any programming language and any data representation you want.' >>> x = [0, 1, 4, 2, 4, 1, 0, 2] >>> list_to_0_index(x) [0, 1, 2, 3, 2, 1, 0, 3] >>> """ return [lst.index(i) for i in lst]


Example 2: doctests embedded in a README.txt file


Demonstration doctests


This is just an example of what a README text looks like that can be used with the doctest.DocFileSuite() function from Python's doctest module. Normally, the README file would explain the API of the module, like this: >>> a = 1 >>> b = 2 >>> a + b 3 Notice, that we just demonstrated how to add two numbers in Python, and what the result will look like. A special option allows you to be somewhat fuzzy about your examples: >>> o = object() >>> o # doctest: +ELLIPSIS Exceptions can be tested very nicely too: >>> x Traceback (most recent call last): ... NameError: name 'x' is not defined


Example 3: unique_words.py

This example also simulates input to the function from a file by using the Python StringIO module def unique_words(page): """Return set of the unique words in list of lines of text. Example: >>> from StringIO import StringIO >>> fileText = """the cat sat on the mat ... the mat was ondur the cat ... one fish two fish red fish ... blue fish ... This fish has a yellow car ... This fish has a yellow star""" >>> file = StringIO(fileText) >>> page = file.readlines() >>> words = unique_words(page) >>> print sorted(list(words)) This", "a", "blue", "car", "cat", "fish", "has", "mat", "on", "ondur", "one", "red", "sat", "star", "the", "two", "was", "yellow" >>> """ return set(word for line in page for word in line.split()) def _test(): import doctest doctest.testmod() if __name__

"__main__": _test()


Doctest and documentation generators

Both the EpyText format of
Epydoc Epydoc is a documentation generator that processes its own lightweight markup language Epytext for Python documentation strings. As opposed to freeform Python docstrings, reStructuredText (both also supported) and other markup languages for docst ...
and Docutils'
reStructuredText reStructuredText (RST, ReST, or reST) is a file format for textual data used primarily in the Python programming language community for technical documentation. It is part of the Docutils project of the Python Doc-SIG (Documentation Special Inte ...
format support the markup of doctest sections within docstrings.


Implementation in other programming languages

In C++, the doctest framework is the closest possible implementation of the concept - tests can be written directly in the production code with minimal overhead and the option to strip them from the binary.C++ github.com/onqtam/doctest
/ref> The ExUnit.DocTest
Elixir ELIXIR (the European life-sciences Infrastructure for biological Information) is an initiative that will allow life science laboratories across Europe to share and store their research data as part of an organised network. Its goal is to bring t ...
library implements functionality similar to Doctest.Elixir ExUnit.DocTest
/ref> An implementation of Doctest for
Haskell Haskell () is a general-purpose, statically-typed, purely functional programming language with type inference and lazy evaluation. Designed for teaching, research and industrial applications, Haskell has pioneered a number of programming lang ...
.Haskell github.com/sol/doctest
/ref> Writing documentation tests in
Elm Elms are deciduous and semi-deciduous trees comprising the flowering plant genus ''Ulmus'' in the plant family Ulmaceae. They are distributed over most of the Northern Hemisphere, inhabiting the temperate and tropical-montane regions of North ...
.Elm github.com/tshm/elm-doctest
/ref> Writing documentation tests in
Rust Rust is an iron oxide, a usually reddish-brown oxide formed by the reaction of iron and oxygen in the catalytic presence of water or air moisture. Rust consists of hydrous iron(III) oxides (Fe2O3·nH2O) and iron(III) oxide-hydroxide (FeO(OH ...
.Documentation tests in Rust
/ref> Writing documentation tests in
Elixir ELIXIR (the European life-sciences Infrastructure for biological Information) is an initiative that will allow life science laboratories across Europe to share and store their research data as part of an organised network. Its goal is to bring t ...
.Elixir Doctests
/ref> byexamplebyexamples.github.io/byexample
/ref> supports writing doctests for several popular programming languages (e.g. Python, Ruby, Shell, JavaScript, C/C++, Java, Go, Rust) inside
Markdown Markdown is a lightweight markup language for creating formatted text using a plain-text editor. John Gruber and Aaron Swartz created Markdown in 2004 as a markup language that is appealing to human readers in its source code form. Markdown is ...
,
reStructuredText reStructuredText (RST, ReST, or reST) is a file format for textual data used primarily in the Python programming language community for technical documentation. It is part of the Docutils project of the Python Doc-SIG (Documentation Special Inte ...
and other text documents.


References

* * {{Reflist


External links

* https://docs.python.org/3/library/doctest.html Software testing tools Technical communication Articles with example Python (programming language) code