使用IDLE运行Python PyUnit单元测试

时间:2010-03-16 18:30:50

标签: python unit-testing python-idle

在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)来快速运行单元测试?

(这肯定是一个简单的问题,但我快速尝试解决这个问题已经证明没有结果。)

3 个答案:

答案 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,它对我有用。