10

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

我问是因为我有一个简短的测试模块,当我使用 Cygwin shell 中的 python mymodule.py 运行它时,我通过了所有测试,但是当我从 IDLE 使用 Run->Run Module 时,测试通过了,但是我得到了一个异常(系统退出:假)。

例如,这里有一个示例测试模块来重现这个:

#!/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 并执行 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
>>> 

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

(这肯定是一个简单的问题,但我快速弄清楚它的尝试被证明是徒劳的。)

4

3 回答 3

9

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

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

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 帖子:我可以使用哪些代码来检查 Python 是否在 IDLE 中运行?,它提供了一个测试来查看程序是否在 IDLE 中运行。

于 2010-03-16T19:04:32.653 回答
7

你也可以做

if __name__ == '__main__':
    unittest.main(exit=False)

如果你使用 Python >= 2.7

于 2012-02-04T11:46:06.833 回答
1

像这样的东西也应该起作用:

suite = unittest.TestLoader().loadTestsFromTestCase( fooTests )
unittest.TextTestRunner(verbosity=2).run( suite )

我在这里找到了,它对我有用。

于 2010-09-12T18:11:00.020 回答