1. 简介
doctest是Python内置库中的一个模块,它用于测试文档字符串中的代码样例是否正确。通过编写文档字符串中的代码样例,可以达到测试代码并记录文档的目的。使用doctest可以方便的执行代码片段,检查其输出结果,并自动生成测试报告。使用doctest可以方便的将示例代码嵌入到代码文档中,用户可以很快地了解如何正确地使用具体的库或模块。
2. 使用doctest
2.1 简单的示例
通过在文档字符串中添加示例代码,可以使用doctest进行测试,测试示例会以交互的方式执行,执行结果与示例中的期望结果做比较。
def square(x):
"""
Calculate the square of the given number.
>>> square(2)
4
>>> square(-2)
4
"""
return x ** 2
在上面的示例中,我们定义了一个square函数,它接收一个数字作为参数,并返回这个数字的平方。在函数的文档字符串中,我们添加了两个示例,使用Withetwo的方式来测试square函数。
在执行时,doctest会将文档字符串分离出来,并且修改示例代码的调用方式,使之成为有效的Python代码。然后它会执行示例代码,并且将输出结果与示例中的期望结果做比较。如上面的示例中,doctest执行示例square(2)并将其输出结果与示例中的4作比较,如果两者相等,则认为这是一个通过的测试。
2.2 自定义跳过条件
有时候,我们希望忽略掉某些测试,使用doctest提供的Directive控制指令就可以实现。例如,我们可以使用doctest中提供的SKIP指令,来跳过某些测试。
def square(x):
"""
Calculate the square of the given number.
>>> square(2)
4
>>> square(-2)
4
# skip the following test
>>> square(0) # doctest: +SKIP
"""
return x ** 2
在上面的示例中,我们使用doctest: +SKIP,来指定要跳过的测试。
2.3 捕获异常
doctest还可以用来测试代码中抛出的异常。使用doctest可以方便的测试代码在不同输入值下是否会抛出正确的异常。
def divide(x, y):
"""
Divide the first number by the second number.
>>> divide(10, 2)
5.0
>>> divide(10, 0)
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
"""
return x/y
在上面的示例中,我们定义了一个divide函数,它接收两个数字作为参数,并返回第一个数字除以第二个数字的结果。在函数的文档字符串中,我们添加了两个示例,其中第二个测试用例期望抛出一个ZeroDivisionError异常。
2.4 使用标志位控制测试
我们可以使用doctest中的ELLIPSIS标志位来忽略掉长输出结果的一部分,使其与示例中的期望结果做比较,从而减少测试用例的冗长。下面是一个使用ELLIPSIS标志位的示例:
def fibonacci(n):
"""
Return a list of n fibonacci numbers.
>>> fibonacci(6)
[0, 1, 1, 2, 3, ...]
"""
if n == 0:
return []
elif n == 1:
return [0]
else:
fib_list = [0, 1]
for i in range(2, n):
fib_list.append(fib_list[-1] + fib_list[-2])
return fib_list
在上面的示例中,我们定义了一个fibonacci函数,它返回一个列表,包含前n个斐波那契数列。在函数的文档字符串中,我们添加了一个使用ELLIPSIS标志位的示例,这个示例用来测试长度为6的斐波那契数列。下面是示例中的期望结果:
[0, 1, 1, 2, 3, ...]
在期望结果中,我们使用了ELLIPSIS标志位,表示输出结果并不是完整的斐波那契数列,当doctest检测到...时,它会忽略输出结果中的部分内容。
2.5 实践中的使用
在实际开发中,我们可以使用doctest来测试自己编写的函数或类中的代码。为了将代码与文档更好地结合,我们可以在代码中添加文档字符串,并在其中添加示例代码用于测试。下面是一个使用doctest的示例:
def reverse_string(s):
"""
Reverse the order of characters in a string.
>>> reverse_string('hello')
'olleh'
>>> reverse_string('Python')
'nohtyP'
"""
return s[::-1]
在上面的示例中,我们定义了一个reverse_string函数,它接收一个字符串作为参数,并返回字符串中字符的逆序排列。在函数的文档字符串中,我们添加了两个示例,用于测试reverse_string函数的正确性。
要运行doctest测试,在Python脚本中添加如下代码:
import doctest
doctest.testmod()
通过运行doctest.testmod()可以执行文档字符串中的测试示例,并生成测试报告。下面是运行上面示例中的doctest的结果:
**********************************************************************
File "", line 4, in __main__.reverse_string
Failed example:
reverse_string('Python')
Expected:
'nohtyP'
Got:
'nohtyP'
**********************************************************************
1 items had failures:
1 of 2 in __main__.reverse_string
***Test Failed*** 1 failures.
从上面的测试报告中可以看出,doctest检测到一个测试失败了。运行结果告诉我们,示例reverse_string('Python')在测试中没有通过。
3. 总结
doctest是Python内置库中的一个测试工具,它的主要功能是对文档字符串中的代码示例进行测试。使用doctest可以方便的测试代码并记录文档。通过在代码中编写文档字符串,并添加示例,可以让用户快速了解代码的使用方式。使用doctest可以帮助开发者编写更加健壮的代码,并提高代码的可靠性。