Unittest вызывает sys.exit()
Независимо от того, что я делаю, 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
>>>
Ответы
Ответ 1
Ваш пример также выходит из моей установки. Я могу заставить его выполнить тесты и остаться внутри Python, изменив
unittest.main()
к
unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))
Более подробная информация доступна здесь в Справочнике по библиотеке Python.
Ответ 2
В новой версии Python 2.7 unittest.main() имеет новый аргумент.
Если для параметра "exit" установлено значение False
, sys.exit()
не вызывается во время выполнения unittest.main()
.
Ответ 3
Не пытайтесь запустить unittest.main()
из IDLE. Он пытается получить доступ к sys.argv
, и он получает аргументы, с которыми был запущен IDLE. Либо запускайте свои тесты по-другому из IDLE, либо вызывайте unittest.main()
в свой собственный процесс Python.
Ответ 4
Покройте исходный код unittest.py
. unittest.main()
жестко запрограммирован на вызов sys.exit()
после запуска всех тестов. Используйте TextTestRunner
для запуска наборов тестов из приглашения.
Ответ 5
Приятно продемонстрировать, что ваши тесты работают, когда вы сначала проверяете модуль unittest и знаете, что вы не выйдете из оболочки Python. Однако эти решения зависят от версии.
Python 2.6
Я использую Python 2.6 на работе, import
ing unittest2 as unittest
(который является модулем unittest
, предположительно найденным в Python 2.7).
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')