13

Python unittest ランナーはすべての例外を処理します。デバッガーでそれらをキャッチしたいと思います。

unittest ランナーにテスト例外を再発生させてプロセスを終了させる方法はありますか? 自分で処理したい。

編集:解決策が見つかりました。

unittest.TestSuite を作成し、debug()を呼び出して、デバッグしたいテストを実行できます。これには、デバッガーで例外をキャッチすることも含まれます!

このパターンで簡単に実行できます。

import unittest

class DebuggableTestCase(unittest.TestCase):
    @classmethod
    def debugTestCase(cls):
        loader = unittest.defaultTestLoader
        testSuite = loader.loadTestsFromTestCase(cls)
        testSuite.debug()

class MyTestCase(DebuggableTestCase):
    def test_function_that_fails(self):
        raise Exception('test')

if __name__ == '__main__':
    MyTestCase.debugTestCase()
4

3 に答える 3

2

質問自体に追加された解決策は、素晴らしいIMOではありません:

  1. PyCharm unittest runner では動作しないため、テストではなくスクリプトとしてのみデバッグできます。
  2. テストの進行状況と結果に関する情報は出力されません。

私の解決策はより「ハック」ですが、欠点については言及していません。また、テストがデバッガーで実行された場合にのみ、テストの動作が変わります。

テストで例外が予期されない場合、 unittest.TestResult.addError が例外ハンドラーで呼び出されます。このメソッドを再定義して、処理中の例外を再発生させます。

このクラスをテスト ケースの親として使用します。

class DebuggableTestCase(unittest.TestCase):
    def __add_error_replacement(self, _, err):
        value, traceback = err[1:]
        raise value.with_traceback(traceback)

    def run(self, result=None):
        if result and sys.gettrace() is not None:
            result.addError = self.__add_error_replacement
        super().run(result)

ソリューションは Python 3.4 および PyCharm 3.4 でテスト済み

于 2014-12-07T18:28:29.200 に答える
1

単体テストが失敗した理由を調べたい場合は、実際に例外を発生させる必要はありません。

例外が発生した行にブレークポイントを設定し、デバッグ モードで実行するだけです。PyCharm はデバッグ画面にドロップし、変数とコール スタックを調べることができます。

于 2012-12-29T12:08:53.920 に答える