第十六章:开发工具-doctest:通过文档完成测试-避开空白字符

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被打开时,实际值和期望值中的空白符会被认为是匹配的。如果输出中不存在空白符,那么期望值中就不能增加空白符,不过空白符序列的长度和实际的空白字符不需要一致。第一个测试示例满足这个原则,并且通过测试(尽管输入包含额外的空格和换行)。第二个测试示例在[与]之间有额外的空白符,所以测试失败。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值