Search code examples
pythonunit-testingpython-3.xexit-code

Unit test script returns exit code = 0 even if tests fail


My testing script looks as follows:

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)

If I run this script, the output is:

$ 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)

And exit code zero:

$ echo $?
0

However, the Python documentation states that "By default main calls sys.exit() with an exit code indicating success or failure of the tests run."

What is wrong with my script?


Solution

  • The code is not using unittest.main. You need to check the result using TestResult.wasSuccessful and call sys.exit manually.

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