Unittest вызывает sys.exit () - PullRequest
       10

Unittest вызывает sys.exit ()

17 голосов
/ 17 сентября 2008

Независимо от того, что я делаю 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
>>> 

Ответы [ 6 ]

26 голосов
/ 09 июля 2010

В новой версии Python 2.7 unittest.main () имеет новый аргумент.

Если для 'exit' установлено значение False, sys.exit() не вызывается во время выполнения unittest.main().

13 голосов
/ 17 сентября 2008

Ваш пример выходит из моей установки тоже. Я могу заставить его выполнить тесты и остаться в Python, изменив

unittest.main()

до

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

Более подробная информация доступна здесь в Справочнике по библиотеке Python.

10 голосов
/ 17 сентября 2008

Не пытайтесь запустить unittest.main() из IDLE. Он пытается получить доступ к sys.argv и получает аргументы, с которых был запущен IDLE. Либо запустите ваши тесты иначе, чем IDLE, либо вызовите unittest.main() в своем собственном процессе Python.

5 голосов
/ 21 января 2014

Приятно иметь возможность продемонстрировать, что ваши тесты работают при первом испытании модуля unittest, и знать, что вы не выйдете из своей оболочки Python. Однако эти решения зависят от версии.

Python 2.6

Я использую Python 2.6 на работе, import ing unittest2 as unittest (это модуль unittest, предположительно найденный в Python 2.7).

unittest.main(exit=False) не работает в unittest2 в Python 2.6, в то время как решение 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)
5 голосов
/ 17 сентября 2008

Откройте открытый код для unittest.py. unittest.main() жестко запрограммирован для вызова sys.exit() после выполнения всех тестов. Используйте TextTestRunner для запуска тестовых наборов из приглашения.

1 голос
/ 02 января 2009
try:
    sys.exit()
except SystemExit:
    print('Simple as that, but you should really use a TestRunner instead')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...