Существует ли способ, в НЕАКТИВНОМ, выполнить PyUnit (unittest модуль) модульные тесты непосредственно?
Я спрашиваю, потому что у меня есть короткий тестовый модуль и когда я работаю, он с Python mymodule.py от Cygwin окружает, я добираюсь, все тесты передали, но когда я использую Выполнение-> Модуль Выполнения от НЕАКТИВНОГО тестовая передача, но затем я получаю исключение (SystemExit: Ложь).
Например, вот демонстрационный тестовый модуль для репродуцирования этого:
#!/usr/bin/python
import unittest
class fooTests(unittest.TestCase):
def setUp(self):
self.foo = "bar"
def testDummyTest(self):
self.assertTrue(True)
def testDummyTestTwo(self):
self.assertEquals("foo", "foo")
def tearDown(self):
self.foo = None
if __name__ == '__main__':
unittest.main()
Когда я выполняю это от оболочки Cygwin с python fooTests.py, это производит:
$ python fooTests.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
Но когда я редактирую fooTests.py в НЕАКТИВНОМ, и я действительно Работаю-> Модуль Выполнения, новый Python Shell, порожденный НЕАКТИВНЫМИ продуктами:
>>> ================================ RESTART ================================
>>>
..
----------------------------------------------------------------------
Ran 2 tests in 0.031s
OK
Traceback (most recent call last):
File "C:\Some\path\info\I\shortened\fooTests.py", line 20, in <module>
unittest.main()
File "C:\Python26\lib\unittest.py", line 817, in __init__
self.runTests()
File "C:\Python26\lib\unittest.py", line 865, in runTests
sys.exit(not result.wasSuccessful())
SystemExit: False
>>>
Что я делаю неправильно, для создания этого traceback, и особенно как я могу зафиксировать его так, чтобы я мог просто сделать Выполнение-> Модуль Выполнения (или F5) в НЕАКТИВНОМ для выполнения модульных тестов быстро?
(Это, конечно, должно быть простым вопросом, но мои быстрые попытки понять это оказались бесплодными.)
Никто не ответил (я считаю, что если в первые несколько минут ответов нет, вероятность ответа значительно снижается :), поэтому Я продолжал исследовать это сам.
Не уверен, что это самое элегантное решение или нет, но изменение:
if __name__ == '__main__':
unittest.main()
на
if __name__ == '__main__':
try: unittest.main()
except SystemExit: pass
, похоже, помогло.
Думаю, проблема в том, что (согласно http://coding.derkeiler.com/Archive/Python/comp.lang.python/2003-11/0239.html ) модуль unittest завершается вызывая sys.exit, что, по-видимому, проблематично для IDLE, поскольку он хочет, чтобы оболочка Python работала, тогда как это не проблема, когда вы запускаете ее из командной строки, которая в любом случае ожидает сбросить вас обратно в уже работающую командную строку.
Я не знаю, является ли это решение, перехватывающее событие SystemExit и его игнорирование, проблематичным, но, похоже, оно работает для проверенных мной случаев прохождения всех тестов и некоторых неудачных тестов.
Также: см. Это сообщение StackOverFlow: Какой код я могу использовать, чтобы проверить, работает ли Python в IDLE? , который предоставляет тест, чтобы увидеть, запускается ли программа из IDLE или нет.