Doctest失败,退出代码为零

Fis*_*tor 7 python doctest

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

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

我的脚本以:

if __name__ == '__main__':
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

输出如下:

**********************************************************************
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
Run Code Online (Sandbox Code Playgroud)

Fis*_*tor 5

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

Python 文档在这里

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


小智 5

@ fossilet的答案适用于正确破坏未通过测试的构建,但在doctest能够向控制台写入任何内容之前它会引发异常.这使得您的日志对于识别问题的作用更小.

另一种方法是打电话

sys.exit(doctest.testmod()[0])
Run Code Online (Sandbox Code Playgroud)

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