代码之家  ›  专栏  ›  技术社区  ›  chtenb

即使测试失败,单元测试脚本也返回退出代码=0

  •  32
  • chtenb  · 技术社区  · 10 年前

    我的测试脚本如下所示:

    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)
    

    退出代码0:

    $ echo $?
    0
    

    然而 Python documentation 声明“默认情况下,主调用 sys.exit() 其中退出代码指示测试运行的成功或失败。"

    我的剧本有什么问题?

    2 回复  |  直到 4 年前
        1
  •  43
  •   falsetru    10 年前

    代码未使用 unittest.main 。您需要使用 TestResult.wasSuccessful 并呼叫 sys.exit 手动。

    import sys
    
    ....
    
    ret = not runner.run(suite).wasSuccessful()
    sys.exit(ret)
    
        2
  •  25
  •   AXO    8 年前

    我遇到了一些麻烦 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())