python परीक्षण विफल होने पर भी यूनिट परीक्षा स्क्रिप्ट रिटर्न निकास कोड=0 देता है




unit-testing python-3.x (2)

मेरा परीक्षण स्क्रिप्ट निम्नानुसार दिखता है:

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

हालांकि, अजगर डॉक्स का कहना है कि "डिफ़ॉल्ट रूप से मुख्य कॉल sys.exit() एक एक्जीट कोड के साथ होता है जो परीक्षण की सफलता या विफलता का संकेत देता है।"

मेरी स्क्रिप्ट में क्या गलत है?


मुझे 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())

कोड unittest.main उपयोग नहीं कर रहा है। आपको TestResult.wasSuccessful का उपयोग करके परिणाम की जांच करने और sys.exit मैन्युअल रूप से कॉल करने की आवश्यकता है।

import sys

....

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




exit-code