8

私のテスト コードでは、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
4

2 に答える 2

6

@fossilet の回答は、テストに失敗したビルドを適切に壊すために機能しますが、doctest がコンソールに何かを書き込む前に例外が発生します。これにより、問題を特定する上でのログの有用性が大幅に低下します。

別の方法は、呼び出すことです

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

これにより、プロセスの終了コードが、失敗したテストの数と等しくなります。CI ツールは、ゼロ以外の終了コードをビルドの失敗として解釈する必要があります。ただし、doctest の出力は引き続きコンソールに表示されます。

于 2014-09-05T18:37:29.507 に答える
3

を使用doctest.testmod(raise_on_error=True)すると、テストが失敗したときに例外が発生し、スクリプトがゼロ以外のコードで終了することがわかりました。

ここにPythonドキュメント

オプションの引数のraise_on_errorデフォルトは false です。true の場合、例での最初の失敗または予期しない例外で例外が発生します。これにより、失敗を事後分析でデバッグできます。デフォルトの動作は、例の実行を続行することです。

于 2013-09-13T10:01:47.147 に答える