1890 lines
175 KiB
HTML
1890 lines
175 KiB
HTML
|
|
|||
|
<!DOCTYPE html>
|
|||
|
|
|||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|||
|
<head>
|
|||
|
<meta charset="utf-8" />
|
|||
|
<title>doctest — Test interactive Python examples — Python 3.7.4 documentation</title>
|
|||
|
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
|||
|
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
|||
|
|
|||
|
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
|||
|
<script type="text/javascript" src="../_static/jquery.js"></script>
|
|||
|
<script type="text/javascript" src="../_static/underscore.js"></script>
|
|||
|
<script type="text/javascript" src="../_static/doctools.js"></script>
|
|||
|
<script type="text/javascript" src="../_static/language_data.js"></script>
|
|||
|
|
|||
|
<script type="text/javascript" src="../_static/sidebar.js"></script>
|
|||
|
|
|||
|
<link rel="search" type="application/opensearchdescription+xml"
|
|||
|
title="Search within Python 3.7.4 documentation"
|
|||
|
href="../_static/opensearch.xml"/>
|
|||
|
<link rel="author" title="About these documents" href="../about.html" />
|
|||
|
<link rel="index" title="Index" href="../genindex.html" />
|
|||
|
<link rel="search" title="Search" href="../search.html" />
|
|||
|
<link rel="copyright" title="Copyright" href="../copyright.html" />
|
|||
|
<link rel="next" title="unittest — Unit testing framework" href="unittest.html" />
|
|||
|
<link rel="prev" title="pydoc — Documentation generator and online help system" href="pydoc.html" />
|
|||
|
<link rel="shortcut icon" type="image/png" href="../_static/py.png" />
|
|||
|
<link rel="canonical" href="https://docs.python.org/3/library/doctest.html" />
|
|||
|
|
|||
|
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
|||
|
<script type="text/javascript" src="../_static/switchers.js"></script>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<style>
|
|||
|
@media only screen {
|
|||
|
table.full-width-table {
|
|||
|
width: 100%;
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|
|||
|
|
|||
|
|
|||
|
</head><body>
|
|||
|
|
|||
|
<div class="related" role="navigation" aria-label="related navigation">
|
|||
|
<h3>Navigation</h3>
|
|||
|
<ul>
|
|||
|
<li class="right" style="margin-right: 10px">
|
|||
|
<a href="../genindex.html" title="General Index"
|
|||
|
accesskey="I">index</a></li>
|
|||
|
<li class="right" >
|
|||
|
<a href="../py-modindex.html" title="Python Module Index"
|
|||
|
>modules</a> |</li>
|
|||
|
<li class="right" >
|
|||
|
<a href="unittest.html" title="unittest — Unit testing framework"
|
|||
|
accesskey="N">next</a> |</li>
|
|||
|
<li class="right" >
|
|||
|
<a href="pydoc.html" title="pydoc — Documentation generator and online help system"
|
|||
|
accesskey="P">previous</a> |</li>
|
|||
|
<li><img src="../_static/py.png" alt=""
|
|||
|
style="vertical-align: middle; margin-top: -1px"/></li>
|
|||
|
<li><a href="https://www.python.org/">Python</a> »</li>
|
|||
|
<li>
|
|||
|
<span class="language_switcher_placeholder">en</span>
|
|||
|
<span class="version_switcher_placeholder">3.7.4</span>
|
|||
|
<a href="../index.html">Documentation </a> »
|
|||
|
</li>
|
|||
|
|
|||
|
<li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> »</li>
|
|||
|
<li class="nav-item nav-item-2"><a href="development.html" accesskey="U">Development Tools</a> »</li>
|
|||
|
<li class="right">
|
|||
|
|
|||
|
|
|||
|
<div class="inline-search" style="display: none" role="search">
|
|||
|
<form class="inline-search" action="../search.html" method="get">
|
|||
|
<input placeholder="Quick search" type="text" name="q" />
|
|||
|
<input type="submit" value="Go" />
|
|||
|
<input type="hidden" name="check_keywords" value="yes" />
|
|||
|
<input type="hidden" name="area" value="default" />
|
|||
|
</form>
|
|||
|
</div>
|
|||
|
<script type="text/javascript">$('.inline-search').show(0);</script>
|
|||
|
|
|
|||
|
</li>
|
|||
|
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="document">
|
|||
|
<div class="documentwrapper">
|
|||
|
<div class="bodywrapper">
|
|||
|
<div class="body" role="main">
|
|||
|
|
|||
|
<div class="section" id="module-doctest">
|
|||
|
<span id="doctest-test-interactive-python-examples"></span><h1><a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> — Test interactive Python examples<a class="headerlink" href="#module-doctest" title="Permalink to this headline">¶</a></h1>
|
|||
|
<p><strong>Source code:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.7/Lib/doctest.py">Lib/doctest.py</a></p>
|
|||
|
<hr class="docutils" />
|
|||
|
<p>The <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> module searches for pieces of text that look like interactive
|
|||
|
Python sessions, and then executes those sessions to verify that they work
|
|||
|
exactly as shown. There are several common ways to use doctest:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p>To check that a module’s docstrings are up-to-date by verifying that all
|
|||
|
interactive examples still work as documented.</p></li>
|
|||
|
<li><p>To perform regression testing by verifying that interactive examples from a
|
|||
|
test file or a test object work as expected.</p></li>
|
|||
|
<li><p>To write tutorial documentation for a package, liberally illustrated with
|
|||
|
input-output examples. Depending on whether the examples or the expository text
|
|||
|
are emphasized, this has the flavor of “literate testing” or “executable
|
|||
|
documentation”.</p></li>
|
|||
|
</ul>
|
|||
|
<p>Here’s a complete but small example module:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="sd">"""</span>
|
|||
|
<span class="sd">This is the "example" module.</span>
|
|||
|
|
|||
|
<span class="sd">The example module supplies one function, factorial(). For example,</span>
|
|||
|
|
|||
|
<span class="sd">>>> factorial(5)</span>
|
|||
|
<span class="sd">120</span>
|
|||
|
<span class="sd">"""</span>
|
|||
|
|
|||
|
<span class="k">def</span> <span class="nf">factorial</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
|||
|
<span class="sd">"""Return the factorial of n, an exact integer >= 0.</span>
|
|||
|
|
|||
|
<span class="sd"> >>> [factorial(n) for n in range(6)]</span>
|
|||
|
<span class="sd"> [1, 1, 2, 6, 24, 120]</span>
|
|||
|
<span class="sd"> >>> factorial(30)</span>
|
|||
|
<span class="sd"> 265252859812191058636308480000000</span>
|
|||
|
<span class="sd"> >>> factorial(-1)</span>
|
|||
|
<span class="sd"> Traceback (most recent call last):</span>
|
|||
|
<span class="sd"> ...</span>
|
|||
|
<span class="sd"> ValueError: n must be >= 0</span>
|
|||
|
|
|||
|
<span class="sd"> Factorials of floats are OK, but the float must be an exact integer:</span>
|
|||
|
<span class="sd"> >>> factorial(30.1)</span>
|
|||
|
<span class="sd"> Traceback (most recent call last):</span>
|
|||
|
<span class="sd"> ...</span>
|
|||
|
<span class="sd"> ValueError: n must be exact integer</span>
|
|||
|
<span class="sd"> >>> factorial(30.0)</span>
|
|||
|
<span class="sd"> 265252859812191058636308480000000</span>
|
|||
|
|
|||
|
<span class="sd"> It must also not be ridiculously large:</span>
|
|||
|
<span class="sd"> >>> factorial(1e100)</span>
|
|||
|
<span class="sd"> Traceback (most recent call last):</span>
|
|||
|
<span class="sd"> ...</span>
|
|||
|
<span class="sd"> OverflowError: n too large</span>
|
|||
|
<span class="sd"> """</span>
|
|||
|
|
|||
|
<span class="kn">import</span> <span class="nn">math</span>
|
|||
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">n</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|||
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"n must be >= 0"</span><span class="p">)</span>
|
|||
|
<span class="k">if</span> <span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">!=</span> <span class="n">n</span><span class="p">:</span>
|
|||
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"n must be exact integer"</span><span class="p">)</span>
|
|||
|
<span class="k">if</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span> <span class="o">==</span> <span class="n">n</span><span class="p">:</span> <span class="c1"># catch a value like 1e300</span>
|
|||
|
<span class="k">raise</span> <span class="ne">OverflowError</span><span class="p">(</span><span class="s2">"n too large"</span><span class="p">)</span>
|
|||
|
<span class="n">result</span> <span class="o">=</span> <span class="mi">1</span>
|
|||
|
<span class="n">factor</span> <span class="o">=</span> <span class="mi">2</span>
|
|||
|
<span class="k">while</span> <span class="n">factor</span> <span class="o"><=</span> <span class="n">n</span><span class="p">:</span>
|
|||
|
<span class="n">result</span> <span class="o">*=</span> <span class="n">factor</span>
|
|||
|
<span class="n">factor</span> <span class="o">+=</span> <span class="mi">1</span>
|
|||
|
<span class="k">return</span> <span class="n">result</span>
|
|||
|
|
|||
|
|
|||
|
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
|
|||
|
<span class="kn">import</span> <span class="nn">doctest</span>
|
|||
|
<span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>If you run <code class="file docutils literal notranslate"><span class="pre">example.py</span></code> directly from the command line, <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a>
|
|||
|
works its magic:</p>
|
|||
|
<div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$</span> python example.py
|
|||
|
<span class="gp">$</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>There’s no output! That’s normal, and it means all the examples worked. Pass
|
|||
|
<code class="docutils literal notranslate"><span class="pre">-v</span></code> to the script, and <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> prints a detailed log of what
|
|||
|
it’s trying, and prints a summary at the end:</p>
|
|||
|
<div class="highlight-shell-session notranslate"><div class="highlight"><pre><span></span><span class="gp">$</span> python example.py -v
|
|||
|
<span class="go">Trying:</span>
|
|||
|
<span class="go"> factorial(5)</span>
|
|||
|
<span class="go">Expecting:</span>
|
|||
|
<span class="go"> 120</span>
|
|||
|
<span class="go">ok</span>
|
|||
|
<span class="go">Trying:</span>
|
|||
|
<span class="go"> [factorial(n) for n in range(6)]</span>
|
|||
|
<span class="go">Expecting:</span>
|
|||
|
<span class="go"> [1, 1, 2, 6, 24, 120]</span>
|
|||
|
<span class="go">ok</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>And so on, eventually ending with:</p>
|
|||
|
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>Trying:
|
|||
|
factorial(1e100)
|
|||
|
Expecting:
|
|||
|
Traceback (most recent call last):
|
|||
|
...
|
|||
|
OverflowError: n too large
|
|||
|
ok
|
|||
|
2 items passed all tests:
|
|||
|
1 tests in __main__
|
|||
|
8 tests in __main__.factorial
|
|||
|
9 tests in 2 items.
|
|||
|
9 passed and 0 failed.
|
|||
|
Test passed.
|
|||
|
$
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>That’s all you need to know to start making productive use of <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a>!
|
|||
|
Jump in. The following sections provide full details. Note that there are many
|
|||
|
examples of doctests in the standard Python test suite and libraries.
|
|||
|
Especially useful examples can be found in the standard test file
|
|||
|
<code class="file docutils literal notranslate"><span class="pre">Lib/test/test_doctest.py</span></code>.</p>
|
|||
|
<div class="section" id="simple-usage-checking-examples-in-docstrings">
|
|||
|
<span id="doctest-simple-testmod"></span><h2>Simple Usage: Checking Examples in Docstrings<a class="headerlink" href="#simple-usage-checking-examples-in-docstrings" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>The simplest way to start using doctest (but not necessarily the way you’ll
|
|||
|
continue to do it) is to end each module <code class="xref py py-mod docutils literal notranslate"><span class="pre">M</span></code> with:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">"__main__"</span><span class="p">:</span>
|
|||
|
<span class="kn">import</span> <span class="nn">doctest</span>
|
|||
|
<span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p><a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> then examines docstrings in module <code class="xref py py-mod docutils literal notranslate"><span class="pre">M</span></code>.</p>
|
|||
|
<p>Running the module as a script causes the examples in the docstrings to get
|
|||
|
executed and verified:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">M</span><span class="o">.</span><span class="n">py</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>This won’t display anything unless an example fails, in which case the failing
|
|||
|
example(s) and the cause(s) of the failure(s) are printed to stdout, and the
|
|||
|
final line of output is <code class="docutils literal notranslate"><span class="pre">***Test</span> <span class="pre">Failed***</span> <span class="pre">N</span> <span class="pre">failures.</span></code>, where <em>N</em> is the
|
|||
|
number of examples that failed.</p>
|
|||
|
<p>Run it with the <code class="docutils literal notranslate"><span class="pre">-v</span></code> switch instead:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="n">M</span><span class="o">.</span><span class="n">py</span> <span class="o">-</span><span class="n">v</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>and a detailed report of all examples tried is printed to standard output, along
|
|||
|
with assorted summaries at the end.</p>
|
|||
|
<p>You can force verbose mode by passing <code class="docutils literal notranslate"><span class="pre">verbose=True</span></code> to <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>, or
|
|||
|
prohibit it by passing <code class="docutils literal notranslate"><span class="pre">verbose=False</span></code>. In either of those cases,
|
|||
|
<code class="docutils literal notranslate"><span class="pre">sys.argv</span></code> is not examined by <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a> (so passing <code class="docutils literal notranslate"><span class="pre">-v</span></code> or not
|
|||
|
has no effect).</p>
|
|||
|
<p>There is also a command line shortcut for running <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>. You can
|
|||
|
instruct the Python interpreter to run the doctest module directly from the
|
|||
|
standard library and pass the module name(s) on the command line:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">doctest</span> <span class="o">-</span><span class="n">v</span> <span class="n">example</span><span class="o">.</span><span class="n">py</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>This will import <code class="file docutils literal notranslate"><span class="pre">example.py</span></code> as a standalone module and run
|
|||
|
<a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a> on it. Note that this may not work correctly if the file is
|
|||
|
part of a package and imports other submodules from that package.</p>
|
|||
|
<p>For more information on <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>, see section <a class="reference internal" href="#doctest-basic-api"><span class="std std-ref">Basic API</span></a>.</p>
|
|||
|
</div>
|
|||
|
<div class="section" id="simple-usage-checking-examples-in-a-text-file">
|
|||
|
<span id="doctest-simple-testfile"></span><h2>Simple Usage: Checking Examples in a Text File<a class="headerlink" href="#simple-usage-checking-examples-in-a-text-file" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>Another simple application of doctest is testing interactive examples in a text
|
|||
|
file. This can be done with the <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> function:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">doctest</span>
|
|||
|
<span class="n">doctest</span><span class="o">.</span><span class="n">testfile</span><span class="p">(</span><span class="s2">"example.txt"</span><span class="p">)</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>That short script executes and verifies any interactive Python examples
|
|||
|
contained in the file <code class="file docutils literal notranslate"><span class="pre">example.txt</span></code>. The file content is treated as if it
|
|||
|
were a single giant docstring; the file doesn’t need to contain a Python
|
|||
|
program! For example, perhaps <code class="file docutils literal notranslate"><span class="pre">example.txt</span></code> contains this:</p>
|
|||
|
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>The ``example`` module
|
|||
|
======================
|
|||
|
|
|||
|
Using ``factorial``
|
|||
|
-------------------
|
|||
|
|
|||
|
This is an example text file in reStructuredText format. First import
|
|||
|
``factorial`` from the ``example`` module:
|
|||
|
|
|||
|
>>> from example import factorial
|
|||
|
|
|||
|
Now use it:
|
|||
|
|
|||
|
>>> factorial(6)
|
|||
|
120
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Running <code class="docutils literal notranslate"><span class="pre">doctest.testfile("example.txt")</span></code> then finds the error in this
|
|||
|
documentation:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">File</span> <span class="s2">"./example.txt"</span><span class="p">,</span> <span class="n">line</span> <span class="mi">14</span><span class="p">,</span> <span class="ow">in</span> <span class="n">example</span><span class="o">.</span><span class="n">txt</span>
|
|||
|
<span class="n">Failed</span> <span class="n">example</span><span class="p">:</span>
|
|||
|
<span class="n">factorial</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span>
|
|||
|
<span class="n">Expected</span><span class="p">:</span>
|
|||
|
<span class="mi">120</span>
|
|||
|
<span class="n">Got</span><span class="p">:</span>
|
|||
|
<span class="mi">720</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>As with <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>, <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> won’t display anything unless an
|
|||
|
example fails. If an example does fail, then the failing example(s) and the
|
|||
|
cause(s) of the failure(s) are printed to stdout, using the same format as
|
|||
|
<a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>.</p>
|
|||
|
<p>By default, <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> looks for files in the calling module’s directory.
|
|||
|
See section <a class="reference internal" href="#doctest-basic-api"><span class="std std-ref">Basic API</span></a> for a description of the optional arguments
|
|||
|
that can be used to tell it to look for files in other locations.</p>
|
|||
|
<p>Like <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>, <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a>’s verbosity can be set with the
|
|||
|
<code class="docutils literal notranslate"><span class="pre">-v</span></code> command-line switch or with the optional keyword argument
|
|||
|
<em>verbose</em>.</p>
|
|||
|
<p>There is also a command line shortcut for running <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a>. You can
|
|||
|
instruct the Python interpreter to run the doctest module directly from the
|
|||
|
standard library and pass the file name(s) on the command line:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">doctest</span> <span class="o">-</span><span class="n">v</span> <span class="n">example</span><span class="o">.</span><span class="n">txt</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Because the file name does not end with <code class="file docutils literal notranslate"><span class="pre">.py</span></code>, <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> infers that
|
|||
|
it must be run with <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a>, not <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>.</p>
|
|||
|
<p>For more information on <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a>, see section <a class="reference internal" href="#doctest-basic-api"><span class="std std-ref">Basic API</span></a>.</p>
|
|||
|
</div>
|
|||
|
<div class="section" id="how-it-works">
|
|||
|
<span id="doctest-how-it-works"></span><h2>How It Works<a class="headerlink" href="#how-it-works" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>This section examines in detail how doctest works: which docstrings it looks at,
|
|||
|
how it finds interactive examples, what execution context it uses, how it
|
|||
|
handles exceptions, and how option flags can be used to control its behavior.
|
|||
|
This is the information that you need to know to write doctest examples; for
|
|||
|
information about actually running doctest on these examples, see the following
|
|||
|
sections.</p>
|
|||
|
<div class="section" id="which-docstrings-are-examined">
|
|||
|
<span id="doctest-which-docstrings"></span><h3>Which Docstrings Are Examined?<a class="headerlink" href="#which-docstrings-are-examined" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p>The module docstring, and all function, class and method docstrings are
|
|||
|
searched. Objects imported into the module are not searched.</p>
|
|||
|
<p>In addition, if <code class="docutils literal notranslate"><span class="pre">M.__test__</span></code> exists and “is true”, it must be a dict, and each
|
|||
|
entry maps a (string) name to a function object, class object, or string.
|
|||
|
Function and class object docstrings found from <code class="docutils literal notranslate"><span class="pre">M.__test__</span></code> are searched, and
|
|||
|
strings are treated as if they were docstrings. In output, a key <code class="docutils literal notranslate"><span class="pre">K</span></code> in
|
|||
|
<code class="docutils literal notranslate"><span class="pre">M.__test__</span></code> appears with name</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">name</span> <span class="n">of</span> <span class="n">M</span><span class="o">>.</span><span class="n">__test__</span><span class="o">.</span><span class="n">K</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Any classes found are recursively searched similarly, to test docstrings in
|
|||
|
their contained methods and nested classes.</p>
|
|||
|
<div class="impl-detail compound">
|
|||
|
<p><strong>CPython implementation detail:</strong> Prior to version 3.4, extension modules written in C were not fully
|
|||
|
searched by doctest.</p>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="section" id="how-are-docstring-examples-recognized">
|
|||
|
<span id="doctest-finding-examples"></span><h3>How are Docstring Examples Recognized?<a class="headerlink" href="#how-are-docstring-examples-recognized" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p>In most cases a copy-and-paste of an interactive console session works fine,
|
|||
|
but doctest isn’t trying to do an exact emulation of any specific Python shell.</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># comments are ignored</span>
|
|||
|
<span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="mi">12</span>
|
|||
|
<span class="gp">>>> </span><span class="n">x</span>
|
|||
|
<span class="go">12</span>
|
|||
|
<span class="gp">>>> </span><span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">13</span><span class="p">:</span>
|
|||
|
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"yes"</span><span class="p">)</span>
|
|||
|
<span class="gp">... </span><span class="k">else</span><span class="p">:</span>
|
|||
|
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"no"</span><span class="p">)</span>
|
|||
|
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"NO"</span><span class="p">)</span>
|
|||
|
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"NO!!!"</span><span class="p">)</span>
|
|||
|
<span class="gp">...</span>
|
|||
|
<span class="go">no</span>
|
|||
|
<span class="go">NO</span>
|
|||
|
<span class="go">NO!!!</span>
|
|||
|
<span class="go">>>></span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p id="index-0">Any expected output must immediately follow the final <code class="docutils literal notranslate"><span class="pre">'>>></span> <span class="pre">'</span></code> or <code class="docutils literal notranslate"><span class="pre">'...</span> <span class="pre">'</span></code>
|
|||
|
line containing the code, and the expected output (if any) extends to the next
|
|||
|
<code class="docutils literal notranslate"><span class="pre">'>>></span> <span class="pre">'</span></code> or all-whitespace line.</p>
|
|||
|
<p>The fine print:</p>
|
|||
|
<ul>
|
|||
|
<li><p>Expected output cannot contain an all-whitespace line, since such a line is
|
|||
|
taken to signal the end of expected output. If expected output does contain a
|
|||
|
blank line, put <code class="docutils literal notranslate"><span class="pre"><BLANKLINE></span></code> in your doctest example each place a blank line
|
|||
|
is expected.</p></li>
|
|||
|
<li><p>All hard tab characters are expanded to spaces, using 8-column tab stops.
|
|||
|
Tabs in output generated by the tested code are not modified. Because any
|
|||
|
hard tabs in the sample output <em>are</em> expanded, this means that if the code
|
|||
|
output includes hard tabs, the only way the doctest can pass is if the
|
|||
|
<a class="reference internal" href="#doctest.NORMALIZE_WHITESPACE" title="doctest.NORMALIZE_WHITESPACE"><code class="xref py py-const docutils literal notranslate"><span class="pre">NORMALIZE_WHITESPACE</span></code></a> option or <a class="reference internal" href="#doctest-directives"><span class="std std-ref">directive</span></a>
|
|||
|
is in effect.
|
|||
|
Alternatively, the test can be rewritten to capture the output and compare it
|
|||
|
to an expected value as part of the test. This handling of tabs in the
|
|||
|
source was arrived at through trial and error, and has proven to be the least
|
|||
|
error prone way of handling them. It is possible to use a different
|
|||
|
algorithm for handling tabs by writing a custom <a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> class.</p></li>
|
|||
|
<li><p>Output to stdout is captured, but not output to stderr (exception tracebacks
|
|||
|
are captured via a different means).</p></li>
|
|||
|
<li><p>If you continue a line via backslashing in an interactive session, or for any
|
|||
|
other reason use a backslash, you should use a raw docstring, which will
|
|||
|
preserve your backslashes exactly as you type them:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
|||
|
<span class="gp">... </span> <span class="sa">r</span><span class="sd">'''Backslashes in a raw docstring: m\n'''</span>
|
|||
|
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
|
|||
|
<span class="go">Backslashes in a raw docstring: m\n</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Otherwise, the backslash will be interpreted as part of the string. For example,
|
|||
|
the <code class="docutils literal notranslate"><span class="pre">\n</span></code> above would be interpreted as a newline character. Alternatively, you
|
|||
|
can double each backslash in the doctest version (and not use a raw string):</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
|||
|
<span class="gp">... </span> <span class="sd">'''Backslashes in a raw docstring: m\\n'''</span>
|
|||
|
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
|
|||
|
<span class="go">Backslashes in a raw docstring: m\n</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
</li>
|
|||
|
<li><p>The starting column doesn’t matter:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">assert</span> <span class="s2">"Easy!"</span>
|
|||
|
<span class="go"> >>> import math</span>
|
|||
|
<span class="go"> >>> math.floor(1.9)</span>
|
|||
|
<span class="go"> 1</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>and as many leading whitespace characters are stripped from the expected output
|
|||
|
as appeared in the initial <code class="docutils literal notranslate"><span class="pre">'>>></span> <span class="pre">'</span></code> line that started the example.</p>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
<div class="section" id="what-s-the-execution-context">
|
|||
|
<span id="doctest-execution-context"></span><h3>What’s the Execution Context?<a class="headerlink" href="#what-s-the-execution-context" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p>By default, each time <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> finds a docstring to test, it uses a
|
|||
|
<em>shallow copy</em> of <code class="xref py py-mod docutils literal notranslate"><span class="pre">M</span></code>’s globals, so that running tests doesn’t change the
|
|||
|
module’s real globals, and so that one test in <code class="xref py py-mod docutils literal notranslate"><span class="pre">M</span></code> can’t leave behind
|
|||
|
crumbs that accidentally allow another test to work. This means examples can
|
|||
|
freely use any names defined at top-level in <code class="xref py py-mod docutils literal notranslate"><span class="pre">M</span></code>, and names defined earlier
|
|||
|
in the docstring being run. Examples cannot see names defined in other
|
|||
|
docstrings.</p>
|
|||
|
<p>You can force use of your own dict as the execution context by passing
|
|||
|
<code class="docutils literal notranslate"><span class="pre">globs=your_dict</span></code> to <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a> or <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> instead.</p>
|
|||
|
</div>
|
|||
|
<div class="section" id="what-about-exceptions">
|
|||
|
<span id="doctest-exceptions"></span><h3>What About Exceptions?<a class="headerlink" href="#what-about-exceptions" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p>No problem, provided that the traceback is the only output produced by the
|
|||
|
example: just paste in the traceback. <a class="footnote-reference brackets" href="#id2" id="id1">1</a> Since tracebacks contain details
|
|||
|
that are likely to change rapidly (for example, exact file paths and line
|
|||
|
numbers), this is one case where doctest works hard to be flexible in what it
|
|||
|
accepts.</p>
|
|||
|
<p>Simple example:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
|
|||
|
<span class="gt">Traceback (most recent call last):</span>
|
|||
|
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
|||
|
<span class="gr">ValueError</span>: <span class="n">list.remove(x): x not in list</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>That doctest succeeds if <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> is raised, with the <code class="docutils literal notranslate"><span class="pre">list.remove(x):</span>
|
|||
|
<span class="pre">x</span> <span class="pre">not</span> <span class="pre">in</span> <span class="pre">list</span></code> detail as shown.</p>
|
|||
|
<p>The expected output for an exception must start with a traceback header, which
|
|||
|
may be either of the following two lines, indented the same as the first line of
|
|||
|
the example:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">Traceback</span> <span class="p">(</span><span class="n">most</span> <span class="n">recent</span> <span class="n">call</span> <span class="n">last</span><span class="p">):</span>
|
|||
|
<span class="n">Traceback</span> <span class="p">(</span><span class="n">innermost</span> <span class="n">last</span><span class="p">):</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>The traceback header is followed by an optional traceback stack, whose contents
|
|||
|
are ignored by doctest. The traceback stack is typically omitted, or copied
|
|||
|
verbatim from an interactive session.</p>
|
|||
|
<p>The traceback stack is followed by the most interesting part: the line(s)
|
|||
|
containing the exception type and detail. This is usually the last line of a
|
|||
|
traceback, but can extend across multiple lines if the exception has a
|
|||
|
multi-line detail:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'multi</span><span class="se">\n</span><span class="s1"> line</span><span class="se">\n</span><span class="s1">detail'</span><span class="p">)</span>
|
|||
|
<span class="gt">Traceback (most recent call last):</span>
|
|||
|
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
|||
|
<span class="gr">ValueError</span>: <span class="n">multi</span>
|
|||
|
<span class="go"> line</span>
|
|||
|
<span class="go">detail</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>The last three lines (starting with <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>) are compared against the
|
|||
|
exception’s type and detail, and the rest are ignored.</p>
|
|||
|
<p>Best practice is to omit the traceback stack, unless it adds significant
|
|||
|
documentation value to the example. So the last example is probably better as:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'multi</span><span class="se">\n</span><span class="s1"> line</span><span class="se">\n</span><span class="s1">detail'</span><span class="p">)</span>
|
|||
|
<span class="gt">Traceback (most recent call last):</span>
|
|||
|
<span class="o">...</span>
|
|||
|
<span class="gr">ValueError</span>: <span class="n">multi</span>
|
|||
|
<span class="go"> line</span>
|
|||
|
<span class="go">detail</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Note that tracebacks are treated very specially. In particular, in the
|
|||
|
rewritten example, the use of <code class="docutils literal notranslate"><span class="pre">...</span></code> is independent of doctest’s
|
|||
|
<a class="reference internal" href="#doctest.ELLIPSIS" title="doctest.ELLIPSIS"><code class="xref py py-const docutils literal notranslate"><span class="pre">ELLIPSIS</span></code></a> option. The ellipsis in that example could be left out, or
|
|||
|
could just as well be three (or three hundred) commas or digits, or an indented
|
|||
|
transcript of a Monty Python skit.</p>
|
|||
|
<p>Some details you should read once, but won’t need to remember:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p>Doctest can’t guess whether your expected output came from an exception
|
|||
|
traceback or from ordinary printing. So, e.g., an example that expects
|
|||
|
<code class="docutils literal notranslate"><span class="pre">ValueError:</span> <span class="pre">42</span> <span class="pre">is</span> <span class="pre">prime</span></code> will pass whether <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> is actually
|
|||
|
raised or if the example merely prints that traceback text. In practice,
|
|||
|
ordinary output rarely begins with a traceback header line, so this doesn’t
|
|||
|
create real problems.</p></li>
|
|||
|
<li><p>Each line of the traceback stack (if present) must be indented further than
|
|||
|
the first line of the example, <em>or</em> start with a non-alphanumeric character.
|
|||
|
The first line following the traceback header indented the same and starting
|
|||
|
with an alphanumeric is taken to be the start of the exception detail. Of
|
|||
|
course this does the right thing for genuine tracebacks.</p></li>
|
|||
|
<li><p>When the <a class="reference internal" href="#doctest.IGNORE_EXCEPTION_DETAIL" title="doctest.IGNORE_EXCEPTION_DETAIL"><code class="xref py py-const docutils literal notranslate"><span class="pre">IGNORE_EXCEPTION_DETAIL</span></code></a> doctest option is specified,
|
|||
|
everything following the leftmost colon and any module information in the
|
|||
|
exception name is ignored.</p></li>
|
|||
|
<li><p>The interactive shell omits the traceback header line for some
|
|||
|
<a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>s. But doctest uses the traceback header line to
|
|||
|
distinguish exceptions from non-exceptions. So in the rare case where you need
|
|||
|
to test a <a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a> that omits the traceback header, you will need to
|
|||
|
manually add the traceback header line to your test example.</p></li>
|
|||
|
</ul>
|
|||
|
<ul id="index-1">
|
|||
|
<li><p>For some <a class="reference internal" href="exceptions.html#SyntaxError" title="SyntaxError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">SyntaxError</span></code></a>s, Python displays the character position of the
|
|||
|
syntax error, using a <code class="docutils literal notranslate"><span class="pre">^</span></code> marker:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mi">1</span> <span class="mi">1</span>
|
|||
|
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>
|
|||
|
<span class="mi">1</span> <span class="mi">1</span>
|
|||
|
<span class="o">^</span>
|
|||
|
<span class="gr">SyntaxError</span>: <span class="n">invalid syntax</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Since the lines showing the position of the error come before the exception type
|
|||
|
and detail, they are not checked by doctest. For example, the following test
|
|||
|
would pass, even though it puts the <code class="docutils literal notranslate"><span class="pre">^</span></code> marker in the wrong location:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mi">1</span> <span class="mi">1</span>
|
|||
|
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>
|
|||
|
<span class="mi">1</span> <span class="mi">1</span>
|
|||
|
<span class="o">^</span>
|
|||
|
<span class="gr">SyntaxError</span>: <span class="n">invalid syntax</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
<div class="section" id="option-flags">
|
|||
|
<span id="doctest-options"></span><span id="option-flags-and-directives"></span><h3>Option Flags<a class="headerlink" href="#option-flags" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p>A number of option flags control various aspects of doctest’s behavior.
|
|||
|
Symbolic names for the flags are supplied as module constants, which can be
|
|||
|
<a class="reference internal" href="../reference/expressions.html#bitwise"><span class="std std-ref">bitwise ORed</span></a> together and passed to various functions.
|
|||
|
The names can also be used in <a class="reference internal" href="#doctest-directives"><span class="std std-ref">doctest directives</span></a>,
|
|||
|
and may be passed to the doctest command line interface via the <code class="docutils literal notranslate"><span class="pre">-o</span></code> option.</p>
|
|||
|
<div class="versionadded">
|
|||
|
<p><span class="versionmodified added">New in version 3.4: </span>The <code class="docutils literal notranslate"><span class="pre">-o</span></code> command line option.</p>
|
|||
|
</div>
|
|||
|
<p>The first group of options define test semantics, controlling aspects of how
|
|||
|
doctest decides whether actual output matches an example’s expected output:</p>
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.DONT_ACCEPT_TRUE_FOR_1">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">DONT_ACCEPT_TRUE_FOR_1</code><a class="headerlink" href="#doctest.DONT_ACCEPT_TRUE_FOR_1" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>By default, if an expected output block contains just <code class="docutils literal notranslate"><span class="pre">1</span></code>, an actual output
|
|||
|
block containing just <code class="docutils literal notranslate"><span class="pre">1</span></code> or just <code class="docutils literal notranslate"><span class="pre">True</span></code> is considered to be a match, and
|
|||
|
similarly for <code class="docutils literal notranslate"><span class="pre">0</span></code> versus <code class="docutils literal notranslate"><span class="pre">False</span></code>. When <a class="reference internal" href="#doctest.DONT_ACCEPT_TRUE_FOR_1" title="doctest.DONT_ACCEPT_TRUE_FOR_1"><code class="xref py py-const docutils literal notranslate"><span class="pre">DONT_ACCEPT_TRUE_FOR_1</span></code></a> is
|
|||
|
specified, neither substitution is allowed. The default behavior caters to that
|
|||
|
Python changed the return type of many functions from integer to boolean;
|
|||
|
doctests expecting “little integer” output still work in these cases. This
|
|||
|
option will probably go away, but not for several years.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<span class="target" id="index-2"></span><dl class="data">
|
|||
|
<dt id="doctest.DONT_ACCEPT_BLANKLINE">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">DONT_ACCEPT_BLANKLINE</code><a class="headerlink" href="#doctest.DONT_ACCEPT_BLANKLINE" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>By default, if an expected output block contains a line containing only the
|
|||
|
string <code class="docutils literal notranslate"><span class="pre"><BLANKLINE></span></code>, then that line will match a blank line in the actual
|
|||
|
output. Because a genuinely blank line delimits the expected output, this is
|
|||
|
the only way to communicate that a blank line is expected. When
|
|||
|
<a class="reference internal" href="#doctest.DONT_ACCEPT_BLANKLINE" title="doctest.DONT_ACCEPT_BLANKLINE"><code class="xref py py-const docutils literal notranslate"><span class="pre">DONT_ACCEPT_BLANKLINE</span></code></a> is specified, this substitution is not allowed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.NORMALIZE_WHITESPACE">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">NORMALIZE_WHITESPACE</code><a class="headerlink" href="#doctest.NORMALIZE_WHITESPACE" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, all sequences of whitespace (blanks and newlines) are treated as
|
|||
|
equal. Any sequence of whitespace within the expected output will match any
|
|||
|
sequence of whitespace within the actual output. By default, whitespace must
|
|||
|
match exactly. <a class="reference internal" href="#doctest.NORMALIZE_WHITESPACE" title="doctest.NORMALIZE_WHITESPACE"><code class="xref py py-const docutils literal notranslate"><span class="pre">NORMALIZE_WHITESPACE</span></code></a> is especially useful when a line of
|
|||
|
expected output is very long, and you want to wrap it across multiple lines in
|
|||
|
your source.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<span class="target" id="index-3"></span><dl class="data">
|
|||
|
<dt id="doctest.ELLIPSIS">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">ELLIPSIS</code><a class="headerlink" href="#doctest.ELLIPSIS" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, an ellipsis marker (<code class="docutils literal notranslate"><span class="pre">...</span></code>) in the expected output can match
|
|||
|
any substring in the actual output. This includes substrings that span line
|
|||
|
boundaries, and empty substrings, so it’s best to keep usage of this simple.
|
|||
|
Complicated uses can lead to the same kinds of “oops, it matched too much!”
|
|||
|
surprises that <code class="docutils literal notranslate"><span class="pre">.*</span></code> is prone to in regular expressions.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.IGNORE_EXCEPTION_DETAIL">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">IGNORE_EXCEPTION_DETAIL</code><a class="headerlink" href="#doctest.IGNORE_EXCEPTION_DETAIL" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, an example that expects an exception passes if an exception of
|
|||
|
the expected type is raised, even if the exception detail does not match. For
|
|||
|
example, an example expecting <code class="docutils literal notranslate"><span class="pre">ValueError:</span> <span class="pre">42</span></code> will pass if the actual
|
|||
|
exception raised is <code class="docutils literal notranslate"><span class="pre">ValueError:</span> <span class="pre">3*14</span></code>, but will fail, e.g., if
|
|||
|
<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a> is raised.</p>
|
|||
|
<p>It will also ignore the module name used in Python 3 doctest reports. Hence
|
|||
|
both of these variations will work with the flag specified, regardless of
|
|||
|
whether the test is run under Python 2.7 or Python 3.2 (or later versions):</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">raise</span> <span class="n">CustomError</span><span class="p">(</span><span class="s1">'message'</span><span class="p">)</span>
|
|||
|
<span class="gt">Traceback (most recent call last):</span>
|
|||
|
<span class="gr">CustomError</span>: <span class="n">message</span>
|
|||
|
|
|||
|
<span class="gp">>>> </span><span class="k">raise</span> <span class="n">CustomError</span><span class="p">(</span><span class="s1">'message'</span><span class="p">)</span>
|
|||
|
<span class="gt">Traceback (most recent call last):</span>
|
|||
|
<span class="gr">my_module.CustomError</span>: <span class="n">message</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Note that <a class="reference internal" href="#doctest.ELLIPSIS" title="doctest.ELLIPSIS"><code class="xref py py-const docutils literal notranslate"><span class="pre">ELLIPSIS</span></code></a> can also be used to ignore the
|
|||
|
details of the exception message, but such a test may still fail based
|
|||
|
on whether or not the module details are printed as part of the
|
|||
|
exception name. Using <a class="reference internal" href="#doctest.IGNORE_EXCEPTION_DETAIL" title="doctest.IGNORE_EXCEPTION_DETAIL"><code class="xref py py-const docutils literal notranslate"><span class="pre">IGNORE_EXCEPTION_DETAIL</span></code></a> and the details
|
|||
|
from Python 2.3 is also the only clear way to write a doctest that doesn’t
|
|||
|
care about the exception detail yet continues to pass under Python 2.3 or
|
|||
|
earlier (those releases do not support <a class="reference internal" href="#doctest-directives"><span class="std std-ref">doctest directives</span></a> and ignore them as irrelevant comments). For example:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">)[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'moo'</span>
|
|||
|
<span class="gt">Traceback (most recent call last):</span>
|
|||
|
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
|||
|
<span class="gr">TypeError</span>: <span class="n">object doesn't support item assignment</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>passes under Python 2.3 and later Python versions with the flag specified,
|
|||
|
even though the detail
|
|||
|
changed in Python 2.4 to say “does not” instead of “doesn’t”.</p>
|
|||
|
<div class="versionchanged">
|
|||
|
<p><span class="versionmodified changed">Changed in version 3.2: </span><a class="reference internal" href="#doctest.IGNORE_EXCEPTION_DETAIL" title="doctest.IGNORE_EXCEPTION_DETAIL"><code class="xref py py-const docutils literal notranslate"><span class="pre">IGNORE_EXCEPTION_DETAIL</span></code></a> now also ignores any information relating
|
|||
|
to the module containing the exception under test.</p>
|
|||
|
</div>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.SKIP">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">SKIP</code><a class="headerlink" href="#doctest.SKIP" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, do not run the example at all. This can be useful in contexts
|
|||
|
where doctest examples serve as both documentation and test cases, and an
|
|||
|
example should be included for documentation purposes, but should not be
|
|||
|
checked. E.g., the example’s output might be random; or the example might
|
|||
|
depend on resources which would be unavailable to the test driver.</p>
|
|||
|
<p>The SKIP flag can also be used for temporarily “commenting out” examples.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.COMPARISON_FLAGS">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">COMPARISON_FLAGS</code><a class="headerlink" href="#doctest.COMPARISON_FLAGS" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A bitmask or’ing together all the comparison flags above.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p>The second group of options controls how test failures are reported:</p>
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.REPORT_UDIFF">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">REPORT_UDIFF</code><a class="headerlink" href="#doctest.REPORT_UDIFF" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, failures that involve multi-line expected and actual outputs are
|
|||
|
displayed using a unified diff.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.REPORT_CDIFF">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">REPORT_CDIFF</code><a class="headerlink" href="#doctest.REPORT_CDIFF" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, failures that involve multi-line expected and actual outputs
|
|||
|
will be displayed using a context diff.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.REPORT_NDIFF">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">REPORT_NDIFF</code><a class="headerlink" href="#doctest.REPORT_NDIFF" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, differences are computed by <code class="docutils literal notranslate"><span class="pre">difflib.Differ</span></code>, using the same
|
|||
|
algorithm as the popular <code class="file docutils literal notranslate"><span class="pre">ndiff.py</span></code> utility. This is the only method that
|
|||
|
marks differences within lines as well as across lines. For example, if a line
|
|||
|
of expected output contains digit <code class="docutils literal notranslate"><span class="pre">1</span></code> where actual output contains letter
|
|||
|
<code class="docutils literal notranslate"><span class="pre">l</span></code>, a line is inserted with a caret marking the mismatching column positions.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.REPORT_ONLY_FIRST_FAILURE">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">REPORT_ONLY_FIRST_FAILURE</code><a class="headerlink" href="#doctest.REPORT_ONLY_FIRST_FAILURE" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, display the first failing example in each doctest, but suppress
|
|||
|
output for all remaining examples. This will prevent doctest from reporting
|
|||
|
correct examples that break because of earlier failures; but it might also hide
|
|||
|
incorrect examples that fail independently of the first failure. When
|
|||
|
<a class="reference internal" href="#doctest.REPORT_ONLY_FIRST_FAILURE" title="doctest.REPORT_ONLY_FIRST_FAILURE"><code class="xref py py-const docutils literal notranslate"><span class="pre">REPORT_ONLY_FIRST_FAILURE</span></code></a> is specified, the remaining examples are
|
|||
|
still run, and still count towards the total number of failures reported; only
|
|||
|
the output is suppressed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.FAIL_FAST">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">FAIL_FAST</code><a class="headerlink" href="#doctest.FAIL_FAST" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>When specified, exit after the first failing example and don’t attempt to run
|
|||
|
the remaining examples. Thus, the number of failures reported will be at most
|
|||
|
1. This flag may be useful during debugging, since examples after the first
|
|||
|
failure won’t even produce debugging output.</p>
|
|||
|
<p>The doctest command line accepts the option <code class="docutils literal notranslate"><span class="pre">-f</span></code> as a shorthand for <code class="docutils literal notranslate"><span class="pre">-o</span>
|
|||
|
<span class="pre">FAIL_FAST</span></code>.</p>
|
|||
|
<div class="versionadded">
|
|||
|
<p><span class="versionmodified added">New in version 3.4.</span></p>
|
|||
|
</div>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="data">
|
|||
|
<dt id="doctest.REPORTING_FLAGS">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">REPORTING_FLAGS</code><a class="headerlink" href="#doctest.REPORTING_FLAGS" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A bitmask or’ing together all the reporting flags above.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p>There is also a way to register new option flag names, though this isn’t
|
|||
|
useful unless you intend to extend <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> internals via subclassing:</p>
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.register_optionflag">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">register_optionflag</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.register_optionflag" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Create a new option flag with a given name, and return the new flag’s integer
|
|||
|
value. <a class="reference internal" href="#doctest.register_optionflag" title="doctest.register_optionflag"><code class="xref py py-func docutils literal notranslate"><span class="pre">register_optionflag()</span></code></a> can be used when subclassing
|
|||
|
<a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a> or <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to create new options that are
|
|||
|
supported by your subclasses. <a class="reference internal" href="#doctest.register_optionflag" title="doctest.register_optionflag"><code class="xref py py-func docutils literal notranslate"><span class="pre">register_optionflag()</span></code></a> should always be
|
|||
|
called using the following idiom:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">MY_FLAG</span> <span class="o">=</span> <span class="n">register_optionflag</span><span class="p">(</span><span class="s1">'MY_FLAG'</span><span class="p">)</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="directives">
|
|||
|
<span id="doctest-directives"></span><span id="index-4"></span><h3>Directives<a class="headerlink" href="#directives" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p>Doctest directives may be used to modify the <a class="reference internal" href="#doctest-options"><span class="std std-ref">option flags</span></a> for an individual example. Doctest directives are
|
|||
|
special Python comments following an example’s source code:</p>
|
|||
|
<pre>
|
|||
|
<strong id="grammar-token-directive">directive </strong> ::= "#" "doctest:" <a class="reference internal" href="#grammar-token-directive-options"><code class="xref docutils literal notranslate"><span class="pre">directive_options</span></code></a>
|
|||
|
<strong id="grammar-token-directive-options">directive_options </strong> ::= <a class="reference internal" href="#grammar-token-directive-option"><code class="xref docutils literal notranslate"><span class="pre">directive_option</span></code></a> ("," <a class="reference internal" href="#grammar-token-directive-option"><code class="xref docutils literal notranslate"><span class="pre">directive_option</span></code></a>)\*
|
|||
|
<strong id="grammar-token-directive-option">directive_option </strong> ::= <a class="reference internal" href="#grammar-token-on-or-off"><code class="xref docutils literal notranslate"><span class="pre">on_or_off</span></code></a> <a class="reference internal" href="#grammar-token-directive-option-name"><code class="xref docutils literal notranslate"><span class="pre">directive_option_name</span></code></a>
|
|||
|
<strong id="grammar-token-on-or-off">on_or_off </strong> ::= "+" \| "-"
|
|||
|
<strong id="grammar-token-directive-option-name">directive_option_name</strong> ::= "DONT_ACCEPT_BLANKLINE" \| "NORMALIZE_WHITESPACE" \| ...
|
|||
|
</pre>
|
|||
|
<p>Whitespace is not allowed between the <code class="docutils literal notranslate"><span class="pre">+</span></code> or <code class="docutils literal notranslate"><span class="pre">-</span></code> and the directive option
|
|||
|
name. The directive option name can be any of the option flag names explained
|
|||
|
above.</p>
|
|||
|
<p>An example’s doctest directives modify doctest’s behavior for that single
|
|||
|
example. Use <code class="docutils literal notranslate"><span class="pre">+</span></code> to enable the named behavior, or <code class="docutils literal notranslate"><span class="pre">-</span></code> to disable it.</p>
|
|||
|
<p>For example, this test passes:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)))</span>
|
|||
|
<span class="go">[0, 1, 2, 3, 4, 5, 6, 7, 8, 9,</span>
|
|||
|
<span class="go">10, 11, 12, 13, 14, 15, 16, 17, 18, 19]</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Without the directive it would fail, both because the actual output doesn’t have
|
|||
|
two blanks before the single-digit list elements, and because the actual output
|
|||
|
is on a single line. This test also passes, and also requires a directive to do
|
|||
|
so:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)))</span>
|
|||
|
<span class="go">[0, 1, ..., 18, 19]</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Multiple directives can be used on a single physical line, separated by
|
|||
|
commas:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)))</span>
|
|||
|
<span class="go">[0, 1, ..., 18, 19]</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>If multiple directive comments are used for a single example, then they are
|
|||
|
combined:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">)))</span>
|
|||
|
<span class="gp">... </span>
|
|||
|
<span class="go">[0, 1, ..., 18, 19]</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>As the previous example shows, you can add <code class="docutils literal notranslate"><span class="pre">...</span></code> lines to your example
|
|||
|
containing only directives. This can be useful when an example is too long for
|
|||
|
a directive to comfortably fit on the same line:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">))</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">)))</span>
|
|||
|
<span class="gp">... </span>
|
|||
|
<span class="go">[0, ..., 4, 10, ..., 19, 30, ..., 39]</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Note that since all options are disabled by default, and directives apply only
|
|||
|
to the example they appear in, enabling options (via <code class="docutils literal notranslate"><span class="pre">+</span></code> in a directive) is
|
|||
|
usually the only meaningful choice. However, option flags can also be passed to
|
|||
|
functions that run doctests, establishing different defaults. In such cases,
|
|||
|
disabling an option via <code class="docutils literal notranslate"><span class="pre">-</span></code> in a directive can be useful.</p>
|
|||
|
</div>
|
|||
|
<div class="section" id="warnings">
|
|||
|
<span id="doctest-warnings"></span><h3>Warnings<a class="headerlink" href="#warnings" title="Permalink to this headline">¶</a></h3>
|
|||
|
<p><a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> is serious about requiring exact matches in expected output. If
|
|||
|
even a single character doesn’t match, the test fails. This will probably
|
|||
|
surprise you a few times, as you learn exactly what Python does and doesn’t
|
|||
|
guarantee about output. For example, when printing a set, Python doesn’t
|
|||
|
guarantee that the element is printed in any particular order, so a test like</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">foo</span><span class="p">()</span>
|
|||
|
<span class="go">{"Hermione", "Harry"}</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>is vulnerable! One workaround is to do</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">foo</span><span class="p">()</span> <span class="o">==</span> <span class="p">{</span><span class="s2">"Hermione"</span><span class="p">,</span> <span class="s2">"Harry"</span><span class="p">}</span>
|
|||
|
<span class="go">True</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>instead. Another is to do</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">foo</span><span class="p">())</span>
|
|||
|
<span class="gp">>>> </span><span class="n">d</span>
|
|||
|
<span class="go">['Harry', 'Hermione']</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<div class="admonition note">
|
|||
|
<p class="admonition-title">Note</p>
|
|||
|
<p>Before Python 3.6, when printing a dict, Python did not guarantee that
|
|||
|
the key-value pairs was printed in any particular order.</p>
|
|||
|
</div>
|
|||
|
<p>There are others, but you get the idea.</p>
|
|||
|
<p>Another bad idea is to print things that embed an object address, like</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">id</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span> <span class="c1"># certain to fail some of the time</span>
|
|||
|
<span class="go">7948648</span>
|
|||
|
<span class="gp">>>> </span><span class="k">class</span> <span class="nc">C</span><span class="p">:</span> <span class="k">pass</span>
|
|||
|
<span class="gp">>>> </span><span class="n">C</span><span class="p">()</span> <span class="c1"># the default repr() for instances embeds an address</span>
|
|||
|
<span class="go"><__main__.C instance at 0x00AC18F0></span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>The <a class="reference internal" href="#doctest.ELLIPSIS" title="doctest.ELLIPSIS"><code class="xref py py-const docutils literal notranslate"><span class="pre">ELLIPSIS</span></code></a> directive gives a nice approach for the last example:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">C</span><span class="p">()</span>
|
|||
|
<span class="go"><__main__.C instance at 0x...></span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Floating-point numbers are also subject to small output variations across
|
|||
|
platforms, because Python defers to the platform C library for float formatting,
|
|||
|
and C libraries vary widely in quality here.</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mf">1.</span><span class="o">/</span><span class="mi">7</span> <span class="c1"># risky</span>
|
|||
|
<span class="go">0.14285714285714285</span>
|
|||
|
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="mi">7</span><span class="p">)</span> <span class="c1"># safer</span>
|
|||
|
<span class="go">0.142857142857</span>
|
|||
|
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">round</span><span class="p">(</span><span class="mf">1.</span><span class="o">/</span><span class="mi">7</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> <span class="c1"># much safer</span>
|
|||
|
<span class="go">0.142857</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Numbers of the form <code class="docutils literal notranslate"><span class="pre">I/2.**J</span></code> are safe across all platforms, and I often
|
|||
|
contrive doctest examples to produce numbers of that form:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="mf">3.</span><span class="o">/</span><span class="mi">4</span> <span class="c1"># utterly safe</span>
|
|||
|
<span class="go">0.75</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Simple fractions are also easier for people to understand, and that makes for
|
|||
|
better documentation.</p>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="section" id="basic-api">
|
|||
|
<span id="doctest-basic-api"></span><h2>Basic API<a class="headerlink" href="#basic-api" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>The functions <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a> and <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> provide a simple interface to
|
|||
|
doctest that should be sufficient for most basic uses. For a less formal
|
|||
|
introduction to these two functions, see sections <a class="reference internal" href="#doctest-simple-testmod"><span class="std std-ref">Simple Usage: Checking Examples in Docstrings</span></a>
|
|||
|
and <a class="reference internal" href="#doctest-simple-testfile"><span class="std std-ref">Simple Usage: Checking Examples in a Text File</span></a>.</p>
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.testfile">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">testfile</code><span class="sig-paren">(</span><em>filename</em>, <em>module_relative=True</em>, <em>name=None</em>, <em>package=None</em>, <em>globs=None</em>, <em>verbose=None</em>, <em>report=True</em>, <em>optionflags=0</em>, <em>extraglobs=None</em>, <em>raise_on_error=False</em>, <em>parser=DocTestParser()</em>, <em>encoding=None</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.testfile" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>All arguments except <em>filename</em> are optional, and should be specified in keyword
|
|||
|
form.</p>
|
|||
|
<p>Test examples in the file named <em>filename</em>. Return <code class="docutils literal notranslate"><span class="pre">(failure_count,</span>
|
|||
|
<span class="pre">test_count)</span></code>.</p>
|
|||
|
<p>Optional argument <em>module_relative</em> specifies how the filename should be
|
|||
|
interpreted:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p>If <em>module_relative</em> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), then <em>filename</em> specifies an
|
|||
|
OS-independent module-relative path. By default, this path is relative to the
|
|||
|
calling module’s directory; but if the <em>package</em> argument is specified, then it
|
|||
|
is relative to that package. To ensure OS-independence, <em>filename</em> should use
|
|||
|
<code class="docutils literal notranslate"><span class="pre">/</span></code> characters to separate path segments, and may not be an absolute path
|
|||
|
(i.e., it may not begin with <code class="docutils literal notranslate"><span class="pre">/</span></code>).</p></li>
|
|||
|
<li><p>If <em>module_relative</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>, then <em>filename</em> specifies an OS-specific
|
|||
|
path. The path may be absolute or relative; relative paths are resolved with
|
|||
|
respect to the current working directory.</p></li>
|
|||
|
</ul>
|
|||
|
<p>Optional argument <em>name</em> gives the name of the test; by default, or if <code class="docutils literal notranslate"><span class="pre">None</span></code>,
|
|||
|
<code class="docutils literal notranslate"><span class="pre">os.path.basename(filename)</span></code> is used.</p>
|
|||
|
<p>Optional argument <em>package</em> is a Python package or the name of a Python package
|
|||
|
whose directory should be used as the base directory for a module-relative
|
|||
|
filename. If no package is specified, then the calling module’s directory is
|
|||
|
used as the base directory for module-relative filenames. It is an error to
|
|||
|
specify <em>package</em> if <em>module_relative</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>.</p>
|
|||
|
<p>Optional argument <em>globs</em> gives a dict to be used as the globals when executing
|
|||
|
examples. A new shallow copy of this dict is created for the doctest, so its
|
|||
|
examples start with a clean slate. By default, or if <code class="docutils literal notranslate"><span class="pre">None</span></code>, a new empty dict
|
|||
|
is used.</p>
|
|||
|
<p>Optional argument <em>extraglobs</em> gives a dict merged into the globals used to
|
|||
|
execute examples. This works like <a class="reference internal" href="stdtypes.html#dict.update" title="dict.update"><code class="xref py py-meth docutils literal notranslate"><span class="pre">dict.update()</span></code></a>: if <em>globs</em> and
|
|||
|
<em>extraglobs</em> have a common key, the associated value in <em>extraglobs</em> appears in
|
|||
|
the combined dict. By default, or if <code class="docutils literal notranslate"><span class="pre">None</span></code>, no extra globals are used. This
|
|||
|
is an advanced feature that allows parameterization of doctests. For example, a
|
|||
|
doctest can be written for a base class, using a generic name for the class,
|
|||
|
then reused to test any number of subclasses by passing an <em>extraglobs</em> dict
|
|||
|
mapping the generic name to the subclass to be tested.</p>
|
|||
|
<p>Optional argument <em>verbose</em> prints lots of stuff if true, and prints only
|
|||
|
failures if false; by default, or if <code class="docutils literal notranslate"><span class="pre">None</span></code>, it’s true if and only if <code class="docutils literal notranslate"><span class="pre">'-v'</span></code>
|
|||
|
is in <code class="docutils literal notranslate"><span class="pre">sys.argv</span></code>.</p>
|
|||
|
<p>Optional argument <em>report</em> prints a summary at the end when true, else prints
|
|||
|
nothing at the end. In verbose mode, the summary is detailed, else the summary
|
|||
|
is very brief (in fact, empty if all tests passed).</p>
|
|||
|
<p>Optional argument <em>optionflags</em> (default value 0) takes the
|
|||
|
<a class="reference internal" href="../reference/expressions.html#bitwise"><span class="std std-ref">bitwise OR</span></a> of option flags.
|
|||
|
See section <a class="reference internal" href="#doctest-options"><span class="std std-ref">Option Flags</span></a>.</p>
|
|||
|
<p>Optional argument <em>raise_on_error</em> defaults to false. If true, an exception is
|
|||
|
raised upon the first failure or unexpected exception in an example. This
|
|||
|
allows failures to be post-mortem debugged. Default behavior is to continue
|
|||
|
running examples.</p>
|
|||
|
<p>Optional argument <em>parser</em> specifies a <a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> (or subclass) that
|
|||
|
should be used to extract tests from the files. It defaults to a normal parser
|
|||
|
(i.e., <code class="docutils literal notranslate"><span class="pre">DocTestParser()</span></code>).</p>
|
|||
|
<p>Optional argument <em>encoding</em> specifies an encoding that should be used to
|
|||
|
convert the file to unicode.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.testmod">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">testmod</code><span class="sig-paren">(</span><em>m=None</em>, <em>name=None</em>, <em>globs=None</em>, <em>verbose=None</em>, <em>report=True</em>, <em>optionflags=0</em>, <em>extraglobs=None</em>, <em>raise_on_error=False</em>, <em>exclude_empty=False</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.testmod" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>All arguments are optional, and all except for <em>m</em> should be specified in
|
|||
|
keyword form.</p>
|
|||
|
<p>Test examples in docstrings in functions and classes reachable from module <em>m</em>
|
|||
|
(or module <a class="reference internal" href="__main__.html#module-__main__" title="__main__: The environment where the top-level script is run."><code class="xref py py-mod docutils literal notranslate"><span class="pre">__main__</span></code></a> if <em>m</em> is not supplied or is <code class="docutils literal notranslate"><span class="pre">None</span></code>), starting with
|
|||
|
<code class="docutils literal notranslate"><span class="pre">m.__doc__</span></code>.</p>
|
|||
|
<p>Also test examples reachable from dict <code class="docutils literal notranslate"><span class="pre">m.__test__</span></code>, if it exists and is not
|
|||
|
<code class="docutils literal notranslate"><span class="pre">None</span></code>. <code class="docutils literal notranslate"><span class="pre">m.__test__</span></code> maps names (strings) to functions, classes and
|
|||
|
strings; function and class docstrings are searched for examples; strings are
|
|||
|
searched directly, as if they were docstrings.</p>
|
|||
|
<p>Only docstrings attached to objects belonging to module <em>m</em> are searched.</p>
|
|||
|
<p>Return <code class="docutils literal notranslate"><span class="pre">(failure_count,</span> <span class="pre">test_count)</span></code>.</p>
|
|||
|
<p>Optional argument <em>name</em> gives the name of the module; by default, or if
|
|||
|
<code class="docutils literal notranslate"><span class="pre">None</span></code>, <code class="docutils literal notranslate"><span class="pre">m.__name__</span></code> is used.</p>
|
|||
|
<p>Optional argument <em>exclude_empty</em> defaults to false. If true, objects for which
|
|||
|
no doctests are found are excluded from consideration. The default is a backward
|
|||
|
compatibility hack, so that code still using <code class="xref py py-meth docutils literal notranslate"><span class="pre">doctest.master.summarize()</span></code> in
|
|||
|
conjunction with <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a> continues to get output for objects with no
|
|||
|
tests. The <em>exclude_empty</em> argument to the newer <a class="reference internal" href="#doctest.DocTestFinder" title="doctest.DocTestFinder"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestFinder</span></code></a>
|
|||
|
constructor defaults to true.</p>
|
|||
|
<p>Optional arguments <em>extraglobs</em>, <em>verbose</em>, <em>report</em>, <em>optionflags</em>,
|
|||
|
<em>raise_on_error</em>, and <em>globs</em> are the same as for function <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a>
|
|||
|
above, except that <em>globs</em> defaults to <code class="docutils literal notranslate"><span class="pre">m.__dict__</span></code>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.run_docstring_examples">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">run_docstring_examples</code><span class="sig-paren">(</span><em>f</em>, <em>globs</em>, <em>verbose=False</em>, <em>name="NoName"</em>, <em>compileflags=None</em>, <em>optionflags=0</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.run_docstring_examples" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Test examples associated with object <em>f</em>; for example, <em>f</em> may be a string,
|
|||
|
a module, a function, or a class object.</p>
|
|||
|
<p>A shallow copy of dictionary argument <em>globs</em> is used for the execution context.</p>
|
|||
|
<p>Optional argument <em>name</em> is used in failure messages, and defaults to
|
|||
|
<code class="docutils literal notranslate"><span class="pre">"NoName"</span></code>.</p>
|
|||
|
<p>If optional argument <em>verbose</em> is true, output is generated even if there are no
|
|||
|
failures. By default, output is generated only in case of an example failure.</p>
|
|||
|
<p>Optional argument <em>compileflags</em> gives the set of flags that should be used by
|
|||
|
the Python compiler when running the examples. By default, or if <code class="docutils literal notranslate"><span class="pre">None</span></code>,
|
|||
|
flags are deduced corresponding to the set of future features found in <em>globs</em>.</p>
|
|||
|
<p>Optional argument <em>optionflags</em> works as for function <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> above.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="unittest-api">
|
|||
|
<span id="doctest-unittest-api"></span><h2>Unittest API<a class="headerlink" href="#unittest-api" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>As your collection of doctest’ed modules grows, you’ll want a way to run all
|
|||
|
their doctests systematically. <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> provides two functions that can
|
|||
|
be used to create <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> test suites from modules and text files
|
|||
|
containing doctests. To integrate with <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> test discovery, include
|
|||
|
a <code class="xref py py-func docutils literal notranslate"><span class="pre">load_tests()</span></code> function in your test module:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">unittest</span>
|
|||
|
<span class="kn">import</span> <span class="nn">doctest</span>
|
|||
|
<span class="kn">import</span> <span class="nn">my_module_with_doctests</span>
|
|||
|
|
|||
|
<span class="k">def</span> <span class="nf">load_tests</span><span class="p">(</span><span class="n">loader</span><span class="p">,</span> <span class="n">tests</span><span class="p">,</span> <span class="n">ignore</span><span class="p">):</span>
|
|||
|
<span class="n">tests</span><span class="o">.</span><span class="n">addTests</span><span class="p">(</span><span class="n">doctest</span><span class="o">.</span><span class="n">DocTestSuite</span><span class="p">(</span><span class="n">my_module_with_doctests</span><span class="p">))</span>
|
|||
|
<span class="k">return</span> <span class="n">tests</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>There are two main functions for creating <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> instances
|
|||
|
from text files and modules with doctests:</p>
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.DocFileSuite">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">DocFileSuite</code><span class="sig-paren">(</span><em>*paths</em>, <em>module_relative=True</em>, <em>package=None</em>, <em>setUp=None</em>, <em>tearDown=None</em>, <em>globs=None</em>, <em>optionflags=0</em>, <em>parser=DocTestParser()</em>, <em>encoding=None</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocFileSuite" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Convert doctest tests from one or more text files to a
|
|||
|
<a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a>.</p>
|
|||
|
<p>The returned <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> is to be run by the unittest framework
|
|||
|
and runs the interactive examples in each file. If an example in any file
|
|||
|
fails, then the synthesized unit test fails, and a <code class="xref py py-exc docutils literal notranslate"><span class="pre">failureException</span></code>
|
|||
|
exception is raised showing the name of the file containing the test and a
|
|||
|
(sometimes approximate) line number.</p>
|
|||
|
<p>Pass one or more paths (as strings) to text files to be examined.</p>
|
|||
|
<p>Options may be provided as keyword arguments:</p>
|
|||
|
<p>Optional argument <em>module_relative</em> specifies how the filenames in <em>paths</em>
|
|||
|
should be interpreted:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p>If <em>module_relative</em> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), then each filename in
|
|||
|
<em>paths</em> specifies an OS-independent module-relative path. By default, this
|
|||
|
path is relative to the calling module’s directory; but if the <em>package</em>
|
|||
|
argument is specified, then it is relative to that package. To ensure
|
|||
|
OS-independence, each filename should use <code class="docutils literal notranslate"><span class="pre">/</span></code> characters to separate path
|
|||
|
segments, and may not be an absolute path (i.e., it may not begin with
|
|||
|
<code class="docutils literal notranslate"><span class="pre">/</span></code>).</p></li>
|
|||
|
<li><p>If <em>module_relative</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>, then each filename in <em>paths</em> specifies
|
|||
|
an OS-specific path. The path may be absolute or relative; relative paths
|
|||
|
are resolved with respect to the current working directory.</p></li>
|
|||
|
</ul>
|
|||
|
<p>Optional argument <em>package</em> is a Python package or the name of a Python
|
|||
|
package whose directory should be used as the base directory for
|
|||
|
module-relative filenames in <em>paths</em>. If no package is specified, then the
|
|||
|
calling module’s directory is used as the base directory for module-relative
|
|||
|
filenames. It is an error to specify <em>package</em> if <em>module_relative</em> is
|
|||
|
<code class="docutils literal notranslate"><span class="pre">False</span></code>.</p>
|
|||
|
<p>Optional argument <em>setUp</em> specifies a set-up function for the test suite.
|
|||
|
This is called before running the tests in each file. The <em>setUp</em> function
|
|||
|
will be passed a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object. The setUp function can access the
|
|||
|
test globals as the <em>globs</em> attribute of the test passed.</p>
|
|||
|
<p>Optional argument <em>tearDown</em> specifies a tear-down function for the test
|
|||
|
suite. This is called after running the tests in each file. The <em>tearDown</em>
|
|||
|
function will be passed a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object. The setUp function can
|
|||
|
access the test globals as the <em>globs</em> attribute of the test passed.</p>
|
|||
|
<p>Optional argument <em>globs</em> is a dictionary containing the initial global
|
|||
|
variables for the tests. A new copy of this dictionary is created for each
|
|||
|
test. By default, <em>globs</em> is a new empty dictionary.</p>
|
|||
|
<p>Optional argument <em>optionflags</em> specifies the default doctest options for the
|
|||
|
tests, created by or-ing together individual option flags. See section
|
|||
|
<a class="reference internal" href="#doctest-options"><span class="std std-ref">Option Flags</span></a>. See function <a class="reference internal" href="#doctest.set_unittest_reportflags" title="doctest.set_unittest_reportflags"><code class="xref py py-func docutils literal notranslate"><span class="pre">set_unittest_reportflags()</span></code></a> below
|
|||
|
for a better way to set reporting options.</p>
|
|||
|
<p>Optional argument <em>parser</em> specifies a <a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> (or subclass)
|
|||
|
that should be used to extract tests from the files. It defaults to a normal
|
|||
|
parser (i.e., <code class="docutils literal notranslate"><span class="pre">DocTestParser()</span></code>).</p>
|
|||
|
<p>Optional argument <em>encoding</em> specifies an encoding that should be used to
|
|||
|
convert the file to unicode.</p>
|
|||
|
<p>The global <code class="docutils literal notranslate"><span class="pre">__file__</span></code> is added to the globals provided to doctests loaded
|
|||
|
from a text file using <a class="reference internal" href="#doctest.DocFileSuite" title="doctest.DocFileSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocFileSuite()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.DocTestSuite">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">DocTestSuite</code><span class="sig-paren">(</span><em>module=None</em>, <em>globs=None</em>, <em>extraglobs=None</em>, <em>test_finder=None</em>, <em>setUp=None</em>, <em>tearDown=None</em>, <em>checker=None</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestSuite" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Convert doctest tests for a module to a <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a>.</p>
|
|||
|
<p>The returned <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> is to be run by the unittest framework
|
|||
|
and runs each doctest in the module. If any of the doctests fail, then the
|
|||
|
synthesized unit test fails, and a <code class="xref py py-exc docutils literal notranslate"><span class="pre">failureException</span></code> exception is raised
|
|||
|
showing the name of the file containing the test and a (sometimes approximate)
|
|||
|
line number.</p>
|
|||
|
<p>Optional argument <em>module</em> provides the module to be tested. It can be a module
|
|||
|
object or a (possibly dotted) module name. If not specified, the module calling
|
|||
|
this function is used.</p>
|
|||
|
<p>Optional argument <em>globs</em> is a dictionary containing the initial global
|
|||
|
variables for the tests. A new copy of this dictionary is created for each
|
|||
|
test. By default, <em>globs</em> is a new empty dictionary.</p>
|
|||
|
<p>Optional argument <em>extraglobs</em> specifies an extra set of global variables, which
|
|||
|
is merged into <em>globs</em>. By default, no extra globals are used.</p>
|
|||
|
<p>Optional argument <em>test_finder</em> is the <a class="reference internal" href="#doctest.DocTestFinder" title="doctest.DocTestFinder"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestFinder</span></code></a> object (or a
|
|||
|
drop-in replacement) that is used to extract doctests from the module.</p>
|
|||
|
<p>Optional arguments <em>setUp</em>, <em>tearDown</em>, and <em>optionflags</em> are the same as for
|
|||
|
function <a class="reference internal" href="#doctest.DocFileSuite" title="doctest.DocFileSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocFileSuite()</span></code></a> above.</p>
|
|||
|
<p>This function uses the same search technique as <a class="reference internal" href="#doctest.testmod" title="doctest.testmod"><code class="xref py py-func docutils literal notranslate"><span class="pre">testmod()</span></code></a>.</p>
|
|||
|
<div class="versionchanged">
|
|||
|
<p><span class="versionmodified changed">Changed in version 3.5: </span><a class="reference internal" href="#doctest.DocTestSuite" title="doctest.DocTestSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocTestSuite()</span></code></a> returns an empty <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> if <em>module</em>
|
|||
|
contains no docstrings instead of raising <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>.</p>
|
|||
|
</div>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p>Under the covers, <a class="reference internal" href="#doctest.DocTestSuite" title="doctest.DocTestSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocTestSuite()</span></code></a> creates a <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> out
|
|||
|
of <code class="xref py py-class docutils literal notranslate"><span class="pre">doctest.DocTestCase</span></code> instances, and <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code> is a
|
|||
|
subclass of <a class="reference internal" href="unittest.html#unittest.TestCase" title="unittest.TestCase"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestCase</span></code></a>. <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code> isn’t documented
|
|||
|
here (it’s an internal detail), but studying its code can answer questions about
|
|||
|
the exact details of <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> integration.</p>
|
|||
|
<p>Similarly, <a class="reference internal" href="#doctest.DocFileSuite" title="doctest.DocFileSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocFileSuite()</span></code></a> creates a <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> out of
|
|||
|
<code class="xref py py-class docutils literal notranslate"><span class="pre">doctest.DocFileCase</span></code> instances, and <code class="xref py py-class docutils literal notranslate"><span class="pre">DocFileCase</span></code> is a subclass
|
|||
|
of <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code>.</p>
|
|||
|
<p>So both ways of creating a <a class="reference internal" href="unittest.html#unittest.TestSuite" title="unittest.TestSuite"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestSuite</span></code></a> run instances of
|
|||
|
<code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code>. This is important for a subtle reason: when you run
|
|||
|
<a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> functions yourself, you can control the <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> options in
|
|||
|
use directly, by passing option flags to <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> functions. However, if
|
|||
|
you’re writing a <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> framework, <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> ultimately controls
|
|||
|
when and how tests get run. The framework author typically wants to control
|
|||
|
<a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> reporting options (perhaps, e.g., specified by command line
|
|||
|
options), but there’s no way to pass options through <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> to
|
|||
|
<a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> test runners.</p>
|
|||
|
<p>For this reason, <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> also supports a notion of <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a>
|
|||
|
reporting flags specific to <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> support, via this function:</p>
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.set_unittest_reportflags">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">set_unittest_reportflags</code><span class="sig-paren">(</span><em>flags</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.set_unittest_reportflags" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Set the <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> reporting flags to use.</p>
|
|||
|
<p>Argument <em>flags</em> takes the <a class="reference internal" href="../reference/expressions.html#bitwise"><span class="std std-ref">bitwise OR</span></a> of option flags. See
|
|||
|
section <a class="reference internal" href="#doctest-options"><span class="std std-ref">Option Flags</span></a>. Only “reporting flags” can be used.</p>
|
|||
|
<p>This is a module-global setting, and affects all future doctests run by module
|
|||
|
<a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a>: the <code class="xref py py-meth docutils literal notranslate"><span class="pre">runTest()</span></code> method of <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code> looks at
|
|||
|
the option flags specified for the test case when the <code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code>
|
|||
|
instance was constructed. If no reporting flags were specified (which is the
|
|||
|
typical and expected case), <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a>’s <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> reporting flags are
|
|||
|
<a class="reference internal" href="../reference/expressions.html#bitwise"><span class="std std-ref">bitwise ORed</span></a> into the option flags, and the option flags
|
|||
|
so augmented are passed to the <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> instance created to
|
|||
|
run the doctest. If any reporting flags were specified when the
|
|||
|
<code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestCase</span></code> instance was constructed, <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a>’s
|
|||
|
<a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> reporting flags are ignored.</p>
|
|||
|
<p>The value of the <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> reporting flags in effect before the function
|
|||
|
was called is returned by the function.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="advanced-api">
|
|||
|
<span id="doctest-advanced-api"></span><h2>Advanced API<a class="headerlink" href="#advanced-api" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>The basic API is a simple wrapper that’s intended to make doctest easy to use.
|
|||
|
It is fairly flexible, and should meet most users’ needs; however, if you
|
|||
|
require more fine-grained control over testing, or wish to extend doctest’s
|
|||
|
capabilities, then you should use the advanced API.</p>
|
|||
|
<p>The advanced API revolves around two container classes, which are used to store
|
|||
|
the interactive examples extracted from doctest cases:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p><a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a>: A single Python <a class="reference internal" href="../glossary.html#term-statement"><span class="xref std std-term">statement</span></a>, paired with its expected
|
|||
|
output.</p></li>
|
|||
|
<li><p><a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>: A collection of <a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a>s, typically extracted
|
|||
|
from a single docstring or text file.</p></li>
|
|||
|
</ul>
|
|||
|
<p>Additional processing classes are defined to find, parse, and run, and check
|
|||
|
doctest examples:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p><a class="reference internal" href="#doctest.DocTestFinder" title="doctest.DocTestFinder"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestFinder</span></code></a>: Finds all docstrings in a given module, and uses a
|
|||
|
<a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> to create a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> from every docstring that
|
|||
|
contains interactive examples.</p></li>
|
|||
|
<li><p><a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a>: Creates a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object from a string (such
|
|||
|
as an object’s docstring).</p></li>
|
|||
|
<li><p><a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a>: Executes the examples in a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>, and uses
|
|||
|
an <a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a> to verify their output.</p></li>
|
|||
|
<li><p><a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a>: Compares the actual output from a doctest example with
|
|||
|
the expected output, and decides whether they match.</p></li>
|
|||
|
</ul>
|
|||
|
<p>The relationships among these processing classes are summarized in the following
|
|||
|
diagram:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span> <span class="nb">list</span> <span class="n">of</span><span class="p">:</span>
|
|||
|
<span class="o">+------+</span> <span class="o">+---------+</span>
|
|||
|
<span class="o">|</span><span class="n">module</span><span class="o">|</span> <span class="o">--</span><span class="n">DocTestFinder</span><span class="o">-></span> <span class="o">|</span> <span class="n">DocTest</span> <span class="o">|</span> <span class="o">--</span><span class="n">DocTestRunner</span><span class="o">-></span> <span class="n">results</span>
|
|||
|
<span class="o">+------+</span> <span class="o">|</span> <span class="o">^</span> <span class="o">+---------+</span> <span class="o">|</span> <span class="o">^</span> <span class="p">(</span><span class="n">printed</span><span class="p">)</span>
|
|||
|
<span class="o">|</span> <span class="o">|</span> <span class="o">|</span> <span class="n">Example</span> <span class="o">|</span> <span class="o">|</span> <span class="o">|</span>
|
|||
|
<span class="n">v</span> <span class="o">|</span> <span class="o">|</span> <span class="o">...</span> <span class="o">|</span> <span class="n">v</span> <span class="o">|</span>
|
|||
|
<span class="n">DocTestParser</span> <span class="o">|</span> <span class="n">Example</span> <span class="o">|</span> <span class="n">OutputChecker</span>
|
|||
|
<span class="o">+---------+</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<div class="section" id="doctest-objects">
|
|||
|
<span id="doctest-doctest"></span><h3>DocTest Objects<a class="headerlink" href="#doctest-objects" title="Permalink to this headline">¶</a></h3>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.DocTest">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">DocTest</code><span class="sig-paren">(</span><em>examples</em>, <em>globs</em>, <em>name</em>, <em>filename</em>, <em>lineno</em>, <em>docstring</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTest" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A collection of doctest examples that should be run in a single namespace. The
|
|||
|
constructor arguments are used to initialize the attributes of the same names.</p>
|
|||
|
<p><a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> defines the following attributes. They are initialized by
|
|||
|
the constructor, and should not be modified directly.</p>
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTest.examples">
|
|||
|
<code class="descname">examples</code><a class="headerlink" href="#doctest.DocTest.examples" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A list of <a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a> objects encoding the individual interactive Python
|
|||
|
examples that should be run by this test.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTest.globs">
|
|||
|
<code class="descname">globs</code><a class="headerlink" href="#doctest.DocTest.globs" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The namespace (aka globals) that the examples should be run in. This is a
|
|||
|
dictionary mapping names to values. Any changes to the namespace made by the
|
|||
|
examples (such as binding new variables) will be reflected in <a class="reference internal" href="#doctest.DocTest.globs" title="doctest.DocTest.globs"><code class="xref py py-attr docutils literal notranslate"><span class="pre">globs</span></code></a>
|
|||
|
after the test is run.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTest.name">
|
|||
|
<code class="descname">name</code><a class="headerlink" href="#doctest.DocTest.name" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A string name identifying the <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>. Typically, this is the name
|
|||
|
of the object or file that the test was extracted from.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTest.filename">
|
|||
|
<code class="descname">filename</code><a class="headerlink" href="#doctest.DocTest.filename" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The name of the file that this <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> was extracted from; or
|
|||
|
<code class="docutils literal notranslate"><span class="pre">None</span></code> if the filename is unknown, or if the <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> was not
|
|||
|
extracted from a file.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTest.lineno">
|
|||
|
<code class="descname">lineno</code><a class="headerlink" href="#doctest.DocTest.lineno" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The line number within <a class="reference internal" href="#doctest.DocTest.filename" title="doctest.DocTest.filename"><code class="xref py py-attr docutils literal notranslate"><span class="pre">filename</span></code></a> where this <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> begins, or
|
|||
|
<code class="docutils literal notranslate"><span class="pre">None</span></code> if the line number is unavailable. This line number is zero-based
|
|||
|
with respect to the beginning of the file.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTest.docstring">
|
|||
|
<code class="descname">docstring</code><a class="headerlink" href="#doctest.DocTest.docstring" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The string that the test was extracted from, or <code class="docutils literal notranslate"><span class="pre">None</span></code> if the string is
|
|||
|
unavailable, or if the test was not extracted from a string.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="example-objects">
|
|||
|
<span id="doctest-example"></span><h3>Example Objects<a class="headerlink" href="#example-objects" title="Permalink to this headline">¶</a></h3>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.Example">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">Example</code><span class="sig-paren">(</span><em>source</em>, <em>want</em>, <em>exc_msg=None</em>, <em>lineno=0</em>, <em>indent=0</em>, <em>options=None</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.Example" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A single interactive example, consisting of a Python statement and its expected
|
|||
|
output. The constructor arguments are used to initialize the attributes of
|
|||
|
the same names.</p>
|
|||
|
<p><a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a> defines the following attributes. They are initialized by
|
|||
|
the constructor, and should not be modified directly.</p>
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.Example.source">
|
|||
|
<code class="descname">source</code><a class="headerlink" href="#doctest.Example.source" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A string containing the example’s source code. This source code consists of a
|
|||
|
single Python statement, and always ends with a newline; the constructor adds
|
|||
|
a newline when necessary.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.Example.want">
|
|||
|
<code class="descname">want</code><a class="headerlink" href="#doctest.Example.want" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The expected output from running the example’s source code (either from
|
|||
|
stdout, or a traceback in case of exception). <a class="reference internal" href="#doctest.Example.want" title="doctest.Example.want"><code class="xref py py-attr docutils literal notranslate"><span class="pre">want</span></code></a> ends with a
|
|||
|
newline unless no output is expected, in which case it’s an empty string. The
|
|||
|
constructor adds a newline when necessary.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.Example.exc_msg">
|
|||
|
<code class="descname">exc_msg</code><a class="headerlink" href="#doctest.Example.exc_msg" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The exception message generated by the example, if the example is expected to
|
|||
|
generate an exception; or <code class="docutils literal notranslate"><span class="pre">None</span></code> if it is not expected to generate an
|
|||
|
exception. This exception message is compared against the return value of
|
|||
|
<a class="reference internal" href="traceback.html#traceback.format_exception_only" title="traceback.format_exception_only"><code class="xref py py-func docutils literal notranslate"><span class="pre">traceback.format_exception_only()</span></code></a>. <a class="reference internal" href="#doctest.Example.exc_msg" title="doctest.Example.exc_msg"><code class="xref py py-attr docutils literal notranslate"><span class="pre">exc_msg</span></code></a> ends with a newline
|
|||
|
unless it’s <code class="docutils literal notranslate"><span class="pre">None</span></code>. The constructor adds a newline if needed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.Example.lineno">
|
|||
|
<code class="descname">lineno</code><a class="headerlink" href="#doctest.Example.lineno" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The line number within the string containing this example where the example
|
|||
|
begins. This line number is zero-based with respect to the beginning of the
|
|||
|
containing string.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.Example.indent">
|
|||
|
<code class="descname">indent</code><a class="headerlink" href="#doctest.Example.indent" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The example’s indentation in the containing string, i.e., the number of space
|
|||
|
characters that precede the example’s first prompt.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.Example.options">
|
|||
|
<code class="descname">options</code><a class="headerlink" href="#doctest.Example.options" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A dictionary mapping from option flags to <code class="docutils literal notranslate"><span class="pre">True</span></code> or <code class="docutils literal notranslate"><span class="pre">False</span></code>, which is used
|
|||
|
to override default options for this example. Any option flags not contained
|
|||
|
in this dictionary are left at their default value (as specified by the
|
|||
|
<a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a>’s <code class="xref py py-attr docutils literal notranslate"><span class="pre">optionflags</span></code>). By default, no options are set.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="doctestfinder-objects">
|
|||
|
<span id="doctest-doctestfinder"></span><h3>DocTestFinder objects<a class="headerlink" href="#doctestfinder-objects" title="Permalink to this headline">¶</a></h3>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.DocTestFinder">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">DocTestFinder</code><span class="sig-paren">(</span><em>verbose=False</em>, <em>parser=DocTestParser()</em>, <em>recurse=True</em>, <em>exclude_empty=True</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestFinder" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A processing class used to extract the <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>s that are relevant to
|
|||
|
a given object, from its docstring and the docstrings of its contained objects.
|
|||
|
<a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>s can be extracted from modules, classes, functions,
|
|||
|
methods, staticmethods, classmethods, and properties.</p>
|
|||
|
<p>The optional argument <em>verbose</em> can be used to display the objects searched by
|
|||
|
the finder. It defaults to <code class="docutils literal notranslate"><span class="pre">False</span></code> (no output).</p>
|
|||
|
<p>The optional argument <em>parser</em> specifies the <a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> object (or a
|
|||
|
drop-in replacement) that is used to extract doctests from docstrings.</p>
|
|||
|
<p>If the optional argument <em>recurse</em> is false, then <a class="reference internal" href="#doctest.DocTestFinder.find" title="doctest.DocTestFinder.find"><code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestFinder.find()</span></code></a>
|
|||
|
will only examine the given object, and not any contained objects.</p>
|
|||
|
<p>If the optional argument <em>exclude_empty</em> is false, then
|
|||
|
<a class="reference internal" href="#doctest.DocTestFinder.find" title="doctest.DocTestFinder.find"><code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestFinder.find()</span></code></a> will include tests for objects with empty docstrings.</p>
|
|||
|
<p><a class="reference internal" href="#doctest.DocTestFinder" title="doctest.DocTestFinder"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestFinder</span></code></a> defines the following method:</p>
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestFinder.find">
|
|||
|
<code class="descname">find</code><span class="sig-paren">(</span><em>obj[, name][, module][, globs][, extraglobs]</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestFinder.find" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Return a list of the <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>s that are defined by <em>obj</em>’s
|
|||
|
docstring, or by any of its contained objects’ docstrings.</p>
|
|||
|
<p>The optional argument <em>name</em> specifies the object’s name; this name will be
|
|||
|
used to construct names for the returned <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>s. If <em>name</em> is
|
|||
|
not specified, then <code class="docutils literal notranslate"><span class="pre">obj.__name__</span></code> is used.</p>
|
|||
|
<p>The optional parameter <em>module</em> is the module that contains the given object.
|
|||
|
If the module is not specified or is <code class="docutils literal notranslate"><span class="pre">None</span></code>, then the test finder will attempt
|
|||
|
to automatically determine the correct module. The object’s module is used:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p>As a default namespace, if <em>globs</em> is not specified.</p></li>
|
|||
|
<li><p>To prevent the DocTestFinder from extracting DocTests from objects that are
|
|||
|
imported from other modules. (Contained objects with modules other than
|
|||
|
<em>module</em> are ignored.)</p></li>
|
|||
|
<li><p>To find the name of the file containing the object.</p></li>
|
|||
|
<li><p>To help find the line number of the object within its file.</p></li>
|
|||
|
</ul>
|
|||
|
<p>If <em>module</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>, no attempt to find the module will be made. This is
|
|||
|
obscure, of use mostly in testing doctest itself: if <em>module</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>, or
|
|||
|
is <code class="docutils literal notranslate"><span class="pre">None</span></code> but cannot be found automatically, then all objects are considered
|
|||
|
to belong to the (non-existent) module, so all contained objects will
|
|||
|
(recursively) be searched for doctests.</p>
|
|||
|
<p>The globals for each <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> is formed by combining <em>globs</em> and
|
|||
|
<em>extraglobs</em> (bindings in <em>extraglobs</em> override bindings in <em>globs</em>). A new
|
|||
|
shallow copy of the globals dictionary is created for each <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>.
|
|||
|
If <em>globs</em> is not specified, then it defaults to the module’s <em>__dict__</em>, if
|
|||
|
specified, or <code class="docutils literal notranslate"><span class="pre">{}</span></code> otherwise. If <em>extraglobs</em> is not specified, then it
|
|||
|
defaults to <code class="docutils literal notranslate"><span class="pre">{}</span></code>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="doctestparser-objects">
|
|||
|
<span id="doctest-doctestparser"></span><h3>DocTestParser objects<a class="headerlink" href="#doctestparser-objects" title="Permalink to this headline">¶</a></h3>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.DocTestParser">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">DocTestParser</code><a class="headerlink" href="#doctest.DocTestParser" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A processing class used to extract interactive examples from a string, and use
|
|||
|
them to create a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object.</p>
|
|||
|
<p><a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> defines the following methods:</p>
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestParser.get_doctest">
|
|||
|
<code class="descname">get_doctest</code><span class="sig-paren">(</span><em>string</em>, <em>globs</em>, <em>name</em>, <em>filename</em>, <em>lineno</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestParser.get_doctest" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Extract all doctest examples from the given string, and collect them into a
|
|||
|
<a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object.</p>
|
|||
|
<p><em>globs</em>, <em>name</em>, <em>filename</em>, and <em>lineno</em> are attributes for the new
|
|||
|
<a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object. See the documentation for <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> for more
|
|||
|
information.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestParser.get_examples">
|
|||
|
<code class="descname">get_examples</code><span class="sig-paren">(</span><em>string</em>, <em>name='<string>'</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestParser.get_examples" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Extract all doctest examples from the given string, and return them as a list
|
|||
|
of <a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a> objects. Line numbers are 0-based. The optional argument
|
|||
|
<em>name</em> is a name identifying this string, and is only used for error messages.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestParser.parse">
|
|||
|
<code class="descname">parse</code><span class="sig-paren">(</span><em>string</em>, <em>name='<string>'</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestParser.parse" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Divide the given string into examples and intervening text, and return them as
|
|||
|
a list of alternating <a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a>s and strings. Line numbers for the
|
|||
|
<a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a>s are 0-based. The optional argument <em>name</em> is a name
|
|||
|
identifying this string, and is only used for error messages.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="doctestrunner-objects">
|
|||
|
<span id="doctest-doctestrunner"></span><h3>DocTestRunner objects<a class="headerlink" href="#doctestrunner-objects" title="Permalink to this headline">¶</a></h3>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.DocTestRunner">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">DocTestRunner</code><span class="sig-paren">(</span><em>checker=None</em>, <em>verbose=None</em>, <em>optionflags=0</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A processing class used to execute and verify the interactive examples in a
|
|||
|
<a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a>.</p>
|
|||
|
<p>The comparison between expected outputs and actual outputs is done by an
|
|||
|
<a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a>. This comparison may be customized with a number of
|
|||
|
option flags; see section <a class="reference internal" href="#doctest-options"><span class="std std-ref">Option Flags</span></a> for more information. If the
|
|||
|
option flags are insufficient, then the comparison may also be customized by
|
|||
|
passing a subclass of <a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a> to the constructor.</p>
|
|||
|
<p>The test runner’s display output can be controlled in two ways. First, an output
|
|||
|
function can be passed to <code class="xref py py-meth docutils literal notranslate"><span class="pre">TestRunner.run()</span></code>; this function will be called
|
|||
|
with strings that should be displayed. It defaults to <code class="docutils literal notranslate"><span class="pre">sys.stdout.write</span></code>. If
|
|||
|
capturing the output is not sufficient, then the display output can be also
|
|||
|
customized by subclassing DocTestRunner, and overriding the methods
|
|||
|
<a class="reference internal" href="#doctest.DocTestRunner.report_start" title="doctest.DocTestRunner.report_start"><code class="xref py py-meth docutils literal notranslate"><span class="pre">report_start()</span></code></a>, <a class="reference internal" href="#doctest.DocTestRunner.report_success" title="doctest.DocTestRunner.report_success"><code class="xref py py-meth docutils literal notranslate"><span class="pre">report_success()</span></code></a>,
|
|||
|
<a class="reference internal" href="#doctest.DocTestRunner.report_unexpected_exception" title="doctest.DocTestRunner.report_unexpected_exception"><code class="xref py py-meth docutils literal notranslate"><span class="pre">report_unexpected_exception()</span></code></a>, and <a class="reference internal" href="#doctest.DocTestRunner.report_failure" title="doctest.DocTestRunner.report_failure"><code class="xref py py-meth docutils literal notranslate"><span class="pre">report_failure()</span></code></a>.</p>
|
|||
|
<p>The optional keyword argument <em>checker</em> specifies the <a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a>
|
|||
|
object (or drop-in replacement) that should be used to compare the expected
|
|||
|
outputs to the actual outputs of doctest examples.</p>
|
|||
|
<p>The optional keyword argument <em>verbose</em> controls the <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a>’s
|
|||
|
verbosity. If <em>verbose</em> is <code class="docutils literal notranslate"><span class="pre">True</span></code>, then information is printed about each
|
|||
|
example, as it is run. If <em>verbose</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>, then only failures are
|
|||
|
printed. If <em>verbose</em> is unspecified, or <code class="docutils literal notranslate"><span class="pre">None</span></code>, then verbose output is used
|
|||
|
iff the command-line switch <code class="docutils literal notranslate"><span class="pre">-v</span></code> is used.</p>
|
|||
|
<p>The optional keyword argument <em>optionflags</em> can be used to control how the test
|
|||
|
runner compares expected output to actual output, and how it displays failures.
|
|||
|
For more information, see section <a class="reference internal" href="#doctest-options"><span class="std std-ref">Option Flags</span></a>.</p>
|
|||
|
<p><a class="reference internal" href="#doctest.DocTestParser" title="doctest.DocTestParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestParser</span></code></a> defines the following methods:</p>
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestRunner.report_start">
|
|||
|
<code class="descname">report_start</code><span class="sig-paren">(</span><em>out</em>, <em>test</em>, <em>example</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner.report_start" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Report that the test runner is about to process the given example. This method
|
|||
|
is provided to allow subclasses of <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to customize their
|
|||
|
output; it should not be called directly.</p>
|
|||
|
<p><em>example</em> is the example about to be processed. <em>test</em> is the test
|
|||
|
<em>containing example</em>. <em>out</em> is the output function that was passed to
|
|||
|
<a class="reference internal" href="#doctest.DocTestRunner.run" title="doctest.DocTestRunner.run"><code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestRunner.run()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestRunner.report_success">
|
|||
|
<code class="descname">report_success</code><span class="sig-paren">(</span><em>out</em>, <em>test</em>, <em>example</em>, <em>got</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner.report_success" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Report that the given example ran successfully. This method is provided to
|
|||
|
allow subclasses of <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to customize their output; it
|
|||
|
should not be called directly.</p>
|
|||
|
<p><em>example</em> is the example about to be processed. <em>got</em> is the actual output
|
|||
|
from the example. <em>test</em> is the test containing <em>example</em>. <em>out</em> is the
|
|||
|
output function that was passed to <a class="reference internal" href="#doctest.DocTestRunner.run" title="doctest.DocTestRunner.run"><code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestRunner.run()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestRunner.report_failure">
|
|||
|
<code class="descname">report_failure</code><span class="sig-paren">(</span><em>out</em>, <em>test</em>, <em>example</em>, <em>got</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner.report_failure" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Report that the given example failed. This method is provided to allow
|
|||
|
subclasses of <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to customize their output; it should not
|
|||
|
be called directly.</p>
|
|||
|
<p><em>example</em> is the example about to be processed. <em>got</em> is the actual output
|
|||
|
from the example. <em>test</em> is the test containing <em>example</em>. <em>out</em> is the
|
|||
|
output function that was passed to <a class="reference internal" href="#doctest.DocTestRunner.run" title="doctest.DocTestRunner.run"><code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestRunner.run()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestRunner.report_unexpected_exception">
|
|||
|
<code class="descname">report_unexpected_exception</code><span class="sig-paren">(</span><em>out</em>, <em>test</em>, <em>example</em>, <em>exc_info</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner.report_unexpected_exception" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Report that the given example raised an unexpected exception. This method is
|
|||
|
provided to allow subclasses of <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to customize their
|
|||
|
output; it should not be called directly.</p>
|
|||
|
<p><em>example</em> is the example about to be processed. <em>exc_info</em> is a tuple
|
|||
|
containing information about the unexpected exception (as returned by
|
|||
|
<a class="reference internal" href="sys.html#sys.exc_info" title="sys.exc_info"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exc_info()</span></code></a>). <em>test</em> is the test containing <em>example</em>. <em>out</em> is the
|
|||
|
output function that was passed to <a class="reference internal" href="#doctest.DocTestRunner.run" title="doctest.DocTestRunner.run"><code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestRunner.run()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestRunner.run">
|
|||
|
<code class="descname">run</code><span class="sig-paren">(</span><em>test</em>, <em>compileflags=None</em>, <em>out=None</em>, <em>clear_globs=True</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner.run" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Run the examples in <em>test</em> (a <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object), and display the
|
|||
|
results using the writer function <em>out</em>.</p>
|
|||
|
<p>The examples are run in the namespace <code class="docutils literal notranslate"><span class="pre">test.globs</span></code>. If <em>clear_globs</em> is
|
|||
|
true (the default), then this namespace will be cleared after the test runs,
|
|||
|
to help with garbage collection. If you would like to examine the namespace
|
|||
|
after the test completes, then use <em>clear_globs=False</em>.</p>
|
|||
|
<p><em>compileflags</em> gives the set of flags that should be used by the Python
|
|||
|
compiler when running the examples. If not specified, then it will default to
|
|||
|
the set of future-import flags that apply to <em>globs</em>.</p>
|
|||
|
<p>The output of each example is checked using the <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a>’s
|
|||
|
output checker, and the results are formatted by the
|
|||
|
<code class="xref py py-meth docutils literal notranslate"><span class="pre">DocTestRunner.report_*()</span></code> methods.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.DocTestRunner.summarize">
|
|||
|
<code class="descname">summarize</code><span class="sig-paren">(</span><em>verbose=None</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestRunner.summarize" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Print a summary of all the test cases that have been run by this DocTestRunner,
|
|||
|
and return a <a class="reference internal" href="../glossary.html#term-named-tuple"><span class="xref std std-term">named tuple</span></a> <code class="docutils literal notranslate"><span class="pre">TestResults(failed,</span> <span class="pre">attempted)</span></code>.</p>
|
|||
|
<p>The optional <em>verbose</em> argument controls how detailed the summary is. If the
|
|||
|
verbosity is not specified, then the <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a>’s verbosity is
|
|||
|
used.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="outputchecker-objects">
|
|||
|
<span id="doctest-outputchecker"></span><h3>OutputChecker objects<a class="headerlink" href="#outputchecker-objects" title="Permalink to this headline">¶</a></h3>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.OutputChecker">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">OutputChecker</code><a class="headerlink" href="#doctest.OutputChecker" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A class used to check the whether the actual output from a doctest example
|
|||
|
matches the expected output. <a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a> defines two methods:
|
|||
|
<a class="reference internal" href="#doctest.OutputChecker.check_output" title="doctest.OutputChecker.check_output"><code class="xref py py-meth docutils literal notranslate"><span class="pre">check_output()</span></code></a>, which compares a given pair of outputs, and returns true
|
|||
|
if they match; and <a class="reference internal" href="#doctest.OutputChecker.output_difference" title="doctest.OutputChecker.output_difference"><code class="xref py py-meth docutils literal notranslate"><span class="pre">output_difference()</span></code></a>, which returns a string describing
|
|||
|
the differences between two outputs.</p>
|
|||
|
<p><a class="reference internal" href="#doctest.OutputChecker" title="doctest.OutputChecker"><code class="xref py py-class docutils literal notranslate"><span class="pre">OutputChecker</span></code></a> defines the following methods:</p>
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.OutputChecker.check_output">
|
|||
|
<code class="descname">check_output</code><span class="sig-paren">(</span><em>want</em>, <em>got</em>, <em>optionflags</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.OutputChecker.check_output" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Return <code class="docutils literal notranslate"><span class="pre">True</span></code> iff the actual output from an example (<em>got</em>) matches the
|
|||
|
expected output (<em>want</em>). These strings are always considered to match if
|
|||
|
they are identical; but depending on what option flags the test runner is
|
|||
|
using, several non-exact match types are also possible. See section
|
|||
|
<a class="reference internal" href="#doctest-options"><span class="std std-ref">Option Flags</span></a> for more information about option flags.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="method">
|
|||
|
<dt id="doctest.OutputChecker.output_difference">
|
|||
|
<code class="descname">output_difference</code><span class="sig-paren">(</span><em>example</em>, <em>got</em>, <em>optionflags</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.OutputChecker.output_difference" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Return a string describing the differences between the expected output for a
|
|||
|
given example (<em>example</em>) and the actual output (<em>got</em>). <em>optionflags</em> is the
|
|||
|
set of option flags used to compare <em>want</em> and <em>got</em>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="section" id="debugging">
|
|||
|
<span id="doctest-debugging"></span><h2>Debugging<a class="headerlink" href="#debugging" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>Doctest provides several mechanisms for debugging doctest examples:</p>
|
|||
|
<ul>
|
|||
|
<li><p>Several functions convert doctests to executable Python programs, which can be
|
|||
|
run under the Python debugger, <a class="reference internal" href="pdb.html#module-pdb" title="pdb: The Python debugger for interactive interpreters."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pdb</span></code></a>.</p></li>
|
|||
|
<li><p>The <a class="reference internal" href="#doctest.DebugRunner" title="doctest.DebugRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DebugRunner</span></code></a> class is a subclass of <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> that
|
|||
|
raises an exception for the first failing example, containing information about
|
|||
|
that example. This information can be used to perform post-mortem debugging on
|
|||
|
the example.</p></li>
|
|||
|
<li><p>The <a class="reference internal" href="unittest.html#module-unittest" title="unittest: Unit testing framework for Python."><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code></a> cases generated by <a class="reference internal" href="#doctest.DocTestSuite" title="doctest.DocTestSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocTestSuite()</span></code></a> support the
|
|||
|
<a class="reference internal" href="#doctest.debug" title="doctest.debug"><code class="xref py py-meth docutils literal notranslate"><span class="pre">debug()</span></code></a> method defined by <a class="reference internal" href="unittest.html#unittest.TestCase" title="unittest.TestCase"><code class="xref py py-class docutils literal notranslate"><span class="pre">unittest.TestCase</span></code></a>.</p></li>
|
|||
|
<li><p>You can add a call to <a class="reference internal" href="pdb.html#pdb.set_trace" title="pdb.set_trace"><code class="xref py py-func docutils literal notranslate"><span class="pre">pdb.set_trace()</span></code></a> in a doctest example, and you’ll
|
|||
|
drop into the Python debugger when that line is executed. Then you can inspect
|
|||
|
current values of variables, and so on. For example, suppose <code class="file docutils literal notranslate"><span class="pre">a.py</span></code>
|
|||
|
contains just this module docstring:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="sd">"""</span>
|
|||
|
<span class="sd">>>> def f(x):</span>
|
|||
|
<span class="sd">... g(x*2)</span>
|
|||
|
<span class="sd">>>> def g(x):</span>
|
|||
|
<span class="sd">... print(x+3)</span>
|
|||
|
<span class="sd">... import pdb; pdb.set_trace()</span>
|
|||
|
<span class="sd">>>> f(3)</span>
|
|||
|
<span class="sd">9</span>
|
|||
|
<span class="sd">"""</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>Then an interactive Python session may look like this:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">a</span><span class="o">,</span> <span class="nn">doctest</span>
|
|||
|
<span class="gp">>>> </span><span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
|||
|
<span class="go">--Return--</span>
|
|||
|
<span class="go">> <doctest a[1]>(3)g()->None</span>
|
|||
|
<span class="go">-> import pdb; pdb.set_trace()</span>
|
|||
|
<span class="go">(Pdb) list</span>
|
|||
|
<span class="go"> 1 def g(x):</span>
|
|||
|
<span class="go"> 2 print(x+3)</span>
|
|||
|
<span class="go"> 3 -> import pdb; pdb.set_trace()</span>
|
|||
|
<span class="go">[EOF]</span>
|
|||
|
<span class="go">(Pdb) p x</span>
|
|||
|
<span class="go">6</span>
|
|||
|
<span class="go">(Pdb) step</span>
|
|||
|
<span class="go">--Return--</span>
|
|||
|
<span class="go">> <doctest a[0]>(2)f()->None</span>
|
|||
|
<span class="go">-> g(x*2)</span>
|
|||
|
<span class="go">(Pdb) list</span>
|
|||
|
<span class="go"> 1 def f(x):</span>
|
|||
|
<span class="go"> 2 -> g(x*2)</span>
|
|||
|
<span class="go">[EOF]</span>
|
|||
|
<span class="go">(Pdb) p x</span>
|
|||
|
<span class="go">3</span>
|
|||
|
<span class="go">(Pdb) step</span>
|
|||
|
<span class="go">--Return--</span>
|
|||
|
<span class="go">> <doctest a[2]>(1)?()->None</span>
|
|||
|
<span class="go">-> f(3)</span>
|
|||
|
<span class="go">(Pdb) cont</span>
|
|||
|
<span class="go">(0, 3)</span>
|
|||
|
<span class="go">>>></span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<p>Functions that convert doctests to Python code, and possibly run the synthesized
|
|||
|
code under the debugger:</p>
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.script_from_examples">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">script_from_examples</code><span class="sig-paren">(</span><em>s</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.script_from_examples" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Convert text with examples to a script.</p>
|
|||
|
<p>Argument <em>s</em> is a string containing doctest examples. The string is converted
|
|||
|
to a Python script, where doctest examples in <em>s</em> are converted to regular code,
|
|||
|
and everything else is converted to Python comments. The generated script is
|
|||
|
returned as a string. For example,</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">doctest</span>
|
|||
|
<span class="nb">print</span><span class="p">(</span><span class="n">doctest</span><span class="o">.</span><span class="n">script_from_examples</span><span class="p">(</span><span class="sa">r</span><span class="s2">"""</span>
|
|||
|
<span class="s2"> Set x and y to 1 and 2.</span>
|
|||
|
<span class="s2"> >>> x, y = 1, 2</span>
|
|||
|
|
|||
|
<span class="s2"> Print their sum:</span>
|
|||
|
<span class="s2"> >>> print(x+y)</span>
|
|||
|
<span class="s2"> 3</span>
|
|||
|
<span class="s2">"""</span><span class="p">))</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>displays:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Set x and y to 1 and 2.</span>
|
|||
|
<span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span>
|
|||
|
<span class="c1">#</span>
|
|||
|
<span class="c1"># Print their sum:</span>
|
|||
|
<span class="nb">print</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">)</span>
|
|||
|
<span class="c1"># Expected:</span>
|
|||
|
<span class="c1">## 3</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>This function is used internally by other functions (see below), but can also be
|
|||
|
useful when you want to transform an interactive Python session into a Python
|
|||
|
script.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.testsource">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">testsource</code><span class="sig-paren">(</span><em>module</em>, <em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.testsource" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Convert the doctest for an object to a script.</p>
|
|||
|
<p>Argument <em>module</em> is a module object, or dotted name of a module, containing the
|
|||
|
object whose doctests are of interest. Argument <em>name</em> is the name (within the
|
|||
|
module) of the object with the doctests of interest. The result is a string,
|
|||
|
containing the object’s docstring converted to a Python script, as described for
|
|||
|
<a class="reference internal" href="#doctest.script_from_examples" title="doctest.script_from_examples"><code class="xref py py-func docutils literal notranslate"><span class="pre">script_from_examples()</span></code></a> above. For example, if module <code class="file docutils literal notranslate"><span class="pre">a.py</span></code>
|
|||
|
contains a top-level function <code class="xref py py-func docutils literal notranslate"><span class="pre">f()</span></code>, then</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">a</span><span class="o">,</span> <span class="nn">doctest</span>
|
|||
|
<span class="nb">print</span><span class="p">(</span><span class="n">doctest</span><span class="o">.</span><span class="n">testsource</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s2">"a.f"</span><span class="p">))</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p>prints a script version of function <code class="xref py py-func docutils literal notranslate"><span class="pre">f()</span></code>’s docstring, with doctests
|
|||
|
converted to code, and the rest placed in comments.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.debug">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">debug</code><span class="sig-paren">(</span><em>module</em>, <em>name</em>, <em>pm=False</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.debug" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Debug the doctests for an object.</p>
|
|||
|
<p>The <em>module</em> and <em>name</em> arguments are the same as for function
|
|||
|
<a class="reference internal" href="#doctest.testsource" title="doctest.testsource"><code class="xref py py-func docutils literal notranslate"><span class="pre">testsource()</span></code></a> above. The synthesized Python script for the named object’s
|
|||
|
docstring is written to a temporary file, and then that file is run under the
|
|||
|
control of the Python debugger, <a class="reference internal" href="pdb.html#module-pdb" title="pdb: The Python debugger for interactive interpreters."><code class="xref py py-mod docutils literal notranslate"><span class="pre">pdb</span></code></a>.</p>
|
|||
|
<p>A shallow copy of <code class="docutils literal notranslate"><span class="pre">module.__dict__</span></code> is used for both local and global
|
|||
|
execution context.</p>
|
|||
|
<p>Optional argument <em>pm</em> controls whether post-mortem debugging is used. If <em>pm</em>
|
|||
|
has a true value, the script file is run directly, and the debugger gets
|
|||
|
involved only if the script terminates via raising an unhandled exception. If
|
|||
|
it does, then post-mortem debugging is invoked, via <a class="reference internal" href="pdb.html#pdb.post_mortem" title="pdb.post_mortem"><code class="xref py py-func docutils literal notranslate"><span class="pre">pdb.post_mortem()</span></code></a>,
|
|||
|
passing the traceback object from the unhandled exception. If <em>pm</em> is not
|
|||
|
specified, or is false, the script is run under the debugger from the start, via
|
|||
|
passing an appropriate <a class="reference internal" href="functions.html#exec" title="exec"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a> call to <a class="reference internal" href="pdb.html#pdb.run" title="pdb.run"><code class="xref py py-func docutils literal notranslate"><span class="pre">pdb.run()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="function">
|
|||
|
<dt id="doctest.debug_src">
|
|||
|
<code class="descclassname">doctest.</code><code class="descname">debug_src</code><span class="sig-paren">(</span><em>src</em>, <em>pm=False</em>, <em>globs=None</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.debug_src" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>Debug the doctests in a string.</p>
|
|||
|
<p>This is like function <a class="reference internal" href="#doctest.debug" title="doctest.debug"><code class="xref py py-func docutils literal notranslate"><span class="pre">debug()</span></code></a> above, except that a string containing
|
|||
|
doctest examples is specified directly, via the <em>src</em> argument.</p>
|
|||
|
<p>Optional argument <em>pm</em> has the same meaning as in function <a class="reference internal" href="#doctest.debug" title="doctest.debug"><code class="xref py py-func docutils literal notranslate"><span class="pre">debug()</span></code></a> above.</p>
|
|||
|
<p>Optional argument <em>globs</em> gives a dictionary to use as both local and global
|
|||
|
execution context. If not specified, or <code class="docutils literal notranslate"><span class="pre">None</span></code>, an empty dictionary is used.
|
|||
|
If specified, a shallow copy of the dictionary is used.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p>The <a class="reference internal" href="#doctest.DebugRunner" title="doctest.DebugRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DebugRunner</span></code></a> class, and the special exceptions it may raise, are of
|
|||
|
most interest to testing framework authors, and will only be sketched here. See
|
|||
|
the source code, and especially <a class="reference internal" href="#doctest.DebugRunner" title="doctest.DebugRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DebugRunner</span></code></a>’s docstring (which is a
|
|||
|
doctest!) for more details:</p>
|
|||
|
<dl class="class">
|
|||
|
<dt id="doctest.DebugRunner">
|
|||
|
<em class="property">class </em><code class="descclassname">doctest.</code><code class="descname">DebugRunner</code><span class="sig-paren">(</span><em>checker=None</em>, <em>verbose=None</em>, <em>optionflags=0</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DebugRunner" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A subclass of <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> that raises an exception as soon as a
|
|||
|
failure is encountered. If an unexpected exception occurs, an
|
|||
|
<a class="reference internal" href="#doctest.UnexpectedException" title="doctest.UnexpectedException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">UnexpectedException</span></code></a> exception is raised, containing the test, the
|
|||
|
example, and the original exception. If the output doesn’t match, then a
|
|||
|
<a class="reference internal" href="#doctest.DocTestFailure" title="doctest.DocTestFailure"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DocTestFailure</span></code></a> exception is raised, containing the test, the example, and
|
|||
|
the actual output.</p>
|
|||
|
<p>For information about the constructor parameters and methods, see the
|
|||
|
documentation for <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> in section <a class="reference internal" href="#doctest-advanced-api"><span class="std std-ref">Advanced API</span></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p>There are two exceptions that may be raised by <a class="reference internal" href="#doctest.DebugRunner" title="doctest.DebugRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DebugRunner</span></code></a> instances:</p>
|
|||
|
<dl class="exception">
|
|||
|
<dt id="doctest.DocTestFailure">
|
|||
|
<em class="property">exception </em><code class="descclassname">doctest.</code><code class="descname">DocTestFailure</code><span class="sig-paren">(</span><em>test</em>, <em>example</em>, <em>got</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.DocTestFailure" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>An exception raised by <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to signal that a doctest example’s
|
|||
|
actual output did not match its expected output. The constructor arguments are
|
|||
|
used to initialize the attributes of the same names.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p><a class="reference internal" href="#doctest.DocTestFailure" title="doctest.DocTestFailure"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DocTestFailure</span></code></a> defines the following attributes:</p>
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTestFailure.test">
|
|||
|
<code class="descclassname">DocTestFailure.</code><code class="descname">test</code><a class="headerlink" href="#doctest.DocTestFailure.test" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object that was being run when the example failed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTestFailure.example">
|
|||
|
<code class="descclassname">DocTestFailure.</code><code class="descname">example</code><a class="headerlink" href="#doctest.DocTestFailure.example" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The <a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a> that failed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.DocTestFailure.got">
|
|||
|
<code class="descclassname">DocTestFailure.</code><code class="descname">got</code><a class="headerlink" href="#doctest.DocTestFailure.got" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The example’s actual output.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="exception">
|
|||
|
<dt id="doctest.UnexpectedException">
|
|||
|
<em class="property">exception </em><code class="descclassname">doctest.</code><code class="descname">UnexpectedException</code><span class="sig-paren">(</span><em>test</em>, <em>example</em>, <em>exc_info</em><span class="sig-paren">)</span><a class="headerlink" href="#doctest.UnexpectedException" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>An exception raised by <a class="reference internal" href="#doctest.DocTestRunner" title="doctest.DocTestRunner"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTestRunner</span></code></a> to signal that a doctest
|
|||
|
example raised an unexpected exception. The constructor arguments are used
|
|||
|
to initialize the attributes of the same names.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<p><a class="reference internal" href="#doctest.UnexpectedException" title="doctest.UnexpectedException"><code class="xref py py-exc docutils literal notranslate"><span class="pre">UnexpectedException</span></code></a> defines the following attributes:</p>
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.UnexpectedException.test">
|
|||
|
<code class="descclassname">UnexpectedException.</code><code class="descname">test</code><a class="headerlink" href="#doctest.UnexpectedException.test" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The <a class="reference internal" href="#doctest.DocTest" title="doctest.DocTest"><code class="xref py py-class docutils literal notranslate"><span class="pre">DocTest</span></code></a> object that was being run when the example failed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.UnexpectedException.example">
|
|||
|
<code class="descclassname">UnexpectedException.</code><code class="descname">example</code><a class="headerlink" href="#doctest.UnexpectedException.example" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>The <a class="reference internal" href="#doctest.Example" title="doctest.Example"><code class="xref py py-class docutils literal notranslate"><span class="pre">Example</span></code></a> that failed.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
<dl class="attribute">
|
|||
|
<dt id="doctest.UnexpectedException.exc_info">
|
|||
|
<code class="descclassname">UnexpectedException.</code><code class="descname">exc_info</code><a class="headerlink" href="#doctest.UnexpectedException.exc_info" title="Permalink to this definition">¶</a></dt>
|
|||
|
<dd><p>A tuple containing information about the unexpected exception, as returned by
|
|||
|
<a class="reference internal" href="sys.html#sys.exc_info" title="sys.exc_info"><code class="xref py py-func docutils literal notranslate"><span class="pre">sys.exc_info()</span></code></a>.</p>
|
|||
|
</dd></dl>
|
|||
|
|
|||
|
</div>
|
|||
|
<div class="section" id="soapbox">
|
|||
|
<span id="doctest-soapbox"></span><h2>Soapbox<a class="headerlink" href="#soapbox" title="Permalink to this headline">¶</a></h2>
|
|||
|
<p>As mentioned in the introduction, <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a> has grown to have three primary
|
|||
|
uses:</p>
|
|||
|
<ol class="arabic simple">
|
|||
|
<li><p>Checking examples in docstrings.</p></li>
|
|||
|
<li><p>Regression testing.</p></li>
|
|||
|
<li><p>Executable documentation / literate testing.</p></li>
|
|||
|
</ol>
|
|||
|
<p>These uses have different requirements, and it is important to distinguish them.
|
|||
|
In particular, filling your docstrings with obscure test cases makes for bad
|
|||
|
documentation.</p>
|
|||
|
<p>When writing a docstring, choose docstring examples with care. There’s an art to
|
|||
|
this that needs to be learned—it may not be natural at first. Examples should
|
|||
|
add genuine value to the documentation. A good example can often be worth many
|
|||
|
words. If done with care, the examples will be invaluable for your users, and
|
|||
|
will pay back the time it takes to collect them many times over as the years go
|
|||
|
by and things change. I’m still amazed at how often one of my <a class="reference internal" href="#module-doctest" title="doctest: Test pieces of code within docstrings."><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code></a>
|
|||
|
examples stops working after a “harmless” change.</p>
|
|||
|
<p>Doctest also makes an excellent tool for regression testing, especially if you
|
|||
|
don’t skimp on explanatory text. By interleaving prose and examples, it becomes
|
|||
|
much easier to keep track of what’s actually being tested, and why. When a test
|
|||
|
fails, good prose can make it much easier to figure out what the problem is, and
|
|||
|
how it should be fixed. It’s true that you could write extensive comments in
|
|||
|
code-based testing, but few programmers do. Many have found that using doctest
|
|||
|
approaches instead leads to much clearer tests. Perhaps this is simply because
|
|||
|
doctest makes writing prose a little easier than writing code, while writing
|
|||
|
comments in code is a little harder. I think it goes deeper than just that:
|
|||
|
the natural attitude when writing a doctest-based test is that you want to
|
|||
|
explain the fine points of your software, and illustrate them with examples.
|
|||
|
This in turn naturally leads to test files that start with the simplest
|
|||
|
features, and logically progress to complications and edge cases. A coherent
|
|||
|
narrative is the result, instead of a collection of isolated functions that test
|
|||
|
isolated bits of functionality seemingly at random. It’s a different attitude,
|
|||
|
and produces different results, blurring the distinction between testing and
|
|||
|
explaining.</p>
|
|||
|
<p>Regression testing is best confined to dedicated objects or files. There are
|
|||
|
several options for organizing tests:</p>
|
|||
|
<ul class="simple">
|
|||
|
<li><p>Write text files containing test cases as interactive examples, and test the
|
|||
|
files using <a class="reference internal" href="#doctest.testfile" title="doctest.testfile"><code class="xref py py-func docutils literal notranslate"><span class="pre">testfile()</span></code></a> or <a class="reference internal" href="#doctest.DocFileSuite" title="doctest.DocFileSuite"><code class="xref py py-func docutils literal notranslate"><span class="pre">DocFileSuite()</span></code></a>. This is recommended,
|
|||
|
although is easiest to do for new projects, designed from the start to use
|
|||
|
doctest.</p></li>
|
|||
|
<li><p>Define functions named <code class="docutils literal notranslate"><span class="pre">_regrtest_topic</span></code> that consist of single docstrings,
|
|||
|
containing test cases for the named topics. These functions can be included in
|
|||
|
the same file as the module, or separated out into a separate test file.</p></li>
|
|||
|
<li><p>Define a <code class="docutils literal notranslate"><span class="pre">__test__</span></code> dictionary mapping from regression test topics to
|
|||
|
docstrings containing test cases.</p></li>
|
|||
|
</ul>
|
|||
|
<p>When you have placed your tests in a module, the module can itself be the test
|
|||
|
runner. When a test fails, you can arrange for your test runner to re-run only
|
|||
|
the failing doctest while you debug the problem. Here is a minimal example of
|
|||
|
such a test runner:</p>
|
|||
|
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s1">'__main__'</span><span class="p">:</span>
|
|||
|
<span class="kn">import</span> <span class="nn">doctest</span>
|
|||
|
<span class="n">flags</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">REPORT_NDIFF</span><span class="o">|</span><span class="n">doctest</span><span class="o">.</span><span class="n">FAIL_FAST</span>
|
|||
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
|
|||
|
<span class="n">name</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
|||
|
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">globals</span><span class="p">():</span>
|
|||
|
<span class="n">obj</span> <span class="o">=</span> <span class="nb">globals</span><span class="p">()[</span><span class="n">name</span><span class="p">]</span>
|
|||
|
<span class="k">else</span><span class="p">:</span>
|
|||
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">__test__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
|
|||
|
<span class="n">doctest</span><span class="o">.</span><span class="n">run_docstring_examples</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">globals</span><span class="p">(),</span> <span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
|
|||
|
<span class="n">optionflags</span><span class="o">=</span><span class="n">flags</span><span class="p">)</span>
|
|||
|
<span class="k">else</span><span class="p">:</span>
|
|||
|
<span class="n">fail</span><span class="p">,</span> <span class="n">total</span> <span class="o">=</span> <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">(</span><span class="n">optionflags</span><span class="o">=</span><span class="n">flags</span><span class="p">)</span>
|
|||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="si">{}</span><span class="s2"> failures out of </span><span class="si">{}</span><span class="s2"> tests"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">fail</span><span class="p">,</span> <span class="n">total</span><span class="p">))</span>
|
|||
|
</pre></div>
|
|||
|
</div>
|
|||
|
<p class="rubric">Footnotes</p>
|
|||
|
<dl class="footnote brackets">
|
|||
|
<dt class="label" id="id2"><span class="brackets"><a class="fn-backref" href="#id1">1</a></span></dt>
|
|||
|
<dd><p>Examples containing both expected output and an exception are not supported.
|
|||
|
Trying to guess where one ends and the other begins is too error-prone, and that
|
|||
|
also makes for a confusing test.</p>
|
|||
|
</dd>
|
|||
|
</dl>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
|||
|
<div class="sphinxsidebarwrapper">
|
|||
|
<h3><a href="../contents.html">Table of Contents</a></h3>
|
|||
|
<ul>
|
|||
|
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">doctest</span></code> — Test interactive Python examples</a><ul>
|
|||
|
<li><a class="reference internal" href="#simple-usage-checking-examples-in-docstrings">Simple Usage: Checking Examples in Docstrings</a></li>
|
|||
|
<li><a class="reference internal" href="#simple-usage-checking-examples-in-a-text-file">Simple Usage: Checking Examples in a Text File</a></li>
|
|||
|
<li><a class="reference internal" href="#how-it-works">How It Works</a><ul>
|
|||
|
<li><a class="reference internal" href="#which-docstrings-are-examined">Which Docstrings Are Examined?</a></li>
|
|||
|
<li><a class="reference internal" href="#how-are-docstring-examples-recognized">How are Docstring Examples Recognized?</a></li>
|
|||
|
<li><a class="reference internal" href="#what-s-the-execution-context">What’s the Execution Context?</a></li>
|
|||
|
<li><a class="reference internal" href="#what-about-exceptions">What About Exceptions?</a></li>
|
|||
|
<li><a class="reference internal" href="#option-flags">Option Flags</a></li>
|
|||
|
<li><a class="reference internal" href="#directives">Directives</a></li>
|
|||
|
<li><a class="reference internal" href="#warnings">Warnings</a></li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><a class="reference internal" href="#basic-api">Basic API</a></li>
|
|||
|
<li><a class="reference internal" href="#unittest-api">Unittest API</a></li>
|
|||
|
<li><a class="reference internal" href="#advanced-api">Advanced API</a><ul>
|
|||
|
<li><a class="reference internal" href="#doctest-objects">DocTest Objects</a></li>
|
|||
|
<li><a class="reference internal" href="#example-objects">Example Objects</a></li>
|
|||
|
<li><a class="reference internal" href="#doctestfinder-objects">DocTestFinder objects</a></li>
|
|||
|
<li><a class="reference internal" href="#doctestparser-objects">DocTestParser objects</a></li>
|
|||
|
<li><a class="reference internal" href="#doctestrunner-objects">DocTestRunner objects</a></li>
|
|||
|
<li><a class="reference internal" href="#outputchecker-objects">OutputChecker objects</a></li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><a class="reference internal" href="#debugging">Debugging</a></li>
|
|||
|
<li><a class="reference internal" href="#soapbox">Soapbox</a></li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
<h4>Previous topic</h4>
|
|||
|
<p class="topless"><a href="pydoc.html"
|
|||
|
title="previous chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">pydoc</span></code> — Documentation generator and online help system</a></p>
|
|||
|
<h4>Next topic</h4>
|
|||
|
<p class="topless"><a href="unittest.html"
|
|||
|
title="next chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">unittest</span></code> — Unit testing framework</a></p>
|
|||
|
<div role="note" aria-label="source link">
|
|||
|
<h3>This Page</h3>
|
|||
|
<ul class="this-page-menu">
|
|||
|
<li><a href="../bugs.html">Report a Bug</a></li>
|
|||
|
<li>
|
|||
|
<a href="https://github.com/python/cpython/blob/3.7/Doc/library/doctest.rst"
|
|||
|
rel="nofollow">Show Source
|
|||
|
</a>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="clearer"></div>
|
|||
|
</div>
|
|||
|
<div class="related" role="navigation" aria-label="related navigation">
|
|||
|
<h3>Navigation</h3>
|
|||
|
<ul>
|
|||
|
<li class="right" style="margin-right: 10px">
|
|||
|
<a href="../genindex.html" title="General Index"
|
|||
|
>index</a></li>
|
|||
|
<li class="right" >
|
|||
|
<a href="../py-modindex.html" title="Python Module Index"
|
|||
|
>modules</a> |</li>
|
|||
|
<li class="right" >
|
|||
|
<a href="unittest.html" title="unittest — Unit testing framework"
|
|||
|
>next</a> |</li>
|
|||
|
<li class="right" >
|
|||
|
<a href="pydoc.html" title="pydoc — Documentation generator and online help system"
|
|||
|
>previous</a> |</li>
|
|||
|
<li><img src="../_static/py.png" alt=""
|
|||
|
style="vertical-align: middle; margin-top: -1px"/></li>
|
|||
|
<li><a href="https://www.python.org/">Python</a> »</li>
|
|||
|
<li>
|
|||
|
<span class="language_switcher_placeholder">en</span>
|
|||
|
<span class="version_switcher_placeholder">3.7.4</span>
|
|||
|
<a href="../index.html">Documentation </a> »
|
|||
|
</li>
|
|||
|
|
|||
|
<li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> »</li>
|
|||
|
<li class="nav-item nav-item-2"><a href="development.html" >Development Tools</a> »</li>
|
|||
|
<li class="right">
|
|||
|
|
|||
|
|
|||
|
<div class="inline-search" style="display: none" role="search">
|
|||
|
<form class="inline-search" action="../search.html" method="get">
|
|||
|
<input placeholder="Quick search" type="text" name="q" />
|
|||
|
<input type="submit" value="Go" />
|
|||
|
<input type="hidden" name="check_keywords" value="yes" />
|
|||
|
<input type="hidden" name="area" value="default" />
|
|||
|
</form>
|
|||
|
</div>
|
|||
|
<script type="text/javascript">$('.inline-search').show(0);</script>
|
|||
|
|
|
|||
|
</li>
|
|||
|
|
|||
|
</ul>
|
|||
|
</div>
|
|||
|
<div class="footer">
|
|||
|
© <a href="../copyright.html">Copyright</a> 2001-2019, Python Software Foundation.
|
|||
|
<br />
|
|||
|
The Python Software Foundation is a non-profit corporation.
|
|||
|
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
|||
|
<br />
|
|||
|
Last updated on Jul 13, 2019.
|
|||
|
<a href="../bugs.html">Found a bug</a>?
|
|||
|
<br />
|
|||
|
Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 2.0.1.
|
|||
|
</div>
|
|||
|
|
|||
|
</body>
|
|||
|
</html>
|