Pregunta

Estoy escribiendo un servidor + cliente Python que los usos gevent.socket para la comunicación. ¿Hay buenas maneras de comprobar el funcionamiento a nivel de zócalo del código (por ejemplo, verificación de que las conexiones SSL con un certificado no válido serán rechazados)? ¿O es simplemente más fácil de spawn un servidor real?

Editar : No creo que "ingenua" burlarse será suficiente para probar los componentes SSL debido a las complejas interacciones involucradas. ¿Me equivoco en eso? ¿O hay una mejor manera de prueba SSL'd cosas?

¿Fue útil?

Solución

Se puede comenzar fácilmente un servidor y luego acceder a ella en un caso de prueba. del GEvent propio conjunto de pruebas hace exactamente eso para el ensayo de GEvent incorporado en los servidores .

Por ejemplo:

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

El uso de 0 para el valor del puerto significa que el servidor utilizará cualquier puerto disponible. Después de que se inicie el servidor, el valor real elegido por bind está disponible como atributo server_port.

soportes StreamServer SSL también, pasar keyfile y certfile argumentos al constructor y se envuelva cada toma de corriente con SSLObject antes de pasarlo a su controlador.

Si usted no utiliza StreamServer y su servidor se basa en Greenlet entonces ciertamente desove es lo que debe hacer. No se olvide de matar que al final del caso de prueba.

A partir de un servidor y un desove greenlet son operaciones rápidas en GEvent , mucho más rápido que la creación de un nuevo proceso o subproceso y usted puede crear fácilmente un nuevo servidor para cada caso de prueba. Eso sí, no se olvide de la limpieza tan pronto como usted no necesita el servidor más.

Creo que no hay necesidad de burlarse de cualquiera de API GEvent, es mucho más fácil simplemente lo utilizan como servidores y clientes pueden felizmente vivo dentro del mismo proceso.

Otros consejos

Hay otra manera (OMI mejor): Usted debe burlarse de la biblioteca que está utilizando. Un ayudante ejemplo de burla para el pitón es mox .

no es necesario un conjunto de servidores con un certificado válido, otro con un certificado no válido, sin soporte SSL en todos, los que no responden a ningún paquete en absoluto, etc Usted puede simular su comportamiento con un "maniquí "socket de cliente. La forma en que trabaja con Mox es Primero "enseñar" lo que debe esperar y cómo debería reaccionar y luego ejecutar su código real en él, mientras que el intercambio de gevent.socket real para el burlado. Se requiere algo de práctica para conseguir la caída de ella, pero vale la pena.

El imitar y stubbing son grandes, pero a veces se necesitan para llevarlo al siguiente nivel de integración. Desde el desove un servidor, incluso uno fakeish, puede tomar algún tiempo, considere un conjunto de pruebas independiente (llamarlos pruebas de integración) podría estar en orden.

"Probarlo como que se va a utilizarlo" es mi guía, y si te burlas y recibo tanto que la prueba se vuelve trivial, que no es tan útil (aunque casi ninguna prueba es mejor que nada). Si usted está preocupado por el manejo de certificados SSL malas, por todos los medios hacer que algunos malos y escribir un accesorio de prueba se les puede alimentar a. Si eso significa que el desove un servidor, que así sea. Tal vez si que le molesta bastante que dará lugar a una refactorización que hará que sea comprobable otra manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top