Python 标准测试工具,例如doctest和unittest,可以直接在笔记本中使用。
文档测试
在文档字符串中具有函数和测试用例的笔记本单元格:
def add(a, b):
'''
This is a test:
>>> add(2, 2)
5
'''
return a + b
运行文档字符串中所有测试用例的笔记本单元(笔记本中的最后一个):
import doctest
doctest.testmod(verbose=True)
输出:
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.
单元测试
具有以下功能的笔记本单元格:
def add(a, b):
return a + b
包含测试用例的笔记本单元(笔记本中的最后一个单元)。单元格中的最后一行在执行单元格时运行测试用例:
import unittest
class TestNotebook(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 2), 5)
unittest.main(argv=[''], verbosity=2, exit=False)
输出:
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)
调试失败的测试
在调试失败的测试时,在某个时刻停止测试用例执行并运行调试器通常很有用。为此,在您希望执行停止的行之前插入以下代码:
import pdb; pdb.set_trace()
例如:
def add(a, b):
'''
This is the test:
>>> add(2, 2)
5
'''
import pdb; pdb.set_trace()
return a + b
对于此示例,下次运行 doctest 时,执行将在 return 语句之前停止,Python 调试器(pdb) 将启动。您将直接在笔记本中获得 pdb 提示,这将允许您检查 and 的值,a
跨行b
等。
breakpoint()
注意:从 Python 3.7 开始,可以使用内置函数代替import pdb; pdb.set_trace()
.
我创建了一个Jupyter 笔记本来试验我刚刚描述的技术。你可以试试看