【问题标题】:Doctest failed with zero exit codeDoctest 失败,退出代码为零
【发布时间】:2013-09-13 09:22:42
【问题描述】:

在我的测试代码中,我的 doctest 失败,但脚本以零返回值退出,这导致 CI​​ 运行通过,这不是预期的。

这是 doctest 模块的正确行为吗?

我的脚本以:

结尾
if __name__ == '__main__':
    import doctest
    doctest.testmod()

输出如下:

**********************************************************************
File "test/test.py", line 7, in __main__
Failed example:
    f(1,0)
Expected:
    -----
    type: <type 'exceptions.ZeroDivisionError'>
    value: integer division or modulo by zero
    x
    -----
Got:
    -----
    type: <type 'exceptions.ZeroDivisionError'>
    value: integer division or modulo by zero
    -----
**********************************************************************
1 items had failures:
   1 of   1 in __main__
***Test Failed*** 1 failures.
tux@iPad:~/programming/exception-notifier(fix-travis)(0)$ echo $?
0

【问题讨论】:

  • 你能发布完整的堆栈跟踪吗?
  • 从文档字符串中删除 X ?
  • 那个x是故意加的,让测试失败。

标签: python doctest


【解决方案1】:

@fossilet 的答案适用于正确破坏测试失败的构建,但它会在 doctest 能够向控制台写入任何内容之前引发异常。这会使您的日志在识别问题方面的用处大大降低。

另一种方法是调用

sys.exit(doctest.testmod()[0])

这使得进程退出代码等于失败的测试数。您的 CI 工具应将非零退出代码解释为失败的构建。但是 doctest 输出仍然会到达控制台。

【讨论】:

    【解决方案2】:

    我发现使用doctest.testmod(raise_on_error=True) 会在测试失败时引发异常,从而导致脚本以非零代码退出。

    Python doc here:

    可选参数 raise_on_error 默认为 false。如果是真的,一个 在第一次失败或意外异常时引发异常 一个例子。这允许对故障进行事后调试。默认 行为是继续运行示例。

    【讨论】:

    • 不幸的是,使用raise_on_error 导致缺少测试输出,所以我切换到基于sys.exit 的解决方案。
    • @geekQ 我将verbose 标志与raise_on_error 结合使用来产生输出,这样可以确定哪个测试失败:doctest.testmod(verbose=True, raise_on_error=True)
    猜你喜欢
    • 2020-10-28
    • 2019-12-21
    • 1970-01-01
    • 2019-02-28
    • 2021-08-23
    • 2019-12-03
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多