10

IDLE 内で、PyUnit (ユニットテスト モジュール) 単体テストを直接実行する方法はありますか?

短いテスト モジュールがあり、Cygwin シェルから 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()

python fooTests.py を使用して Cygwin シェルからこれを実行すると、次のようになります。

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

OK

しかし、IDLE 内で fooTests.py を編集していて、[実行] -> [モジュールの実行] を実行すると、IDLE によって生成された新しい Python シェルが生成されます。

>>> ================================ 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 シェルを実行し続けたいためです。一方、コマンド ラインから実行する場合は問題ありません。いずれにせよ、既に実行中のコマンド ラインにダンプされることを期待しています。

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 に答える