使用IDLE运行Python PyUnit单元测试

Chi*_*ael 10 python unit-testing python-idle

在IDLE中,有没有办法直接运行PyUnit(unittest模块)单元测试?

我问,因为我有一个简短的测试模块,当我从Cygwin shell运行python mymodule.py时,我得到了所有测试,但是当我从IDLE使用Run-> Run Module时测试通过,但后来我得到一个异常( 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()
Run Code Online (Sandbox Code Playgroud)

当我使用python fooTests.py从Cygwin shell运行它时,它会产生:

$ python fooTests.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
Run Code Online (Sandbox Code Playgroud)

但是当我在IDLE中编辑fooTests.py并运行Run - > Run Module时,由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
>>> 
Run Code Online (Sandbox Code Playgroud)

我做错了什么,产生这个回溯,特别是如何修复它以便我可以在IDLE中运行Run-> Run Module(或F5)来快速运行单元测试?

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

Chi*_*ael 8

没有人回答(我发现如果前几分钟没有任何答案,答案的可能性会大大降低:),所以我一直在研究这个问题.

不确定这是否是最优雅的解决方案,但更改:

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

if __name__ == '__main__':
    try: unittest.main()
    except SystemExit: pass
Run Code Online (Sandbox Code Playgroud)

似乎做了伎俩.

我想问题是(根据http://coding.derkeiler.com/Archive/Python/comp.lang.python/2003-11/0239.html),unittest模块通过调用sys.exit完成,这显然有问题对于IDLE,因为它想要保持Python shell的运行,而当你从命令行运行它时不会出现问题,而命令行无论如何都希望将你转发回已经运行的命令行.

我不知道这个解决方案,捕获SystemExit事件并忽略它是否有问题,但它似乎适用于我检查的所有测试通过和一些测试失败的情况.

另外:请参阅此StackOverFlow帖子:我可以用什么代码来检查Python是否在IDLE中运行?,它提供了一个测试,以查看程序是否在IDLE内运行.


小智 7

你也可以

if __name__ == '__main__':
    unittest.main(exit=False)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python> = 2.7