在IDLE中,有没有办法直接运行PyUnit(unittest模块)单元测试?
我问,因为我有一个简短的测试模块,当我从Cygwin shell运行python mymodule.py时,我得到所有测试通过,但是当我使用Run->从IDLE运行模块时测试通过然后我得到一个异常(SystemExit:False)。
例如,这是一个重现此示例的示例测试模块:
#!/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()
当我使用python fooTests.py从Cygwin shell运行它时,它会生成:
$ python fooTests.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
但是当我在IDLE中编辑fooTests.py时,我会运行 - >运行模块,由IDLE生成的新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
>>>
我做错了什么,产生这种追溯,特别是如何修复它以便我可以在IDLE中运行Run-&gt;运行模块(或F5)来快速运行单元测试?
(这肯定是一个简单的问题,但我快速尝试解决这个问题已经证明没有结果。)
答案 0 :(得分:8)
没有人回答(我发现如果前几分钟没有任何答案,答案的可能性会大大降低:),所以我一直在研究这个问题。
不确定这是否是最优雅的解决方案,而是更改:
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 shell运行,而当你运行时它不是问题从命令行运行它,无论如何都希望将您转储回已经运行的命令行。
我不知道这个解决方案,捕获SystemExit事件并忽略它,是否有问题,但它似乎适用于我检查的所有测试通过和一些测试失败的情况。
另外:请参阅此StackOverFlow Post:What code can I use to check if Python is running in IDLE?,它提供了一个测试,以查看程序是否在IDLE内运行。
答案 1 :(得分:8)
您也可以
if __name__ == '__main__':
unittest.main(exit=False)
如果您使用的是Python&gt; = 2.7
答案 2 :(得分:1)
这样的事情也应该有效:
suite = unittest.TestLoader().loadTestsFromTestCase( fooTests )
unittest.TextTestRunner(verbosity=2).run( suite )
我发现here,它对我有用。