【问题标题】:How can a python 2 doctest fail and yet have no difference in the values in the failure message?python 2 doctest 如何失败但失败消息中的值没有差异?
【发布时间】:2015-05-16 03:19:34
【问题描述】:

我在 Windows 中使用 Python 2.7.9。

我有一个 UTF-8 编码的 Python 脚本文件,其内容如下:

# coding=utf-8

def test_func():
    u"""
    >>> test_func()
    u'☃'
    """
    return u'☃'

我在运行 doctest 时遇到了奇怪的失败:

Failed example:
    test_func()
Expected:
    u'\u2603'
Got:
    u'\u2603'

无论我是通过我通常使用的 IDE (IDEA IntelliJ) 还是从命令行启动 doctest,我都会看到同样的失败输出:

> x:\my_virtualenv\Scripts\python.exe -m doctest -v hello.py

我将ExpectedGot 下的行复制到WinMerge 中,以排除我无法识别的字符中的一些细微差别;它告诉我它们是相同的。

但是,如果我重做命令行运行,但将输出重定向到文本文件,如下所示:

> x:\my_virtualenv\Scripts\python.exe -m doctest -v hello.py > out.txt

测试仍然失败,但产生的失败输出有点不同:

Failed example:
    test_func()
Expected:
    u'☃'
Got:
    u'\u2603'

如果我将转义的 unicode 文字放在我的 doctest 中:

# coding=utf-8

def test_func():
    u"""
    >>> test_func()
    u'☃'
    """
    return u'\\u2603'

测试通过。但据我所知,u'\u2603'u'☃' 的评估结果应该相同。

关于失败的案例,我真的有两个问题:

  • 医生给出的其中一种表示(在ExpectedGot 下)对于医生在这种情况下的值是否不正确? (即x != eval(repr(x))
  • 如果不是,为什么测试会失败?

【问题讨论】:

  • 总结一下问题:doctester比较representation domain中的结果。这个问题实际上更像x != repr(eval(x))(发生这种情况,因为在 Python 中表示相同字符串的方法不止一种); doctester 采用具有\u 转义序列的实际函数输出的表示形式,并将其与我给出的具有文字unicode 字符的预期表示形式进行比较。当失败时,它使用格式运算符打印表示,该运算符还将预期表示中的文字 unicode 字符转换为转义。
  • 进行比较值的表示而不是比较实际值的测试并不理想,但实现起来可能更实际。

标签: python unicode doctest


【解决方案1】:

doctest 模块使用difflib 来区分结果和预期结果。像下面这样:

>>> import difflib
>>> variation = difflib.unified_diff('x', 'x')
>>> list(variation)
[]
>>> variation = difflib.unified_diff('x', 'y')
>>> list(variation)
['--- \n', '+++ \n', '@@ -1 +1 @@\n', '-x', '+y']

在后台,doctest 模块多次格式化结果和预期结果。您的问题似乎是由字符串编码引起的解释错误。打印到控制台的内容已被格式化(使用%s),从而消除了任何可见差异;让它们看起来一模一样。

【讨论】:

  • 好吧,我错误地假设医生会将返回值与作为预期输出给出的表达式的值进行比较,因为这可能是您在测试函数时关心的内容。相反,他们正在比较表示,这可能不是理想的测试,但简化了实现(它只是一个文本差异),并让他们实现 doctest 省略号模式(# doctest: +ELLIPSIS... 通配符)
【解决方案2】:

只是免费的,也因为在工作讨论中没有考虑这种可能性:我有一个弱相似的问题。见

[...]
Expected:
    <xarray.DataArray ()>
    array(0.0)
    Coordinates:
        d1   |S3 'nat'
        d2   |S3 'dat'
        d3   |S3 'a'        
Got:
    <xarray.DataArray ()>
    array(0.0)
    Coordinates:
        d1   |S3 'nat'
        d2   |S3 'dat'
        d3   |S3 'a'

当然,没有人类-可见的区别。在我的小案例中,解决方案是确保没有空格!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-15
    • 2014-01-22
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    相关资源
    最近更新 更多