2012-03-15 2 views
0

txrdq를 사용하는 프로젝트에서 대기중인 작업이 실패 할 수있는 경우 테스트 (시험 사용) 중이므로 오류가 발생하면 테스트 케이스가 실패로 표시됩니다.ResxDispatchQueue에서 실패한 작업 테스트 시도

대기열에있는 작업이 시작되지 않을 수 있으므로 테스트를 실패하지 않고 trial을 사용하여이 케이스를 테스트하는 방법은 정상적인 동작입니다.

from twisted.trial.unittest import TestCase 
from txrdq.rdq import ResizableDispatchQueue 
from twisted.python.failure import Failure 

class myTestCase(TestCase): 
    def aFailingJob(self, a): 
     return Failure("This is a failure") 

    def setUp(self): 
     self.queue = ResizableDispatchQueue(self.aFailingJob, 1) 

    def tearDown(self): 
     pass 

    def test_txrdq(self): 
     self.queue.put("Some argument", 1) 

답변

1

오류 처리기 단지를 제기하기 때문에 예외가, 기록되고있는 것으로 보인다 :

여기에 테스트 케이스의 예입니다. 나는 정확히 txrdq의 에러 처리 코드가 어떻게 생겼는지 확신 할 수 없다. 그래서 이것은 단지 추측 일 뿐이지 만, 여러분의 관찰에 근거한 꽤 좋은 것 같아요.

시험판이 기록 된 후 해당 예외를 정리하지 않는 한 시험판은 예외를 기록하는 단위 테스트에 실패합니다. 이 다루는 TestCase.flushLoggedErrors(exceptionType)를 사용

def test_txrdq(self): 
    self.queue.put("Some argument", 1) 
    self.assertEqual(1, len(self.flushLoggedErrors(SomeException))) 

은 또한 당신이 Failure("string")을하지 않을 것을 알 수 있습니다. 이것은 raise "string"과 유사합니다. 문자열 예외는 looooong 시간 전부터 Python에서 사용되지 않습니다. 항상 예외 인스턴스와 Failure를 구성 :

class JobError(Exception): 
    pass 

def aFailingJob(self, a): 
    return Failure(JobError("This is a failure")) 

JobErrorflushLoggedErrors에 전달하려는 예외 유형 있습니다.

대기열 처리가 동기식인지 비동기식인지 이해했는지 확인하십시오. 동기이면 테스트 (flushLoggedErrors 호출이 추가됨)가 정상입니다. 비동기식 인 경우, 테스트 메소드가 리턴 할 때까지 오류 핸들러가 실행되지 않았을 수 있습니다. 이 경우 유용한 테스팅을하지 않을 것이며, 플러시를 호출 한 후에 오류가 기록 될 수 있습니다 (플러시를 쓸모 없게 만듭니다).

마지막으로, '' 'txrdq에 대한 단위 테스트를 작성하지 않으면 다음과 같은 테스트를 작성하지 않을 수 있습니다. 실제 txrdq를 사용하지 않고 txrdq-using 코드를 테스트 할 수 있습니다. 일반적인 Queue 객체 (또는 다른 특수화 된 테스트 이중)를 사용하면 응용 프로그램의 단위를보다 정확하게 지정할 수 있으므로 테스트를 더 빠르고 안정적이며 디버깅하기가 쉽습니다.

+0

테스트 케이스에서 Fail (JobError ("This is a failure")) 및 self.assertEqual (1, len (self.flushLoggedErrors (JobError)))를 반환하여 Jean Peal이 여전히 동일한 결과를 얻습니다. 오류 및 assert flushLoggedErrors 호출에 의해 반환 된 이후 실패합니다, 그래서 내가 전에 오류를 플러시 할 수있는 비동기 동작을 수 있습니다. 그래서이 같은 put 메서드를 errback 추가 : self.queue.put (... , 1) .addErrback (self.err)과 err()에서 오류를 플러시합니다. 이제는 오류가 발생하기 전에 오류가 발생하는 것을 볼 수 있지만 여전히 동일한 동작을 얻고 플러시 호출에 의해 0이 반환됩니다. –

0

죄송합니다. 여전히 문제가 발생하고 있습니다. 여기에 무슨 일이 일어나고 있는지 모르겠다. 그러나 나는 그걸 가지고 놀려고 노력하고있다 ...

queue.put 메서드는 Deferred를 반환한다. @exarkun이 설명하는대로 플러시를 수행하기 위해 errback을 첨부 한 다음 테스트에서 지연을 반환 할 수 있습니다. 나는 물건을 고치기를 기대했다. (@ exarkun의 답장을 읽고 @idnar에서 #twisted의 의견을 받았다.) 그러나 도움이되지 않습니다. 내가 볼 수있는 https://gist.github.com/2177560

지금까지, txRDQ가 옳은 일을하고있다 :

는 여기에 내가 일이 될 수있다 생각 언급, 최근 IRC 대화의 비트입니다. 작업이 실패하고 queue.put에 의해 반환 된 지연이 errbacked됩니다.

테스트를 실행 한 후 _trial_temp/test.log를 보면 무엇을 볼 수 있습니까? Unhandled error in Deferred이라는 오류가 표시되고 해당 오류는 작업에 오류가 있음을 나타냅니다. 그래서 그것은 오류가 txRDQ 어딘가에 있다고 생각됩니다.연기 된 것은 실패한 것이고, 실패한 사람은 누구든지 필요로하는 사람에게 잘 전달할뿐 아니라 실패를 반환하기 때문에 재판이 불평을하게됩니다. 그러나 나는 그것이 어디에 있는지 모른다. 테스트를 실행하는 동안 얼마나 많은 지연이 발생했는지 알기 위해 Deferred 클래스의 init에 인쇄물을 넣었습니다. 대답 : 12!

죄송합니다. 좋은 소식이 아닙니다. 계속 누르고 싶으면 txRDQ 코드가 연기 한 모든 것을 살펴보십시오. 그 중 하나가 오류를 반환하는 오류 복구에 실패 했습니까? 나는 그것을 보지 못하며 모든 것이 올바른지 확인하기 위해 그 곳곳에 진술서를 두었습니다. 나는 뭔가를 놓친 것 같아.

감사합니다. 감사합니다. @exarkun.

1

이 문제는 L. Daniel Burr가 (마지막으로!) 해결했습니다. PyPI에는 txRDQ의 새로운 버전 (0.2.14)이 있습니다.

그런데, 테스트에 당신은 from txrdq.job import Job를 추가해야하고이 같은 수행

d = self.queue.put("Some argument", 1) 
return self.assertFailure(d, Job) 

시험이 dJob 인스턴스 실패 있는지 확인됩니다. 이런 종류의 단언을 설명하는 txrdq/test/test_rdq.py의 하단에 몇 가지 새로운 테스트가 있습니다.

죄송합니다.이 문제는 머리가 긁히는 것을 많이 일으켰습니다. 완전히 내 잘못이었습니다.

관련 문제