Frage

Ich schreibe ein Python-Client + Server, dass Anwendungen für die Kommunikation gevent.socket. Gibt es gute Möglichkeiten zum Testen des Socket-Level-Betriebes des Codes (zum Beispiel, dass SSL-Verbindungen mit einem ungültigen Zertifikat zu überprüfen, wird abgelehnt)? Oder ist es am einfachsten, nur einen realen Server spawn?

Bearbeiten: : Ich glaube nicht, dass „naive“ spöttisch ausreichen, um die SSL-Komponenten zu testen, da der komplexen Wechselwirkungen beteiligt. Bin ich falsch, dass? Oder gibt es einen besseren Weg, um Test SSL'd Sachen?

War es hilfreich?

Lösung

Sie können ganz einfach einen Server starten und darauf zuzugreifen dann in einem Testfall. Die eigene Testsuite tut genau das GEVENT der Einbau-Server .

Zum Beispiel:

class SimpleServer(gevent.server.StreamServer):

    def handle(self, socket, address):
        socket.sendall('hello and goodbye!')

class Test(unittest.TestCase):      

    def test(self):
        server = SimpleServer(('127.0.0.1', 0))
        server.start()
        client = gevent.socket.create_connection(('127.0.0.1', server.server_port))
        response = client.makefile().read()
        assert response == 'hello and goodbye!'
        server.stop()

Mit 0 für den Port-Wert bedeutet, dass der Server alle verfügbaren Port verwenden. Nachdem der Server gestartet wird, gewählt der tatsächliche Wert von bind als server_port Attribut verfügbar ist.

StreamServer unterstützt SSL auch keyfile und certfile Argumente an den Konstruktor übergeben, und es wird jede Steckdose mit SSLObject wickeln, bevor es zu einem Handler übergeben.

Wenn Sie nicht verwenden StreamServer und dem Server basiert auf Greenlet dann in der Tat Laich es ist das, was Sie tun sollten. Vergessen Sie nicht, töten es am Ende des Testfalls.

einen Server starten und Laichen eine greenlet sind schnell Operationen in GEVENT , viel schneller als einen neuen Thread oder Prozess der Erstellung und Sie können ganz einfach einen neuen Server für jeden Testfall erstellen. Vergessen Sie aber nicht zu bereinigen, sobald Sie den Server nicht mehr benötigen.

Ich glaube, es gibt keine Notwendigkeit, jede von GEVENT API zu verspotten, ist es viel einfacher, nur um es zu benutzen, wie Server und Clients können glücklich lebt innerhalb des gleichen Prozesses.

Andere Tipps

Es gibt einen anderen (IMO besser) Weg: Sie können die Bibliothek verspotten sollten Sie verwenden. Ein Beispiel spöttischen Helfer für Python ist mox .

Sie brauchen nicht eine Gruppe von Servern mit einem gültigen Zertifikat, ein anderes mit einem ungültigen Zertifikat, ohne ssl Unterstützung bei alle, diejenigen reagieren nicht auf irgendwelche Pakete überhaupt, etc. Sie können ihr Verhalten mit einem „Dummy simulieren "Client-Socket. So wie es mit Mox funktioniert, ist Sie zuerst „lehren“, was es erwarten sollte und wie sie reagieren und Sie dann auf es Ihren Code ausführen, während die realen gevent.socket für die verspottete eines Swapping. Es erfordert einige Übung, die hängen davon zu bekommen, aber es lohnt sich.

Mocking und Anstoßen sind groß, aber manchmal muss man es auf die nächste Stufe der Integration zu übernehmen. Da ein Server Laichen, sogar eine fakeish ein, kann einige Zeit in Anspruch nehmen, sollten Sie einen separaten Test-Suite (sie Integrationstests nennen) könnte in Ordnung sein.

„Test es, wie Sie wollen, es zu benutzen“ ist meine Leitlinie, und wenn Sie verspotten und Stub so sehr, dass Ihr Test trivial es ist nicht so nützlich (obwohl fast jeder Test ist besser als keine). Wenn Sie über den Umgang mit schlechten SSL-Zertifikate betroffen sind, mit allen Mitteln machen einige schlechte und eine Testvorrichtung schreiben Sie sie füttern können. Wenn das bedeutet, einen Server Laichen, soll es so sein. Vielleicht, wenn diese Fehler, die Sie genug wird es zu einem Refactoring führen, dass es eine andere Art und Weise prüfbar machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top