16.2.4 避开空白字符
在实际应用中,输出通常包括空白符,如空行、tab和多的间隔,目的是使输出更可读。尤其是空行会导致doctest出现问题,因为一般会使用空行作为测试的分界线。
def double_space(lines):
"""Prints a list of double-spaced lines.
>>> double_space(['Line one.','Line two.'])
Line one.
Line two.
"""
for l in lines:
print(l)
print()
double_space()取一个输入行列表,在输入行之间加入空行,打印时行之间会有两个空行间隔。
在前面的例子中,测试会失败,因为它把docstring中包含Line one,的那一行后面的空行解释为示例输出的末尾。为了与空行匹配,要把示例输入中的空行替换为< BLANCLINE>。
def double_space(lines):
"""Prints a list of double-spaced lines.
>>> double_space(['Line one.','Line two.'])
Line one.
<BLANKLINE>
Line two.
<BLANKLINE>
"""
for l in lines:
print(l)
print()
在这个例子中,完成比较之前,doctest将具体的空行替换为相同的字面量,所以现在具体值和期望值匹配,并且测试通过。
行中包含的空白符也可能导致测试出问题。下面这个例子在6后面有一个额外的空格。
def my_function(a,b):
"""
>>> my_function(2,3)
6
>>> my_function('a',3)
'aaa'
"""
return a * b
这个额外的空格可能是因为复制粘贴错误而引入的代码,不过由于它们位于行末尾,所以可能在原文件中不被注意,在测试失败报告中也看不到。
使用某个基于差异的报告选项,如REPORT_NDIFF,可以更详细地显示实际值和期望值之间的差异,这样就会看到这个额外的空格。
def my_function(a,b):
"""
>>> my_function(2,3) #doctest: +REPORT_NDIFF
6
>>> my_function('a',3)
'aaa'
"""
return a * b
也可以使用统一diff(REPROT_UDIFF)和上下文diff(REPORT_CDIFF)。
有些情况下,可能要在测试示例输出中增加额外的空白符,而让doctest忽略这些空白符.例如,尽管有些数据结构的表示可以显示在一行上,不过多行显示可能更易读。
def my_function(a,b):
"""Returns a * b.
>>> my_function(['A','B'],3) #doctest: +NORMALIZE_WHITESPACE
['A','B',
'A','B',
'A','B']
This does not match because of the extra space after the [ in
the list.
>>> my_function(['A','B'],2) #doctest: +NORMALIZE_WHITESPACE
[ 'A','B',
'A','B', ]
"""
return a * b
NORMALIZE_WHITESPACE被打开时,实际值和期望值中的空白符会被认为是匹配的。如果输出中不存在空白符,那么期望值中就不能增加空白符,不过空白符序列的长度和实际的空白字符不需要一致。第一个测试示例满足这个原则,并且通过测试(尽管输入包含额外的空格和换行)。第二个测试示例在[与]之间有额外的空白符,所以测试失败。