<p>Python标准测试工具,例如<a href="https://docs.python.org/3.6/library/doctest.html" rel="noreferrer">doctest</a>和<a href="https://docs.python.org/3.6/library/unittest.html" rel="noreferrer">unittest</a>,可以直接在笔记本中使用。</p>
<h2>博士</h2>
<p>具有docstring中的函数和测试用例的笔记本单元格:</p>
<pre class="lang-py prettyprint-override"><code>def add(a, b):
'''
This is a test:
>>> add(2, 2)
5
'''
return a + b
</code></pre>
<p>运行docstring中所有测试用例的笔记本单元格(笔记本中的最后一个):</p>
<pre><code>import doctest
doctest.testmod(verbose=True)
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>Trying:
add(2, 2)
Expecting:
5
**********************************************************************
File "__main__", line 4, in __main__.add
Failed example:
add(2, 2)
Expected:
5
Got:
4
1 items had no tests:
__main__
**********************************************************************
1 items had failures:
1 of 1 in __main__.add
1 tests in 2 items.
0 passed and 1 failed.
***Test Failed*** 1 failures.
</code></pre>
<h2>单元测试</h2>
<p>具有以下功能的笔记本电池:</p>
<pre class="lang-py prettyprint-override"><code>def add(a, b):
return a + b
</code></pre>
<p>包含测试用例的笔记本单元格(笔记本中的最后一个)。执行单元时,单元中的最后一行运行测试用例:</p>
<pre class="lang-py prettyprint-override"><code>import unittest
class TestNotebook(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 2), 5)
unittest.main(argv=[''], verbosity=2, exit=False)
</code></pre>
<p>输出:</p>
<pre class="lang-none prettyprint-override"><code>test_add (__main__.TestNotebook) ... FAIL
======================================================================
FAIL: test_add (__main__.TestNotebook)
----------------------------------------------------------------------
Traceback (most recent call last):
File "<ipython-input-15-4409ad9ffaea>", line 6, in test_add
self.assertEqual(add(2, 2), 5)
AssertionError: 4 != 5
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
</code></pre>
<h2>调试失败的测试</h2>
<p>在调试失败的测试时,在某个点停止测试用例执行并运行调试器通常是有用的。为此,请在要停止执行的行之前插入以下代码:</p>
<pre class="lang-py prettyprint-override"><code>import pdb; pdb.set_trace()
</code></pre>
<p>例如:</p>
<pre class="lang-py prettyprint-override"><code>def add(a, b):
'''
This is the test:
>>> add(2, 2)
5
'''
import pdb; pdb.set_trace()
return a + b
</code></pre>
<p>对于本例,下次运行doctest时,执行将在return语句之前停止,并且<a href="https://docs.python.org/3/library/pdb.html" rel="noreferrer">Python debugger</a>(pdb)将启动。您将直接在笔记本中得到一个pdb提示,它将允许您检查<code>a</code>和<code>b</code>的值、跨行等</p>
<p>我用刚才描述的技术创建了一个<a href="https://gist.github.com/SergiyKolesnikov/f94d91b947051ab5d2ba1aa30e25f050#file-test_and_debug-ipynb" rel="noreferrer">Jupyter notebook for experimenting</a>。你可以用<a href="https://mybinder.org/v2/gist/SergiyKolesnikov/f94d91b947051ab5d2ba1aa30e25f050#file-test_and_debug-ipynb/master" rel="noreferrer"><img src="https://mybinder.org/badge_logo.svg" alt="Binder"/></a>试试</p>