2009-07-23 5 views
1

파이썬의 unittest 모듈은 테스트 된 코드에서 라인의 실행 순서와 정확히 일치하는 오류를보고합니까? 오류로 인해 코드의 변수가 예기치 않게 변경 될 수 있습니까?Python unittest가 즉시 오류를보고합니까?

unittest에서보고 한 KeyError로 인해 당혹 스러웠습니다. 선 자체가 괜찮아 보입니다. 실행이 끝나기 전에 마지막 줄에서 요청한 키의 인쇄를 디버깅하고 사전에 키가 사전에 있음이 표시됩니다. KeyError에서 참조 된 키는 다른 키 였지만 사전에있는 것처럼 보였습니다.

(내부 루프 내부의) 오류 줄 바로 앞에서 외부 반복 횟수를 인쇄하기 위해 외부 변수에 카운터 변수를 삽입했습니다. 예상되는 순서로 출력되지 않습니다. 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 2, 2, 2와 같은 것들이 나옵니다. 1, 2, 2, 2입니다. 그리고 내부 데이터의 인쇄물을 디버깅하면 한 루프에서 다음 루프로 예기치 않은 변경 사항이 표시됩니다.

코드 (많은 디버깅 라인) :

def onSave(screen_data): 
    counter = 0 
    for table, flds_dct in self.target_tables.items(): 
     print 'TABLE %s' % table 
     print 'FIELDS: %s' % flds_dct['fields'] 
     tbl_screen_data = {} 
     for fld in flds_dct['fields']: 
      print 'LOOP TOP' 
      print 'FIELD: %' % fld 
      print 'SCREEN DATA: %s' % screen_data 
      print 'COUNTER: %s' % counter 
      print 'SCREEN DATA OUTPUT: %s' % screen_data[fld] 
      tbl_screen_data[fld] = screen_data[fld] 
      print 'LOOP BOTTOM' 
     self.tables[table].addEntry(tbl_screen_data) 
     counter =+ 1 
     print 'OUTER LOOP BOTTOM' 

그냥 오류 전에,이 출력 :

TABLE: questions 
FIELDS: ['whatIsYourQuest', 'whatIsYourName', 'whatIsTheAirSpeedOfSwallow'] 
LOOP TOP 
FIELD: whatIsYourQuest 
SCREEN DATA: 
{'whatIsYourQuest': 'grail', 
'whatIsYourName': 'arthur', 
'whatIsYourFavouriteColour': 'blue', 
'whatIsTheAirSpeedOfSwallow': 'african or european?', 
'whatIsCapitalOfAssyria': 'Nineveh'} 
    COUNTER: 1 
    SCREEN DATA OUTPUT: grail 
    LOOP BOTTOM 
    OUTER LOOP BOTTOM 

하지만 실행이 중지 나는이 오류 메시지가 얻을 :

line 100, in writeData 
    print 'SCREEN DATA OUTPUT: %s screen_data[fld] 
KeyError: 'whatIsCapitalOfAssyria' 

그러나 오류는 이미 출력을 인쇄 한 행에 기인하며 t 후에 실행을 중지합니다 그는 오류가있는 행 다음에 여러 행을 출력합니다.

앞서 언급했듯이 추가 디버깅은 screen_data의 내용이 루프의 반복을 통해 변경되었음을 보여줍니다. 결정적으로, 전달 된 사전에는 'whatIsCapitalOfAssyria'키가 없습니다.

해당 키가없는 것이 오류의 원인입니다. 어떤 시점에서 코드는 screen_data 사전에 'whatIsCapitalOfAssyria'라고 물었습니다. 대답 할 수 없었기 때문에 물론 죽음의 다리에서 던져진 것입니다. 실패했습니다. 하지만, 화면의 데이터 출력이 인 디버그 라인에서이 키를 가지고있을 때보기가 어려웠습니다. 보고 된 오류 조건은 더 많은 행이 실행될 때까지 발생하지 않으므로 오류에 대한 로컬 값 검사가 혼란 스럽습니다.

그렇다면 unittest는 코드 오류를 어떻게 처리합니까? 여기서 내가 뭘 잘못하고 있니? 이런 종류의 일을 피하려면 어떻게 사용해야합니까?

EDIT : 테스트 된 메소드가 호출을 트리거하는 다른 메소드의 호출을 트리거한다고 추가하면 도움이 될 수 있습니다. 나는 그것들 모두가 합리적으로 잘 테스트되었다고 생각하지만 아마도 상호 연결된 전화의 수는 중요 할 것이다.

+1

아직 수행하지 않은 경우이 코드를 실행중인 디렉토리에서 .pyc 및 .pyo 파일을 모두 삭제하고 다시 시도하십시오. 때로는 이런 설명 할 수없는 결과를 얻을 때 소스와 동기화되지 않은 바이트 코드 파일이 원인입니다 (아주 드물 긴하지만). –

답변

1

나는 모든 출력을 볼 수있는 것과 비교하여 for 루프의 NEXT 레그에서 오류가 발생한다고 생각합니다. 평범한 문자 printprint>>stderr, 문으로 변경하여 버퍼링과 가능한 출력 억제를 시도하십시오 위험하지 않습니다.

+0

나는 그것을 시도 할 것이다. 솔직하게, 나는 이것을 이해하고 싶지만 즉각적인 문제는 해결된다. 그래서 그것이 어떻게 효과가 있었는지보고하기 전에 잠시 동안일지도 모른다. – chernevik