Frage

Ich bin mit dem Schreiben von Unit-Tests für eine Reihe von vernetzten Software geschrieben in Python beauftragt. Schreibeinheiten für die Nachrichten Bauherren und andere statische Methoden ist sehr einfach, aber ich habe eine Wand schlagen, wenn es um das Schreiben einen Tests kommt für Netzwerk-Fäden geschlungen.

Zum Beispiel: Der Server verbindet es auf einem beliebigen Port sein könnte, und ich möchte in der Lage sein, die Fähigkeit zu testen, um zahlreiche Anschlüsse (in der Reihenfolge, die nicht parallel) zu verbinden, ohne tatsächlich zahlreiche Servern ausgeführt werden müssen. Was ist ein guter Weg, dies zu nähern? Vielleicht Server Aufbau und Zerstörung Teil des Tests machen? Etwas sagt mir, es muss eine einfachere Antwort, die mir ausweicht.

Ich habe, sich vorzustellen, gibt es Methoden für Einheit vernetzte Fäden zu testen, aber ich kann nicht scheinen zu finden.

War es hilfreich?

Lösung

Ich würde versuchen, eine Fabrik in Ihren bestehenden Code einzuführen, die Socket-Objekte erstellen vorgibt. Dann wird in einem Testdurchlauf in einem Mock-Fabrik, die schafft Mock-Buchsen, die nur so tun, als sie mit einem Server verbunden haben (oder auch nicht für Fehlerfälle, die Sie auch testen wollen, nicht wahr?) Und log den Nachrichtenverkehr zu beweisen dass Ihr Code hat die richtigen Ports verwendet, um die richtigen Arten von Servern zu verbinden.

Versuchen Sie, nicht Threads verwenden nur noch, Tests zu vereinfachen.

Andere Tipps

Es hängt davon ab, wie Sie Ihre Netzwerk-Software ist vielschichtig und wie detailliert Sie Ihre Tests zu sein, aber es ist sicherlich möglich in einigen Szenarien Server-Setup zu machen und -abbau Teil des Tests. Zum Beispiel, wenn ich auf dem Python-Protokollierung Paket funktioniere (bevor es Teil von Python wurde), hatte ich einen Test (I nicht pyunit / unittest verwendet habe - es war nur ein Ad-hoc-Skript), die nach oben abgefeuert (in einer Test) vier Server auf TCP, UDP, HTTP und HTTP / SOAP-Ports, zu hören und dann gesendet, um sie Netzwerkverkehr. Wenn Sie interessiert sind, dann ist die Verteilung hier und die relevanter Testskript im Archiv zu sehen ist log_test.py. Das Python-Logging-Paket hat natürlich seitdem irgendwie kommen, aber das alte Paket ist immer noch um für die Verwendung mit Versionen von Python <2,3 und> = 1.5.2.

Ich habe einige Testfälle, die einen Server in der Setup- und schließen Sie es in der tearDown laufen. Ich weiß nicht, ob es sehr elegante Art und Weise ist, es zu tun, aber es funktioniert die für mich.

Ich bin froh, es zu haben, und es hilft mir sehr.

Wenn der Server init sehr lang ist, wäre eine Alternative mit Ameise zu automatisieren. Ameise liefe / stoppen Sie den Server vor / nach dem die Tests ausgeführt werden.

Siehe hier für sehr interessante Tutorial über Ameise und Python

Sie müßten Mock-Sockets erstellen. Die genaue Art und Weise auf das würde abhängen zu tun, wie Sie Sockets erstellen und einen Buchse Generator zu schaffen wäre eine gute Idee sein. Sie können auch eine spöttische Bibliothek wie pymox Ihr Leben leichter zu machen. Es kann möglicherweise auch die Notwendigkeit zu beseitigen, einen Socket-Generator nur für den alleinigen Zweck der Tests zu erstellen.

Mit pymox, würden Sie so etwas tun:

def test_connect(self):
    m = mox.Mox()
    m.StubOutWithMock(socket, 'socket')
    socket_mock = m.MockAnything()
    m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock)
    socket_mock.connect(('test_server1', 80))
    socket_mock.connect(('test_server2', 81))
    socket_mock.connect(('test_server3', 82))

    m.ReplayAll()
    code_to_be_tested()
    m.VerifyAll()
    m.UnsetStubs()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top