【问题标题】:How to test exceptions with doctest in Python 2.x and 3.x?如何在 Python 2.x 和 3.x 中使用 doctest 测试异常?
【发布时间】:2013-07-16 08:02:27
【问题描述】:

我在模块spam 中定义了一个异常类SpamException。现在我想测试一个函数spam_function,它会引发这个异常。所以我写了以下doctest。

>>> spam_function()
Traceback (most recent call last):
    ....
SpamException

测试在 Python 2.x 上成功,但在 Python 3.x 上测试失败。以下测试适用于 Python 3.x。

>>> spam_function()
Traceback (most recent call last):
    ....
spam.SpamException

这里的显着区别是异常名称中包含模块名称。那么如何编写适用于 Python 2.x 和 3.x 的 doctest?

【问题讨论】:

    标签: python exception python-3.x python-2.x doctest


    【解决方案1】:

    我会打开doctest.IGNORE_EXCEPTION_DETAIL 指令,如下所示:

    >>> spam_function() # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last)
        ...
    SpamException: 'lovely spam'
    

    但请注意,IGNORE_EXCEPTION_DETAIL 不适用于普通异常对象(没有关联参数)。特别是,以下示例不能移植到 Python 3,因为异常名称后面没有任何内容:

    >>> spam_function() # doctest: +IGNORE_EXCEPTION_DETAIL
    Traceback (most recent call last)
        ...
    SpamException
    

    【讨论】:

    • 我在添加 # doctest: +IGNORE_EXCEPTION_DETAIL 时没有注意到任何变化,即它在任何一个 Python 版本上都失败了。你能添加一个完整的例子吗?
    • 只要有问题的异常类有一个返回非空字符串的__str__ 方法,IGNORE_EXCEPTION_DETAIL 就会起作用。然后并且只有这样最后的异常行才有一个冒号,这是指令工作所必需的。
    • 似乎 IGNORE_EXCEPTION_DETAIL 也忽略了异常消息,这消除了对这些行为进行文档测试的大部分目的。但是仍然检查异常类型。哎呀!
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多