web-dev-qa-db-ja.com

ユニットテストスクリプトは、テストが失敗した場合でも終了コード= 0を返します

私のテストスクリプトは次のようになります。

_import os
import sys
from unittest import defaultTestLoader as loader, TextTestRunner

path_to_my_project = os.path.dirname(os.path.abspath(__file__)) + '/../'
sys.path.insert(0, path_to_my_project)

suite = loader.discover('my_project')
runner = TextTestRunner()
runner.run(suite)
_

このスクリプトを実行すると、出力は次のようになります。

_$ python3 runtest.py
.....F.....
======================================================================
FAIL: test_insert (fate.test.test_operators.OperatorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/chiel/Projects/tfate/libs/fate/../fate/test/test_operators.py", line 16, in test_insert
    self.assertEqual(expected, self.session.text[:14])
AssertionError: 'Foo import sys$' != 'Foo import sys'
- Foo import sys$
?               -
+ Foo import sys


----------------------------------------------------------------------
Ran 12 tests in 0.030s

FAILED (failures=1)
_

そして終了コードゼロ:

_$ echo $?
0
_

ただし、 python docs は、「デフォルトでは、メインはsys.exit()を呼び出して、テストの実行の成功または失敗を示す終了コードを呼び出します」と述べています。

スクリプトの何が問題になっていますか?

23

コードは unittest.main を使用していません。 TestResult.wasSuccessful を使用して結果を確認し、手動で sys.exit を呼び出す必要があります。

import sys

....

ret = not runner.run(suite).wasSuccessful()
sys.exit(ret)
35
falsetru

TextTestRunnerの結果を取得するときに問題が発生しました。私のような人のために、これがどのように機能するかです:

"""Run all tests inside of *_test.py modules located in the same directory."""


import sys
import unittest


if __name__ == '__main__':
    test_suite = unittest.defaultTestLoader.discover('.', '*_test.py')
    test_runner = unittest.TextTestRunner(resultclass=unittest.TextTestResult)
    result = test_runner.run(test_suite)
    sys.exit(not result.wasSuccessful())
18
AXO