Domanda

Sto scrivendo un Pitone client+server che utilizza gevent.socket per la comunicazione.Ci sono buoni modi per testare la presa di funzionamento livello di codice (ad esempio, verifica che le connessioni SSL con un certificato non valido verrà rifiutata)?O è più semplice, basta spawn un vero e proprio server?

Modifica:Non credo che "ingenuo" beffardo sarà sufficiente per testare la SSL componenti a causa delle complesse interazioni coinvolte.Sono io che sbaglio in questo?O c'è un modo migliore per testare SSL piacerebbe roba?

È stato utile?

Soluzione

Si può facilmente avviare un server e quindi l'accesso in un caso di test.Il gevent s propria suite di test è proprio quello che fa per il test gevent s built-in server.

Per esempio:

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()

Utilizzando 0 per il valore della porta significa che il server di utilizzare qualsiasi porta disponibile.Una volta avviato il server, l'effettivo valore scelto dall' bind è disponibile come server_port attributo.

StreamServer supporta SSL troppo, passare keyfile e certfile argomenti al costruttore e avvolgere ogni presa con SSLObject prima di passare al gestore.

Se non si utilizza StreamServer e il server è basato su Greenlet allora, infatti, la deposizione delle uova è ciò che si dovrebbe fare.Non dimenticare di uccidere alla fine del test.

Avvio di un server e la generazione di un greenlet sono operazioni veloci in gevent, molto più veloce rispetto alla creazione di un nuovo thread o processo e si può facilmente creare un nuovo server per ogni caso di test.Basta non dimenticare di pulizia non appena non avete bisogno di un server più.

Credo che non c'è bisogno di deridere qualsiasi gevent API, è molto più facile solo per usarlo come server e client possono vivere felicemente all'interno dello stesso processo.

Altri suggerimenti

C'è un altro (IMO migliore) modo: Si dovrebbe prendere in giro la libreria che si sta utilizzando. Un aiutante esempio beffardo per pitone è mox .

Non hai bisogno di un insieme di server con un certificato valido, un altro con un certificato non valido, senza alcun supporto SSL a tutti, quelli che non rispondono alla alcun pacchetto a tutti, ecc Si possono simulare il loro comportamento con un "manichino "socket client. Il modo in cui funziona con Mox è Prima tu "insegnare" che cosa deve aspettarsi e come dovrebbe reagire e quindi ad eseguire il vostro codice reale su di esso, mentre scambiare la vera gevent.socket per quello deriso. Si richiede una certa pratica per ottenere il blocco di esso, ma ne vale la pena.

beffardo e stubbing sono grandi, ma a volte è necessario prendere fino al prossimo livello di integrazione. Dal momento che la deposizione delle uova di un server, anche uno fakeish, può richiedere un certo tempo, prendere in considerazione una suite di test separato (li chiamo test di integrazione) potrebbe essere in ordine.

"Test è come avete intenzione di usarlo" è il mio orientamento, e se si Mock e stub, tanto che il test diventa banale non è così utile (anche se quasi tutti i test è meglio di niente). Se siete preoccupati per la gestione certificati SSL cattivi, con tutti i mezzi fare alcuni cattivi e scrivere un dispositivo di prova è possibile mangiare a. Se questo significa la deposizione delle uova di un server, così sia. Forse se che i bug abbastanza che porterà ad un refactoring che renderà più verificabile in un altro modo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top