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)
Warum verwenden Sie 'threading'? Sie sollten wahrscheinlich ['deferToThread'] (http://twistedmatrix.com/documents/current/api/twisted.internet.threads.deferToThread.html) verwenden. – SingleNegationElimination
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
Ich habe versucht mit deferToThread() und das funktioniert auch ganz gut. Danke für den Zeiger. – d512