【问题标题】:Unittest causing sys.exit()单元测试导致 sys.exit()
【发布时间】:2008-09-17 03:46:55
【问题描述】:

无论我做什么 sys.exit() 都会被 unittest 调用,即使是最琐碎的例子。我不知道我的安装是搞砸了还是发生了什么。

IDLE 1.2.2      ==== No Subprocess ====
>>> import unittest
>>> 
>>> class Test(unittest.TestCase):
        def testA(self):
            a = 1
            self.assertEqual(a,1)

>>> unittest.main()
option -n not recognized
Usage: idle.pyw [options] [test] [...]

Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output

 Examples:
   idle.pyw                               - run default set of tests
   idle.pyw MyTestSuite                   - run suite 'MyTestSuite'
   idle.pyw MyTestCase.testSomething      - run MyTestCase.testSomething
   idle.pyw MyTestCase                    - run all 'test*' test methods
                                           in MyTestCase

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    unittest.main()
  File "E:\Python25\lib\unittest.py", line 767, in __init__
    self.parseArgs(argv)
  File "E:\Python25\lib\unittest.py", line 796, in parseArgs
    self.usageExit(msg)
  File "E:\Python25\lib\unittest.py", line 773, in usageExit
    sys.exit(2)
SystemExit: 2
>>> 

【问题讨论】:

    标签: python unit-testing


    【解决方案1】:

    在新的 Python 2.7 版本中,unittest.main() 有一个新参数。

    如果'exit'设置为Falsesys.exit()unittest.main()的执行过程中不会被调用。

    【讨论】:

    • 谢谢!仅作记录: if name == 'main': unittest.main(exit=False)
    【解决方案2】:

    您的示例也在我的安装中退出。我可以通过更改使其执行测试并留在 Python 中

    unittest.main()
    

    unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))
    

    更多信息请参阅 Python 库参考中的here

    【讨论】:

      【解决方案3】:

      不要尝试从 IDLE 运行 unittest.main()。它正在尝试访问sys.argv,并且正在获取 IDLE 开始时使用的参数。以不同于 IDLE 的方式运行测试,或者在其自己的 Python 进程中调用 unittest.main()

      【讨论】:

      • 然后致电yourParser.parse_args(args=testArgs)sys.argv 根本不需要参与。
      • 我想不出不能从解释器或测试主程序调用 unittest.main() 的充分理由。你能帮帮我吗?
      【解决方案4】:

      Pop 打开源代码到unittest.pyunittest.main() 被硬编码为在运行所有测试后调用 sys.exit()。使用TextTestRunner 在提示符下运行测试套件。

      【讨论】:

        【解决方案5】:

        很高兴能够在第一次尝试 unittest 模块时证明您的测试有效,并且知道您不会退出 Python shell。但是,这些解决方案取决于版本。

        Python 2.6

        我在工作中使用 Python 2.6,importing unittest2 as unittest(据说是在 Python 2.7 中找到的 unittest 模块)。

        unittest.main(exit=False) 在 Python 2.6 的 unittest2 中不起作用,而 JoeSkora 的解决方案可以,重申一下:

        unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))
        

        要将其分解为组件和默认参数,并为各种组合对象使用正确的语义名称:

        import sys # sys.stderr is used in below default args
        
        test_loader = unittest.TestLoader()
        loaded_test_suite = test_loader.loadTestsFromTestCase(Test)
                                                   # Default args:
        text_test_runner = unittest.TextTestRunner(stream=sys.stderr,
                                                   descriptions=True, 
                                                   verbosity=1)
        text_test_runner.run(loaded_test_suite)
        

        Python 2.7 和 3

        在 Python 2.7 及更高版本中,以下应该可以工作。

        unittest.main(exit=False)
        

        【讨论】:

          【解决方案6】:
          try:
              sys.exit()
          except SystemExit:
              print('Simple as that, but you should really use a TestRunner instead')
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-09-30
            • 2012-11-21
            • 1970-01-01
            • 2018-03-31
            • 2021-05-08
            • 2013-03-18
            • 2018-12-02
            相关资源
            最近更新 更多