2017-11-26 15 views
0

私は外部ファイルに実行するすべての失敗したテストのすべての例外のすべてのトレースバックを保存します。 すべてのテストでtryとexceptを使用するのではなく、unittestのtearDownを使用したいので、より一般的になります。以下のようなtearDown()関数で失敗したテスト(unittest)のトレースバックを取得する方法

何か:

import traceback 
import unittest 

class SomeTestCase(unittest.TestCase): 
    def setUp(self): 
     pass 

    def test_some_test(self): 
     self.assertTrue(False) 

    def tearDown(self): 
     with open(logger.txt, 'a') as doc: 
      doc.write(traceback.format_exc()) 

問題は、あなたがtest_some_testに入る例外がティアダウン(tracebackeリターンなし)

どんな提案でトレースバックと呼ばれることカントということでしょうか?

+0

すべての例外は「TestResult」に記録されています。 ['TestResult.addFailure()'](https://docs.python.org/3/library/unittest.html#unittest.TestResult.addFailure)を参照してください。 –

答えて

0

私がunittestコードの大きな部分を調べた後、私は解決策を見つけました!

TestCaseクラスには '_outcome'属性があります。
'_outcome'には 'errors'というリストタイプの属性があります。
'errors'(errors [0] [1])の0インデックスの1インデックスは、トレースバックを含む 'sys.exc_info()'出力とまったく同じタプルです。
今私はこの組を持っているので、 'traceback.format_exception()'と同じように 'traceback.format_exc()'を使い、の問題を解決しました。です。

def tearDown(self): 
    try: 
     etype, value, tb = self._outcome.errors[0][1] 
     trace = ''.join(traceback.format_exception(etype=etype, value=value, tb=tb, limit=None)) 
     date = '{date}\n'.format(date=str(datetime.datetime.now())) 
     name = '\n' + self._testMethodName + '-\n' 
     with open(self.logger, 'a') as doc: 
      doc.write(name + date + trace) 
    except: 
     pass 
+0

はい、 '_outcome'は現在の' TestResult'インスタンスです。 –

+0

個人的には、私はランナーレベルでこれを処理したいと思います。 –

関連する問題