2017-11-26 34 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'특성이 있습니다.
'_ 결과'에는 '오류'라는 목록 유형 속성이 있습니다.
'errors'(오류 [0] [1])의 0 색인의 1 색인은 추적을 포함하는 'sys.exc_info()'출력과 정확히 일치하는 튜플입니다.
이제이 튜플을 사용할 수 있습니다. 'traceback.format_exception()'과 같이 사용할 수 있습니다. 문제가으로 해결되었습니다.

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

개인적으로, 나는 주자 수준에서 이것을 처리 할 것입니다. –