2012-04-15 11 views
1

Ich bin ziemlich neu zu verdreht und ich versuche, einige Unit-Tests mit dem Test-Test-Framework zu schreiben. Meine Tests laufen und passieren wie erwartet, aber aus irgendeinem Grund hängt der Test zwischen den Tests. Ich muss CTRL + C nach jedem Test treffen, um es zum nächsten zu bewegen. Ich schätze, ich habe etwas falsch konfiguriert oder ich rufe nicht eine Methode an, die ich sein sollte, um zu sagen, dass der Test durchgeführt wird. HierTwisted Test hängt zwischen den Tests

ist die Klasse im Test:

from twisted.internet import reactor, defer 
import threading 
import time 


class SomeClass: 
    def doSomething(self): 
     return self.asyncMethod() 

    def asyncMethod(self): 
     d = defer.Deferred() 
     t = SomeThread(d) 
     t.start() 
     return d 


class SomeThread(threading.Thread): 
    def __init__(self, d): 
     super(SomeThread, self).__init__() 
     self.d = d 

    def run(self): 
     time.sleep(2) # pretend to do something 
     retVal = 123 
     self.d.callback(retVal) 

Hier ist die Unit-Test-Klasse:

from twisted.trial import unittest 
import tested 


class SomeTest(unittest.TestCase): 
    def testOne(self): 
     sc = tested.SomeClass() 
     d = sc.doSomething() 
     return d.addCallback(self.allDone) 

    def allDone(self, retVal): 
     self.assertEquals(retVal, 123) 

    def testTwo(self): 
     sc = tested.SomeClass() 
     d = sc.doSomething() 
     return d.addCallback(self.allDone2) 

    def allDone2(self, retVal): 
     self.assertEquals(retVal, 123) 

Dies ist, was die Befehlszeile Ausgabe wie folgt aussieht:

me$ trial test.py 
test 
    SomeTest 
    testOne ... ^C               [OK] 
    testTwo ... ^C               [OK] 

------------------------------------------------------------------------------- 
Ran 2 tests in 8.499s 

PASSED (successes=2) 
+1

Warum verwenden Sie 'threading'? Sie sollten wahrscheinlich ['deferToThread'] (http://twistedmatrix.com/documents/current/api/twisted.internet.threads.deferToThread.html) verwenden. – SingleNegationElimination

+0

Das Problem scheint etwas mit dem Schlaf in Verbindung zu haben das Gewinde. Wenn ich den Faden verlasse und den Schlaf aushalte, funktioniert es. Ich habe es auch zum Laufen gebracht, indem ich das Threading komplett weggenommen habe und stattdessen reactor.callLater() benutzt habe. Kann jemand erklären, warum die Threads dieses Problem verursachen? Ich wollte nur eine lange Operation wie eine Datenbankabfrage simulieren. – d512

+0

Ich habe versucht mit deferToThread() und das funktioniert auch ganz gut. Danke für den Zeiger. – d512

Antwort

1

I erraten Ihr Problem hat mit Ihren Threads zu tun. Twisted ist nicht thread-sicher, und wenn Sie mit Threads interagieren müssen, sollten Sie den Reaktor die Dinge handhaben lassen, indem Sie deferToThread, callInThread, callFromThread verwenden. Informationen dazu, wie man mit Twisted threadsicher ist, finden Sie unter here.